summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service
diff options
context:
space:
mode:
authortwiz@chromium.org <twiz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-04 21:13:03 +0000
committertwiz@chromium.org <twiz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-04 21:13:03 +0000
commit0a1e9ad53f2f7f2fc6139644da122e272b88fb80 (patch)
tree8fb141e572f89fd34844b8381c758a286853824f /gpu/command_buffer/service
parentdc03f987519668bcffac2c5ecd8d85feab7aa195 (diff)
downloadchromium_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')
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc72
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_autogen.h9
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc48
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc27
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h3
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();