diff options
author | sievers@chromium.org <sievers@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-31 18:08:01 +0000 |
---|---|---|
committer | sievers@chromium.org <sievers@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-31 18:08:01 +0000 |
commit | 680aa41d3d4268f1930d8b71e99611e473fe179a (patch) | |
tree | 434b5c3bed08e53b9ca500b2d0838d6625284304 | |
parent | 3a6b0022bab9250abd91b7ae085451f4dc7f4495 (diff) | |
download | chromium_src-680aa41d3d4268f1930d8b71e99611e473fe179a.zip chromium_src-680aa41d3d4268f1930d8b71e99611e473fe179a.tar.gz chromium_src-680aa41d3d4268f1930d8b71e99611e473fe179a.tar.bz2 |
Don't call into driver for unsupported extensions.
Check extension availability for glDiscardFramebufferEXT()
and glBlitFramebufferEXT().
Adds some tests for glDiscardFramebuffer() also.
Review URL: https://codereview.chromium.org/46673007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@232165 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | gpu/command_buffer/service/feature_info.cc | 4 | ||||
-rw-r--r-- | gpu/command_buffer/service/feature_info.h | 1 | ||||
-rw-r--r-- | gpu/command_buffer/service/feature_info_unittest.cc | 9 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 8 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc | 56 |
5 files changed, 77 insertions, 1 deletions
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index 6e6b363..9329bc5 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc @@ -122,7 +122,8 @@ FeatureInfo::FeatureFlags::FeatureFlags() ext_draw_buffers(false), ext_frag_depth(false), use_async_readpixels(false), - map_buffer_range(false) { + map_buffer_range(false), + ext_discard_framebuffer(false) { } FeatureInfo::Workarounds::Workarounds() : @@ -697,6 +698,7 @@ void FeatureInfo::InitializeFeatures() { !workarounds_.disable_ext_discard_framebuffer) { // DiscardFramebufferEXT is automatically bound to InvalidateFramebuffer. AddExtensionString("GL_EXT_discard_framebuffer"); + feature_flags_.ext_discard_framebuffer = true; } } diff --git a/gpu/command_buffer/service/feature_info.h b/gpu/command_buffer/service/feature_info.h index 7d5041f..1b0fc77 100644 --- a/gpu/command_buffer/service/feature_info.h +++ b/gpu/command_buffer/service/feature_info.h @@ -51,6 +51,7 @@ class GPU_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> { bool ext_frag_depth; bool use_async_readpixels; bool map_buffer_range; + bool ext_discard_framebuffer; }; struct Workarounds { diff --git a/gpu/command_buffer/service/feature_info_unittest.cc b/gpu/command_buffer/service/feature_info_unittest.cc index c5e8301..5b07106 100644 --- a/gpu/command_buffer/service/feature_info_unittest.cc +++ b/gpu/command_buffer/service/feature_info_unittest.cc @@ -116,6 +116,7 @@ TEST_F(FeatureInfoTest, Basic) { EXPECT_FALSE(info_->feature_flags().native_vertex_array_object); EXPECT_FALSE(info_->feature_flags().map_buffer_range); EXPECT_FALSE(info_->feature_flags().use_async_readpixels); + EXPECT_FALSE(info_->feature_flags().ext_discard_framebuffer); #define GPU_OP(type, name) EXPECT_FALSE(info_->workarounds().name); GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP) @@ -850,6 +851,12 @@ TEST_F(FeatureInfoTest, InitializeEXT_frag_depth) { EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_frag_depth")); } +TEST_F(FeatureInfoTest, InitializeEXT_discard_framebuffer) { + SetupInitExpectations("GL_EXT_discard_framebuffer"); + EXPECT_TRUE(info_->feature_flags().ext_discard_framebuffer); + EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_discard_framebuffer")); +} + TEST_F(FeatureInfoTest, InitializeSamplersWithARBSamplerObjects) { SetupInitExpectationsWithGLVersion("GL_ARB_sampler_objects", "OpenGL 3.0"); EXPECT_TRUE(info_->feature_flags().enable_samplers); @@ -859,6 +866,8 @@ TEST_F(FeatureInfoTest, InitializeWithES3) { SetupInitExpectationsWithGLVersion("", "OpenGL ES 3.0"); EXPECT_TRUE(info_->feature_flags().enable_samplers); EXPECT_TRUE(info_->feature_flags().map_buffer_range); + EXPECT_TRUE(info_->feature_flags().ext_discard_framebuffer); + EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_discard_framebuffer")); EXPECT_FALSE(info_->feature_flags().use_async_readpixels); } diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 2e82d98..be0ee10 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -3892,6 +3892,13 @@ void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) { void GLES2DecoderImpl::DoDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum* attachments) { + if (!features().ext_discard_framebuffer) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glDiscardFramebufferEXT", + "function not available"); + return; + } + Framebuffer* framebuffer = GetFramebufferInfoForTarget(GL_FRAMEBUFFER); @@ -4977,6 +4984,7 @@ void GLES2DecoderImpl::DoBlitFramebufferEXT( LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, "glBlitFramebufferEXT", "function not available"); + return; } if (!CheckBoundFramebuffersValid("glBlitFramebufferEXT")) { diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc index 573ba6e..af127bf 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc @@ -8610,6 +8610,62 @@ TEST_F(GLES2DecoderTest, DrawBuffersEXTImmediateBackbuffer) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } +TEST_F(GLES2DecoderManualInitTest, DiscardFramebufferEXT) { + InitDecoder("GL_EXT_discard_framebuffer", // extensions + false, // has alpha + false, // has depth + false, // has stencil + false, // request alpha + false, // request depth + false, // request stencil + false); // bind generates resource + + const GLenum target = GL_FRAMEBUFFER; + const GLsizei count = 1; + const GLenum attachments[] = { GL_COLOR_ATTACHMENT0 }; + + SetupTexture(); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + client_texture_id_, + kServiceTextureId, + 0, + GL_NO_ERROR); + FramebufferManager* framebuffer_manager = group().framebuffer_manager(); + Framebuffer* framebuffer = + framebuffer_manager->GetFramebuffer(client_framebuffer_id_); + EXPECT_TRUE(framebuffer->IsCleared()); + + EXPECT_CALL(*gl_, DiscardFramebufferEXT(target, count, _)) + .Times(1) + .RetiresOnSaturation(); + DiscardFramebufferEXTImmediate& cmd = + *GetImmediateAs<DiscardFramebufferEXTImmediate>(); + cmd.Init(target, count, attachments); + + EXPECT_EQ(error::kNoError, + ExecuteImmediateCmd(cmd, sizeof(attachments))); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_FALSE(framebuffer->IsCleared()); +} + +TEST_F(GLES2DecoderTest, DiscardFramebufferEXTUnsupported) { + const GLenum target = GL_FRAMEBUFFER; + const GLsizei count = 1; + const GLenum attachments[] = { GL_COLOR_EXT }; + DiscardFramebufferEXTImmediate& cmd = + *GetImmediateAs<DiscardFramebufferEXTImmediate>(); + cmd.Init(target, count, attachments); + + // Should not result into a call into GL. + EXPECT_EQ(error::kNoError, + ExecuteImmediateCmd(cmd, sizeof(attachments))); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + // TODO(gman): Complete this test. // TEST_F(GLES2DecoderTest, CompressedTexImage2DGLError) { // } |