| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| index 48142e6e57f8d5edfd193110a96c226fb54895eb..2b792130c00fe8cfa55c2bff58e1790879ceacc6 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -407,7 +407,10 @@ class BackRenderbuffer {
|
| void Create();
|
|
|
| // Set the initial size and format of a render buffer or resize it.
|
| - bool AllocateStorage(const gfx::Size& size, GLenum format, GLsizei samples);
|
| + bool AllocateStorage(const FeatureInfo* feature_info,
|
| + const gfx::Size& size,
|
| + GLenum format,
|
| + GLsizei samples);
|
|
|
| // Destroy the render buffer. This must be explicitly called before destroying
|
| // this object.
|
| @@ -627,7 +630,25 @@ class GLES2DecoderImpl : public GLES2Decoder,
|
| virtual void OnTextureRefDetachedFromFramebuffer(
|
| TextureRef* texture) OVERRIDE;
|
|
|
| - static bool IsAngle();
|
| + // Helpers to facilitate calling into compatible extensions.
|
| + static void RenderbufferStorageMultisampleHelper(
|
| + const FeatureInfo* feature_info,
|
| + GLenum target,
|
| + GLsizei samples,
|
| + GLenum internal_format,
|
| + GLsizei width,
|
| + GLsizei height);
|
| +
|
| + void BlitFramebufferHelper(GLint srcX0,
|
| + GLint srcY0,
|
| + GLint srcX1,
|
| + GLint srcY1,
|
| + GLint dstX0,
|
| + GLint dstY0,
|
| + GLint dstX1,
|
| + GLint dstY1,
|
| + GLbitfield mask,
|
| + GLenum filter);
|
|
|
| private:
|
| friend class ScopedFrameBufferBinder;
|
| @@ -1804,13 +1825,16 @@ ScopedResolvedFrameBufferBinder::ScopedResolvedFrameBufferBinder(
|
| const int width = decoder_->offscreen_size_.width();
|
| const int height = decoder_->offscreen_size_.height();
|
| glDisable(GL_SCISSOR_TEST);
|
| - if (GLES2DecoderImpl::IsAngle()) {
|
| - glBlitFramebufferANGLE(0, 0, width, height, 0, 0, width, height,
|
| - GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
| - } else {
|
| - glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height,
|
| - GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
| - }
|
| + decoder->BlitFramebufferHelper(0,
|
| + 0,
|
| + width,
|
| + height,
|
| + 0,
|
| + 0,
|
| + width,
|
| + height,
|
| + GL_COLOR_BUFFER_BIT,
|
| + GL_NEAREST);
|
| glBindFramebufferEXT(GL_FRAMEBUFFER, targetid);
|
| }
|
|
|
| @@ -1962,7 +1986,9 @@ void BackRenderbuffer::Create() {
|
| glGenRenderbuffersEXT(1, &id_);
|
| }
|
|
|
| -bool BackRenderbuffer::AllocateStorage(const gfx::Size& size, GLenum format,
|
| +bool BackRenderbuffer::AllocateStorage(const FeatureInfo* feature_info,
|
| + const gfx::Size& size,
|
| + GLenum format,
|
| GLsizei samples) {
|
| ScopedGLErrorSuppressor suppressor(
|
| "BackRenderbuffer::AllocateStorage", state_->GetErrorState());
|
| @@ -1984,19 +2010,12 @@ bool BackRenderbuffer::AllocateStorage(const gfx::Size& size, GLenum format,
|
| size.width(),
|
| size.height());
|
| } else {
|
| - if (GLES2DecoderImpl::IsAngle()) {
|
| - glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER,
|
| - samples,
|
| - format,
|
| - size.width(),
|
| - size.height());
|
| - } else {
|
| - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER,
|
| - samples,
|
| - format,
|
| - size.width(),
|
| - size.height());
|
| - }
|
| + GLES2DecoderImpl::RenderbufferStorageMultisampleHelper(feature_info,
|
| + GL_RENDERBUFFER,
|
| + samples,
|
| + format,
|
| + size.width(),
|
| + size.height());
|
| }
|
| bool success = glGetError() == GL_NO_ERROR;
|
| if (success) {
|
| @@ -2094,14 +2113,6 @@ GLES2Decoder* GLES2Decoder::Create(ContextGroup* group) {
|
| return new GLES2DecoderImpl(group);
|
| }
|
|
|
| -bool GLES2DecoderImpl::IsAngle() {
|
| -#if defined(OS_WIN)
|
| - return gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2;
|
| -#else
|
| - return false;
|
| -#endif
|
| -}
|
| -
|
| GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group)
|
| : GLES2Decoder(),
|
| group_(group),
|
| @@ -2303,7 +2314,7 @@ bool GLES2DecoderImpl::Initialize(
|
| // ANGLE only supports packed depth/stencil formats, so use it if it is
|
| // available.
|
| const bool depth24_stencil8_supported =
|
| - context_->HasExtension("GL_OES_packed_depth_stencil");
|
| + feature_info_->feature_flags().packed_depth24_stencil8;
|
| VLOG(1) << "GL_OES_packed_depth_stencil "
|
| << (depth24_stencil8_supported ? "" : "not ") << "supported.";
|
| if ((attrib_parser.depth_size_ > 0 || attrib_parser.stencil_size_ > 0) &&
|
| @@ -2326,7 +2337,7 @@ bool GLES2DecoderImpl::Initialize(
|
| // it's available, as some desktop GL drivers don't support any non-packed
|
| // formats for depth attachments.
|
| const bool depth24_stencil8_supported =
|
| - context_->HasExtension("GL_EXT_packed_depth_stencil");
|
| + feature_info_->feature_flags().packed_depth24_stencil8;
|
| VLOG(1) << "GL_EXT_packed_depth_stencil "
|
| << (depth24_stencil8_supported ? "" : "not ") << "supported.";
|
|
|
| @@ -3321,7 +3332,7 @@ bool GLES2DecoderImpl::ResizeOffscreenFrameBuffer(const gfx::Size& size) {
|
| DCHECK(offscreen_target_color_format_);
|
| if (IsOffscreenBufferMultisampled()) {
|
| if (!offscreen_target_color_render_buffer_->AllocateStorage(
|
| - offscreen_size_, offscreen_target_color_format_,
|
| + feature_info_, offscreen_size_, offscreen_target_color_format_,
|
| offscreen_target_samples_)) {
|
| LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed "
|
| << "to allocate storage for offscreen target color buffer.";
|
| @@ -3337,7 +3348,7 @@ bool GLES2DecoderImpl::ResizeOffscreenFrameBuffer(const gfx::Size& size) {
|
| }
|
| if (offscreen_target_depth_format_ &&
|
| !offscreen_target_depth_render_buffer_->AllocateStorage(
|
| - offscreen_size_, offscreen_target_depth_format_,
|
| + feature_info_, offscreen_size_, offscreen_target_depth_format_,
|
| offscreen_target_samples_)) {
|
| LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed "
|
| << "to allocate storage for offscreen target depth buffer.";
|
| @@ -3345,7 +3356,7 @@ bool GLES2DecoderImpl::ResizeOffscreenFrameBuffer(const gfx::Size& size) {
|
| }
|
| if (offscreen_target_stencil_format_ &&
|
| !offscreen_target_stencil_render_buffer_->AllocateStorage(
|
| - offscreen_size_, offscreen_target_stencil_format_,
|
| + feature_info_, offscreen_size_, offscreen_target_stencil_format_,
|
| offscreen_target_samples_)) {
|
| LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFrameBuffer failed "
|
| << "to allocate storage for offscreen target stencil buffer.";
|
| @@ -4997,14 +5008,54 @@ void GLES2DecoderImpl::DoBlitFramebufferCHROMIUM(
|
| }
|
|
|
| glDisable(GL_SCISSOR_TEST);
|
| - if (IsAngle()) {
|
| + BlitFramebufferHelper(
|
| + srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
|
| + EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test);
|
| +}
|
| +
|
| +void GLES2DecoderImpl::RenderbufferStorageMultisampleHelper(
|
| + const FeatureInfo* feature_info,
|
| + GLenum target,
|
| + GLsizei samples,
|
| + GLenum internal_format,
|
| + GLsizei width,
|
| + GLsizei height) {
|
| + // TODO(sievers): This could be resolved at the GL binding level, but the
|
| + // binding process is currently a bit too 'brute force'.
|
| + if (feature_info->feature_flags().is_angle) {
|
| + glRenderbufferStorageMultisampleANGLE(
|
| + target, samples, internal_format, width, height);
|
| + } else if (feature_info->feature_flags().use_core_framebuffer_multisample) {
|
| + glRenderbufferStorageMultisample(
|
| + target, samples, internal_format, width, height);
|
| + } else {
|
| + glRenderbufferStorageMultisampleEXT(
|
| + target, samples, internal_format, width, height);
|
| + }
|
| +}
|
| +
|
| +void GLES2DecoderImpl::BlitFramebufferHelper(GLint srcX0,
|
| + GLint srcY0,
|
| + GLint srcX1,
|
| + GLint srcY1,
|
| + GLint dstX0,
|
| + GLint dstY0,
|
| + GLint dstX1,
|
| + GLint dstY1,
|
| + GLbitfield mask,
|
| + GLenum filter) {
|
| + // TODO(sievers): This could be resolved at the GL binding level, but the
|
| + // binding process is currently a bit too 'brute force'.
|
| + if (feature_info_->feature_flags().is_angle) {
|
| glBlitFramebufferANGLE(
|
| srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
|
| + } else if (feature_info_->feature_flags().use_core_framebuffer_multisample) {
|
| + glBlitFramebuffer(
|
| + srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
|
| } else {
|
| glBlitFramebufferEXT(
|
| srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
|
| }
|
| - EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test);
|
| }
|
|
|
| bool GLES2DecoderImpl::ValidateRenderbufferStorageMultisample(
|
| @@ -5074,13 +5125,8 @@ void GLES2DecoderImpl::DoRenderbufferStorageMultisampleCHROMIUM(
|
| internalformat);
|
| LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(
|
| "glRenderbufferStorageMultisampleCHROMIUM");
|
| - if (IsAngle()) {
|
| - glRenderbufferStorageMultisampleANGLE(
|
| - target, samples, impl_format, width, height);
|
| - } else {
|
| - glRenderbufferStorageMultisampleEXT(
|
| - target, samples, impl_format, width, height);
|
| - }
|
| + RenderbufferStorageMultisampleHelper(
|
| + feature_info_, target, samples, impl_format, width, height);
|
| GLenum error =
|
| LOCAL_PEEK_GL_ERROR("glRenderbufferStorageMultisampleCHROMIUM");
|
| if (error == GL_NO_ERROR) {
|
| @@ -5220,7 +5266,8 @@ bool GLES2DecoderImpl::VerifyMultisampleRenderbufferIntegrity(
|
| glBindFramebufferEXT(GL_READ_FRAMEBUFFER, validation_fbo_multisample_);
|
| glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, validation_fbo_);
|
|
|
| - glBlitFramebufferEXT(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
| + BlitFramebufferHelper(
|
| + 0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
|
|
| // Read a pixel from the buffer.
|
| glBindFramebufferEXT(GL_FRAMEBUFFER, validation_fbo_);
|
| @@ -8851,7 +8898,7 @@ void GLES2DecoderImpl::DoSwapBuffers() {
|
| // Ensure the side effects of the copy are visible to the parent
|
| // context. There is no need to do this for ANGLE because it uses a
|
| // single D3D device for all contexts.
|
| - if (!IsAngle())
|
| + if (!feature_info_->feature_flags().is_angle)
|
| glFlush();
|
| }
|
| } else {
|
|
|