summaryrefslogtreecommitdiffstats
path: root/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc')
-rw-r--r--chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc164
1 files changed, 164 insertions, 0 deletions
diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc
index 17d773b3569..63434c3f309 100644
--- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc
+++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc
@@ -4809,6 +4809,170 @@ TEST_P(GLES2DecoderTest, TestDiscardableTextureBindGeneratesUnlocked) {
EXPECT_EQ(GL_NO_ERROR, GetGLError());
}
+TEST_P(GLES2DecoderTest, CopySubTextureCHROMIUMTwiceClearsUnclearedTexture) {
+ // Create uninitialized source texture.
+ EXPECT_CALL(*gl_, GenTextures(1, _))
+ .WillOnce(SetArgPointee<1>(kNewServiceId))
+ .RetiresOnSaturation();
+ GenHelper<GenTexturesImmediate>(kNewClientId);
+ DoBindTexture(GL_TEXTURE_2D, kNewClientId, kNewServiceId);
+ DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0,
+ 0);
+
+ // Create uninitialized dest texture.
+ DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
+ DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0,
+ 0);
+
+ // This will write the top half of the destination.
+ {
+ // Source is undefined, so first call to CopySubTexture will clear the
+ // source.
+ SetupClearTextureExpectations(kNewServiceId, kServiceTextureId,
+ GL_TEXTURE_2D, GL_TEXTURE_2D, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, 0, 0, 2, 2, 0);
+ CopySubTextureCHROMIUM cmd;
+ cmd.Init(kNewClientId /* source_id */, 0 /* source_level */,
+ GL_TEXTURE_2D /* dest_target */, client_texture_id_ /* dest_id */,
+ 0 /* dest_level */, 0 /* xoffset */, 0 /* yoffset */, 0 /* x */,
+ 0 /* y */, 2 /* width */, 1 /* height */,
+ false /* unpack_flip_y */, false /* unpack_premultiply_alpha */,
+ false /* unpack_unmultiply_alpha */);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ }
+
+ // This will write the bottom right pixel of the destination.
+ {
+ // This will clear the bottom part of destination as a rectangle is not
+ // sufficient to keep track of the initialized area.
+ SetupClearTextureExpectations(kServiceTextureId, kServiceTextureId,
+ GL_TEXTURE_2D, GL_TEXTURE_2D, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, 0, 1, 2, 1, 0);
+ CopySubTextureCHROMIUM cmd;
+ cmd.Init(kNewClientId /* source_id */, 0 /* source_level */,
+ GL_TEXTURE_2D /* dest_target */, client_texture_id_ /* dest_id */,
+ 0 /* dest_level */, 1 /* xoffset */, 1 /* yoffset */, 0 /* x */,
+ 0 /* y */, 1 /* width */, 1 /* height */,
+ false /* unpack_flip_y */, false /* unpack_premultiply_alpha */,
+ false /* unpack_unmultiply_alpha */);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ }
+
+ TextureManager* manager = group().texture_manager();
+ TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
+ ASSERT_TRUE(texture_ref != nullptr);
+ Texture* texture = texture_ref->texture();
+ EXPECT_TRUE(texture->SafeToRenderFrom());
+}
+
+TEST_P(GLES3DecoderTest, ImmutableTextureBaseLevelMaxLevelClamping) {
+ GLenum kTarget = GL_TEXTURE_3D;
+ GLint kBaseLevel = 1416354905;
+ GLint kMaxLevel = 800;
+ GLsizei kLevels = 4;
+ GLenum kInternalFormat = GL_R8;
+ GLsizei kWidth = 20;
+ GLsizei kHeight = 20;
+ GLsizei kDepth = 20;
+ GLint kClampedBaseLevel = kLevels - 1;
+ GLint kClampedMaxLevel = kLevels - 1;
+
+ DoBindTexture(kTarget, client_texture_id_, kServiceTextureId);
+ TextureRef* texture_ref =
+ group().texture_manager()->GetTexture(client_texture_id_);
+ ASSERT_TRUE(texture_ref != nullptr);
+ Texture* texture = texture_ref->texture();
+
+ // Before TexStorage3D call, base/max levels are not clamped.
+ {
+ EXPECT_CALL(*gl_, TexParameteri(kTarget, GL_TEXTURE_BASE_LEVEL, kBaseLevel))
+ .Times(1)
+ .RetiresOnSaturation();
+ TexParameteri cmd;
+ cmd.Init(kTarget, GL_TEXTURE_BASE_LEVEL, kBaseLevel);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ }
+ {
+ EXPECT_CALL(*gl_, TexParameteri(kTarget, GL_TEXTURE_MAX_LEVEL, kMaxLevel))
+ .Times(1)
+ .RetiresOnSaturation();
+ TexParameteri cmd;
+ cmd.Init(kTarget, GL_TEXTURE_MAX_LEVEL, kMaxLevel);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ }
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ EXPECT_EQ(kBaseLevel, texture->base_level());
+ EXPECT_EQ(kMaxLevel, texture->max_level());
+
+ {
+ EXPECT_CALL(*gl_, TexStorage3D(kTarget, kLevels, kInternalFormat, kWidth,
+ kHeight, kDepth))
+ .Times(1)
+ .RetiresOnSaturation();
+ TexStorage3D cmd;
+ cmd.Init(kTarget, kLevels, kInternalFormat, kWidth, kHeight, kDepth);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ }
+ EXPECT_EQ(kClampedBaseLevel, texture->base_level());
+ EXPECT_EQ(kClampedMaxLevel, texture->max_level());
+
+ GLint kNewBaseLevel = 827344;
+ GLint kNewMaxLevel = 17619;
+ // After TexStorage3D call, base/max levels are clamped.
+ {
+ EXPECT_CALL(
+ *gl_, TexParameteri(kTarget, GL_TEXTURE_BASE_LEVEL, kClampedBaseLevel))
+ .Times(1)
+ .RetiresOnSaturation();
+ TexParameteri cmd;
+ cmd.Init(kTarget, GL_TEXTURE_BASE_LEVEL, kNewBaseLevel);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ }
+ {
+ EXPECT_CALL(*gl_,
+ TexParameteri(kTarget, GL_TEXTURE_MAX_LEVEL, kClampedMaxLevel))
+ .Times(1)
+ .RetiresOnSaturation();
+ TexParameteri cmd;
+ cmd.Init(kTarget, GL_TEXTURE_MAX_LEVEL, kNewMaxLevel);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ }
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ EXPECT_EQ(kClampedBaseLevel, texture->base_level());
+ EXPECT_EQ(kClampedMaxLevel, texture->max_level());
+
+ // GetTexParameteriv still returns unclamped values.
+ {
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+ typedef GetTexParameteriv::Result Result;
+ Result* result = static_cast<Result*>(shared_memory_address_);
+ result->size = 0;
+ GetTexParameteriv cmd;
+ cmd.Init(kTarget, GL_TEXTURE_BASE_LEVEL, shared_memory_id_,
+ shared_memory_offset_);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(kNewBaseLevel, static_cast<GLint>(result->GetData()[0]));
+ }
+ {
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+ typedef GetTexParameteriv::Result Result;
+ Result* result = static_cast<Result*>(shared_memory_address_);
+ result->size = 0;
+ GetTexParameteriv cmd;
+ cmd.Init(kTarget, GL_TEXTURE_MAX_LEVEL, shared_memory_id_,
+ shared_memory_offset_);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(kNewMaxLevel, static_cast<GLint>(result->GetData()[0]));
+ }
+}
+
// TODO(gman): Complete this test.
// TEST_P(GLES2DecoderTest, CompressedTexImage2DGLError) {
// }