diff options
author | twiz@chromium.org <twiz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-04 21:13:03 +0000 |
---|---|---|
committer | twiz@chromium.org <twiz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-04 21:13:03 +0000 |
commit | 0a1e9ad53f2f7f2fc6139644da122e272b88fb80 (patch) | |
tree | 8fb141e572f89fd34844b8381c758a286853824f /gpu/command_buffer/service | |
parent | dc03f987519668bcffac2c5ecd8d85feab7aa195 (diff) | |
download | chromium_src-0a1e9ad53f2f7f2fc6139644da122e272b88fb80.zip chromium_src-0a1e9ad53f2f7f2fc6139644da122e272b88fb80.tar.gz chromium_src-0a1e9ad53f2f7f2fc6139644da122e272b88fb80.tar.bz2 |
Addition of a set of basic unit tests for the GL_CHROMIUM_copy_texture extension.
This change also introduces a new parameter to the extension, internal_format. This is to bring the extension closer in functionality to glCopyTexImage.
The tests uncovered state that was not being properly restored: GL_BLEND. This is also corrected.
TEST=GLCopyTextureCHROMIUMTest.*
BUG=126178
Review URL: http://codereview.chromium.org/10356004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@135434 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/service')
5 files changed, 109 insertions, 50 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index ebb56bc..7d978d3 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -743,7 +743,8 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, GLenum target, GLuint source_id, GLuint target_id, - GLint level); + GLint level, + GLenum internal_format); // Wrapper for TexStorage2DEXT. void DoTexStorage2DEXT( @@ -1415,6 +1416,7 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, GLuint mask_stencil_back_; GLclampf clear_depth_; GLboolean mask_depth_; + bool enable_blend_; bool enable_cull_face_; bool enable_scissor_test_; bool enable_depth_test_; @@ -1892,6 +1894,7 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group) mask_stencil_back_(-1), clear_depth_(1.0f), mask_depth_(true), + enable_blend_(false), enable_cull_face_(false), enable_scissor_test_(false), enable_depth_test_(false), @@ -3278,6 +3281,7 @@ void GLES2DecoderImpl::ApplyDirtyState() { EnableDisable(GL_STENCIL_TEST, enable_stencil_test_ && have_stencil); EnableDisable(GL_CULL_FACE, enable_cull_face_); EnableDisable(GL_SCISSOR_TEST, enable_scissor_test_); + EnableDisable(GL_BLEND, enable_blend_); state_dirty_ = false; } } @@ -4097,6 +4101,9 @@ void GLES2DecoderImpl::DoFramebufferRenderbuffer( bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) { switch (cap) { + case GL_BLEND: + enable_blend_ = enabled; + return true; case GL_CULL_FACE: enable_cull_face_ = enabled; return true; @@ -6248,6 +6255,12 @@ error::Error GLES2DecoderImpl::HandlePixelStorei( "glPixelSTore: param GL_INVALID_VALUE"); return error::kNoError; } + case GL_UNPACK_FLIP_Y_CHROMIUM: + unpack_flip_y_ = (param != 0); + return error::kNoError; + case GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM: + unpack_premultiply_alpha_ = (param != 0); + return error::kNoError; default: break; } @@ -6261,12 +6274,6 @@ error::Error GLES2DecoderImpl::HandlePixelStorei( case GL_UNPACK_ALIGNMENT: unpack_alignment_ = param; break; - case GL_UNPACK_FLIP_Y_CHROMIUM: - unpack_flip_y_ = (param != 0); - break; - case GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM: - unpack_premultiply_alpha_ = (param != 0); - break; default: // Validation should have prevented us from getting here. NOTREACHED(); @@ -8380,7 +8387,8 @@ static GLenum ExtractFormatFromStorageFormat(GLenum internalformat) { } void GLES2DecoderImpl::DoCopyTextureCHROMIUM( - GLenum target, GLuint source_id, GLuint dest_id, GLint level) { + GLenum target, GLuint source_id, GLuint dest_id, GLint level, + GLenum internal_format) { TextureManager::TextureInfo* dest_info = GetTextureInfo(dest_id); TextureManager::TextureInfo* source_info = GetTextureInfo(source_id); @@ -8395,18 +8403,18 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( return; } - int source_width, source_height, dest_width, dest_height; - if (!source_info->GetLevelSize(GL_TEXTURE_2D, 0, &source_width, - &source_height)) { + if (dest_info->target() != GL_TEXTURE_2D || + source_info->target() != GL_TEXTURE_2D) { SetGLError(GL_INVALID_VALUE, - "glCopyTextureChromium: source texture has no level 0"); + "glCopyTextureCHROMIUM: invalid texture target binding"); return; } - if (!dest_info->GetLevelSize(GL_TEXTURE_2D, level, &dest_width, - &dest_height)) { + int source_width, source_height, dest_width, dest_height; + if (!source_info->GetLevelSize(GL_TEXTURE_2D, 0, &source_width, + &source_height)) { SetGLError(GL_INVALID_VALUE, - "glCopyTextureChromium: destination texture level does not exist"); + "glCopyTextureChromium: source texture has no level 0"); return; } @@ -8418,28 +8426,44 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( return; } - // Resize the destination texture to the dimensions of the source texture. - if (dest_width != source_width && dest_height != source_height) { - GLenum type; - GLenum internal_format; - dest_info->GetLevelType(GL_TEXTURE_2D, level, &type, &internal_format); + GLenum dest_type; + GLenum dest_internal_format; + bool dest_level_defined = dest_info->GetLevelSize(GL_TEXTURE_2D, level, + &dest_width, + &dest_height); + + if (dest_level_defined) { + dest_info->GetLevelType(GL_TEXTURE_2D, level, &dest_type, + &dest_internal_format); + } else { + GLenum source_internal_format; + source_info->GetLevelType(GL_TEXTURE_2D, 0, &dest_type, + &source_internal_format); + } + // Resize the destination texture to the dimensions of the source texture. + if (!dest_level_defined || dest_width != source_width || + dest_height != source_height || + dest_internal_format != internal_format) { // Ensure that the glTexImage2D succeeds. CopyRealGLErrorsToWrapper(); + glBindTexture(GL_TEXTURE_2D, dest_info->service_id()); WrappedTexImage2D( GL_TEXTURE_2D, level, internal_format, source_width, source_height, - 0, internal_format, type, NULL); + 0, internal_format, dest_type, NULL); GLenum error = PeekGLError(); - if (error != GL_NO_ERROR) + if (error != GL_NO_ERROR) { + RestoreCurrentTexture2DBindings(); return; + } texture_manager()->SetLevelInfo( dest_info, GL_TEXTURE_2D, level, internal_format, source_width, - source_height, 1, 0, internal_format, type, true); + source_height, 1, 0, internal_format, dest_type, true); } state_dirty_ = true; - glViewport(0, 0, dest_width, dest_height); + glViewport(0, 0, source_width, source_height); copy_texture_CHROMIUM_->DoCopyTexture(target, source_info->service_id(), dest_info->service_id(), level, unpack_flip_y_, diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h index f2b9f26..49ec263 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h @@ -2732,7 +2732,14 @@ error::Error GLES2DecoderImpl::HandleCopyTextureCHROMIUM( GLenum source_id = static_cast<GLenum>(c.source_id); GLenum dest_id = static_cast<GLenum>(c.dest_id); GLint level = static_cast<GLint>(c.level); - DoCopyTextureCHROMIUM(target, source_id, dest_id, level); + GLint internalformat = static_cast<GLint>(c.internalformat); + if (!validators_->texture_internal_format.IsValid(internalformat)) { + SetGLError( + GL_INVALID_VALUE, + "glCopyTextureCHROMIUM: internalformat GL_INVALID_VALUE"); + return error::kNoError; + } + DoCopyTextureCHROMIUM(target, source_id, dest_id, level, internalformat); return error::kNoError; } diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc index a1b6613..3c20100 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc @@ -3548,7 +3548,8 @@ TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMask) { 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -3604,7 +3605,8 @@ TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferDepthMask) { 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -3658,7 +3660,8 @@ TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferStencilMask) { 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -3713,7 +3716,8 @@ TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMaskFBO) { 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -3761,7 +3765,8 @@ TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMaskFBO) { 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -3790,7 +3795,8 @@ TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMaskFBO) { 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -4015,7 +4021,9 @@ TEST_F(GLES2DecoderManualInitTest, DepthEnableWithDepth) { 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -4075,7 +4083,8 @@ TEST_F(GLES2DecoderManualInitTest, DepthEnableWithoutRequestedDepth) { 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -4133,9 +4142,10 @@ TEST_F(GLES2DecoderManualInitTest, StencilEnableWithStencil) { false, // depth enabled -1, // front stencil mask -1, // back stencil mask - true, // stencil enabled + true, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -4195,7 +4205,8 @@ TEST_F(GLES2DecoderManualInitTest, StencilEnableWithoutRequestedStencil) { 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -5950,7 +5961,8 @@ TEST_F(GLES2DecoderWithShaderTest, DrawClearsAfterTexImage2DNULLInFBO) { 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -6115,7 +6127,8 @@ TEST_F(GLES2DecoderWithShaderTest, UnClearedAttachmentsGetClearedOnClear) { 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, Clear(GL_COLOR_BUFFER_BIT)) .Times(1) @@ -6271,7 +6284,8 @@ TEST_F(GLES2DecoderWithShaderTest, DrawClearsAfterRenderbufferStorageInFBO) { 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -6386,7 +6400,8 @@ TEST_F(GLES2DecoderWithShaderTest, 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) @@ -6606,7 +6621,8 @@ TEST_F(GLES2DecoderWithShaderTest, 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) .Times(1) diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc index 2a43f99..1e717f5 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc @@ -665,7 +665,8 @@ void GLES2DecoderTestBase::SetupExpectationsForApplyingDirtyState( GLuint back_stencil_mask, bool stencil_enabled, bool cull_face_enabled, - bool scissor_test_enabled) { + bool scissor_test_enabled, + bool blend_enabled) { EXPECT_CALL(*gl_, ColorMask( (color_bits & 0x1000) != 0, (color_bits & 0x0100) != 0, @@ -710,13 +711,22 @@ void GLES2DecoderTestBase::SetupExpectationsForApplyingDirtyState( .RetiresOnSaturation(); } if (scissor_test_enabled) { - EXPECT_CALL(*gl_, Enable(GL_SCISSOR_TEST)) - .Times(1) - .RetiresOnSaturation(); + EXPECT_CALL(*gl_, Enable(GL_SCISSOR_TEST)) + .Times(1) + .RetiresOnSaturation(); } else { - EXPECT_CALL(*gl_, Disable(GL_SCISSOR_TEST)) - .Times(1) - .RetiresOnSaturation(); + EXPECT_CALL(*gl_, Disable(GL_SCISSOR_TEST)) + .Times(1) + .RetiresOnSaturation(); + } + if (blend_enabled) { + EXPECT_CALL(*gl_, Enable(GL_BLEND)) + .Times(1) + .RetiresOnSaturation(); + } else { + EXPECT_CALL(*gl_, Disable(GL_BLEND)) + .Times(1) + .RetiresOnSaturation(); } } @@ -732,7 +742,8 @@ void GLES2DecoderTestBase::SetupExpectationsForApplyingDefaultDirtyState() { 0, // back stencil mask false, // stencil enabled false, // cull_face_enabled - false); // scissor_test_enabled + false, // scissor_test_enabled + false); // blend_enabled } void GLES2DecoderTestBase::DoBindFramebuffer( diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h index 64d47f6..2cae914 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h @@ -305,7 +305,8 @@ class GLES2DecoderTestBase : public testing::Test { GLuint back_stencil_mask, bool stencil_enabled, bool cull_face_enabled, - bool scissor_test_enabled); + bool scissor_test_enabled, + bool blend_enabled); void SetupExpectationsForApplyingDefaultDirtyState(); |