Index: gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc |
index 05b44afeecfd5cafb1e9c844f7cd0c26a4a74dae..994608cf5a894b14cb44b952d4db6820e5a6afd2 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc |
@@ -2174,13 +2174,7 @@ TEST_P(GLES2DecoderTest, BindTexImage2DCHROMIUM) { |
// Bind image to texture. |
// ScopedGLErrorSuppressor calls GetError on its constructor and destructor. |
- EXPECT_CALL(*gl_, GetError()) |
- .WillOnce(Return(GL_NO_ERROR)) |
- .WillOnce(Return(GL_NO_ERROR)) |
- .RetiresOnSaturation(); |
- BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; |
- bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1); |
- EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); |
+ DoBindTexImage2DCHROMIUM(GL_TEXTURE_2D, 1); |
EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); |
// Image should now be set. |
EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); |
@@ -2207,20 +2201,113 @@ TEST_P(GLES2DecoderTest, BindTexImage2DCHROMIUMCubeMapNotAllowed) { |
TEST_P(GLES2DecoderTest, OrphanGLImageWithTexImage2D) { |
scoped_refptr<gfx::GLImage> image(new gfx::GLImageStub); |
GetImageManager()->AddImage(image.get(), 1); |
- DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId); |
+ DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
- BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; |
- bind_tex_image_2d_cmd.Init(GL_TEXTURE_CUBE_MAP, 1); |
- EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); |
- EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); |
+ DoBindTexImage2DCHROMIUM(GL_TEXTURE_2D, 1); |
+ TextureRef* texture_ref = |
+ group().texture_manager()->GetTexture(client_texture_id_); |
+ ASSERT_TRUE(texture_ref != NULL); |
+ Texture* texture = texture_ref->texture(); |
+ |
+ EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == image.get()); |
DoTexImage2D( |
GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); |
+ EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); |
+} |
+ |
+TEST_P(GLES2DecoderTest, GLImageAttachedAfterSubTexImage2D) { |
+ // Specifically tests that TexSubImage2D is not optimized to TexImage2D |
+ // in the presence of image attachments. |
+ ASSERT_FALSE( |
+ feature_info()->workarounds().texsubimage2d_faster_than_teximage2d); |
+ |
+ scoped_refptr<gfx::GLImage> image(new gfx::GLImageStub); |
+ GetImageManager()->AddImage(image.get(), 1); |
+ DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
+ |
+ GLenum target = GL_TEXTURE_2D; |
+ GLint level = 0; |
+ GLint xoffset = 0; |
+ GLint yoffset = 0; |
+ GLsizei width = 1; |
+ GLsizei height = 1; |
+ GLint border = 0; |
+ GLenum format = GL_RGBA; |
+ GLenum type = GL_UNSIGNED_BYTE; |
+ uint32_t pixels_shm_id = kSharedMemoryId; |
+ uint32_t pixels_shm_offset = kSharedMemoryOffset; |
+ GLboolean internal = 0; |
+ |
+ // Define texture first. |
+ DoTexImage2D(target, level, format, width, height, border, format, type, |
+ pixels_shm_id, pixels_shm_offset); |
+ |
+ // Bind texture to GLImage. |
+ DoBindTexImage2DCHROMIUM(GL_TEXTURE_2D, 1); |
+ |
+ // Check binding. |
TextureRef* texture_ref = |
group().texture_manager()->GetTexture(client_texture_id_); |
ASSERT_TRUE(texture_ref != NULL); |
Texture* texture = texture_ref->texture(); |
- EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); |
+ EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == image.get()); |
+ |
+ // TexSubImage2D should not unbind GLImage. |
+ EXPECT_CALL(*gl_, TexSubImage2D(target, level, xoffset, yoffset, width, |
+ height, format, type, _)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ cmds::TexSubImage2D tex_sub_image_2d_cmd; |
+ tex_sub_image_2d_cmd.Init(target, level, xoffset, yoffset, width, height, |
+ format, type, pixels_shm_id, pixels_shm_offset, |
+ internal); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(tex_sub_image_2d_cmd)); |
+ EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == image.get()); |
+} |
+ |
+TEST_P(GLES2DecoderTest, GLImageAttachedAfterClearLevel) { |
+ scoped_refptr<gfx::GLImage> image(new gfx::GLImageStub); |
+ GetImageManager()->AddImage(image.get(), 1); |
+ DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
+ |
+ GLenum target = GL_TEXTURE_2D; |
+ GLint level = 0; |
+ GLint xoffset = 0; |
+ GLint yoffset = 0; |
+ GLsizei width = 1; |
+ GLsizei height = 1; |
+ GLint border = 0; |
+ GLenum format = GL_RGBA; |
+ GLenum type = GL_UNSIGNED_BYTE; |
+ uint32_t pixels_shm_id = kSharedMemoryId; |
+ uint32_t pixels_shm_offset = kSharedMemoryOffset; |
+ |
+ // Define texture first. |
+ DoTexImage2D(target, level, format, width, height, border, format, type, |
+ pixels_shm_id, pixels_shm_offset); |
+ |
+ // Bind texture to GLImage. |
+ DoBindTexImage2DCHROMIUM(GL_TEXTURE_2D, 1); |
+ |
+ // Check binding. |
+ TextureRef* texture_ref = |
+ group().texture_manager()->GetTexture(client_texture_id_); |
+ ASSERT_TRUE(texture_ref != NULL); |
+ Texture* texture = texture_ref->texture(); |
+ EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == image.get()); |
+ |
+ // ClearLevel should use glTexSubImage2D to avoid unbinding GLImage. |
+ EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)) |
+ .Times(2) |
+ .RetiresOnSaturation(); |
+ EXPECT_CALL(*gl_, TexSubImage2D(target, level, xoffset, yoffset, width, |
+ height, format, type, _)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ GetDecoder()->ClearLevel(texture, target, level, format, format, type, width, |
+ height, false); |
+ EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == image.get()); |
} |
TEST_P(GLES2DecoderTest, ReleaseTexImage2DCHROMIUM) { |
@@ -2252,13 +2339,7 @@ TEST_P(GLES2DecoderTest, ReleaseTexImage2DCHROMIUM) { |
// Bind image to texture. |
// ScopedGLErrorSuppressor calls GetError on its constructor and destructor. |
- EXPECT_CALL(*gl_, GetError()) |
- .WillOnce(Return(GL_NO_ERROR)) |
- .WillOnce(Return(GL_NO_ERROR)) |
- .RetiresOnSaturation(); |
- BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; |
- bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1); |
- EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); |
+ DoBindTexImage2DCHROMIUM(GL_TEXTURE_2D, 1); |
EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); |
// Image should now be set. |
EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); |
@@ -2334,13 +2415,7 @@ TEST_P(GLES2DecoderWithShaderTest, UseTexImage) { |
.WillOnce(Return(gfx::Size(1, 1))) |
.RetiresOnSaturation(); |
// ScopedGLErrorSuppressor calls GetError on its constructor and destructor. |
- EXPECT_CALL(*gl_, GetError()) |
- .WillOnce(Return(GL_NO_ERROR)) |
- .WillOnce(Return(GL_NO_ERROR)) |
- .RetiresOnSaturation(); |
- BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; |
- bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, kImageId); |
- EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); |
+ DoBindTexImage2DCHROMIUM(GL_TEXTURE_2D, kImageId); |
AddExpectationsForSimulatedAttrib0(kNumVertices, 0); |
SetupExpectationsForApplyingDefaultDirtyState(); |