Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(966)

Unified Diff: gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc
index c0e23649fc29fc965553f229d965371d737a7b82..afb9fc76558dac8a15fc15b2c4b612aa6b2a950a 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc
@@ -43,7 +43,6 @@ using ::testing::Pointee;
using ::testing::Return;
using ::testing::SaveArg;
using ::testing::SetArrayArgument;
-using ::testing::SetArgumentPointee;
using ::testing::SetArgPointee;
using ::testing::StrEq;
using ::testing::StrictMock;
@@ -122,6 +121,93 @@ TEST_P(GLES2DecoderWithShaderTest, GetUniformBlocksCHROMIUMInvalidArgs) {
EXPECT_EQ(0u, header->num_uniform_blocks);
}
+TEST_P(GLES2DecoderWithShaderTest, GetUniformsES3CHROMIUMValidArgs) {
+ const uint32 kBucketId = 123;
+ GetUniformsES3CHROMIUM cmd;
+ cmd.Init(client_program_id_, kBucketId);
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_,
+ GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORMS, _))
+ .WillOnce(SetArgPointee<2>(0))
+ .RetiresOnSaturation();
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
+ EXPECT_EQ(sizeof(UniformsES3Header), bucket->size());
+ UniformsES3Header* header =
+ bucket->GetDataAs<UniformsES3Header*>(0, sizeof(UniformsES3Header));
+ EXPECT_TRUE(header != NULL);
+ EXPECT_EQ(0u, header->num_uniforms);
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetUniformsES3CHROMIUMInvalidArgs) {
+ const uint32 kBucketId = 123;
+ CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
+ EXPECT_TRUE(bucket == NULL);
+ GetUniformsES3CHROMIUM cmd;
+ cmd.Init(kInvalidClientId, kBucketId);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ bucket = decoder_->GetBucket(kBucketId);
+ ASSERT_TRUE(bucket != NULL);
+ EXPECT_EQ(sizeof(UniformsES3Header), bucket->size());
+ UniformsES3Header* header =
+ bucket->GetDataAs<UniformsES3Header*>(0, sizeof(UniformsES3Header));
+ ASSERT_TRUE(header != NULL);
+ EXPECT_EQ(0u, header->num_uniforms);
+}
+
+TEST_P(GLES2DecoderWithShaderTest,
+ GetTransformFeedbackVaryingsCHROMIUMValidArgs) {
+ const uint32 kBucketId = 123;
+ GetTransformFeedbackVaryingsCHROMIUM cmd;
+ cmd.Init(client_program_id_, kBucketId);
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_,
+ GetProgramiv(
+ kServiceProgramId, GL_TRANSFORM_FEEDBACK_VARYINGS, _))
+ .WillOnce(SetArgPointee<2>(0))
+ .RetiresOnSaturation();
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
+ EXPECT_EQ(sizeof(TransformFeedbackVaryingsHeader), bucket->size());
+ TransformFeedbackVaryingsHeader* header =
+ bucket->GetDataAs<TransformFeedbackVaryingsHeader*>(
+ 0, sizeof(TransformFeedbackVaryingsHeader));
+ EXPECT_TRUE(header != NULL);
+ EXPECT_EQ(0u, header->num_transform_feedback_varyings);
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderWithShaderTest,
+ GetTransformFeedbackVaryingsCHROMIUMInvalidArgs) {
+ const uint32 kBucketId = 123;
+ CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
+ EXPECT_TRUE(bucket == NULL);
+ GetTransformFeedbackVaryingsCHROMIUM cmd;
+ cmd.Init(kInvalidClientId, kBucketId);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ bucket = decoder_->GetBucket(kBucketId);
+ ASSERT_TRUE(bucket != NULL);
+ EXPECT_EQ(sizeof(TransformFeedbackVaryingsHeader), bucket->size());
+ TransformFeedbackVaryingsHeader* header =
+ bucket->GetDataAs<TransformFeedbackVaryingsHeader*>(
+ 0, sizeof(TransformFeedbackVaryingsHeader));
+ ASSERT_TRUE(header != NULL);
+ EXPECT_EQ(0u, header->num_transform_feedback_varyings);
+}
+
TEST_P(GLES2DecoderWithShaderTest, GetUniformivSucceeds) {
GetUniformiv::Result* result =
static_cast<GetUniformiv::Result*>(shared_memory_address_);
@@ -344,7 +430,7 @@ TEST_P(GLES2DecoderWithShaderTest, GetAttachedShadersSucceeds) {
Result* result = static_cast<Result*>(shared_memory_address_);
result->size = 0;
EXPECT_CALL(*gl_, GetAttachedShaders(kServiceProgramId, 1, _, _)).WillOnce(
- DoAll(SetArgumentPointee<2>(1), SetArgumentPointee<3>(kServiceShaderId)));
+ DoAll(SetArgPointee<2>(1), SetArgPointee<3>(kServiceShaderId)));
cmd.Init(client_program_id_,
shared_memory_id_,
shared_memory_offset_,
@@ -409,7 +495,7 @@ TEST_P(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatSucceeds) {
const GLint precision = 16;
EXPECT_CALL(*gl_, GetShaderPrecisionFormat(_, _, _, _))
.WillOnce(DoAll(SetArrayArgument<2>(range, range + 2),
- SetArgumentPointee<3>(precision)))
+ SetArgPointee<3>(precision)))
.RetiresOnSaturation();
cmd.Init(GL_VERTEX_SHADER,
GL_HIGH_FLOAT,
@@ -681,6 +767,175 @@ TEST_P(GLES2DecoderWithShaderTest,
EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
}
+TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformBlockivSucceeds) {
+ GetActiveUniformBlockiv cmd;
+ typedef GetActiveUniformBlockiv::Result Result;
+ Result* result = static_cast<Result*>(shared_memory_address_);
+ GLenum kPname[] {
+ GL_UNIFORM_BLOCK_BINDING,
+ GL_UNIFORM_BLOCK_DATA_SIZE,
+ GL_UNIFORM_BLOCK_NAME_LENGTH,
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS,
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES,
+ GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER,
+ GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER,
+ };
+ for (size_t ii = 0; ii < arraysize(kPname); ++ii) {
+ result->SetNumResults(0);
+ cmd.Init(client_program_id_,
+ 0,
+ kPname[ii],
+ shared_memory_id_,
+ shared_memory_offset_);
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ if (kPname[ii] == GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES) {
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_,
+ GetActiveUniformBlockiv(kServiceProgramId, 0,
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, _))
+ .WillOnce(SetArgPointee<3>(1))
+ .RetiresOnSaturation();
+ }
+ EXPECT_CALL(*gl_,
+ GetActiveUniformBlockiv(
+ kServiceProgramId, 0, kPname[ii], _))
+ .WillOnce(SetArgPointee<3>(1976))
+ .RetiresOnSaturation();
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(1, result->GetNumResults());
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ EXPECT_EQ(1976, result->GetData()[0]);
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+ }
+}
+
+TEST_P(GLES2DecoderWithShaderTest,
+ GetActiveUniformBlockivSucceedsZeroUniforms) {
+ GetActiveUniformBlockiv cmd;
+ typedef GetActiveUniformBlockiv::Result Result;
+ Result* result = static_cast<Result*>(shared_memory_address_);
+ result->SetNumResults(0);
+ cmd.Init(client_program_id_,
+ 0,
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES,
+ shared_memory_id_,
+ shared_memory_offset_);
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_,
+ GetActiveUniformBlockiv(
+ kServiceProgramId, 0, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, _))
+ .WillOnce(SetArgPointee<3>(0))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_,
+ GetActiveUniformBlockiv(kServiceProgramId, 0,
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, _))
+ .Times(1)
+ .RetiresOnSaturation();
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(0, result->GetNumResults());
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformBlockivUnlinkedProgram) {
+ GetActiveUniformBlockiv cmd;
+ typedef GetActiveUniformBlockiv::Result Result;
+ Result* result = static_cast<Result*>(shared_memory_address_);
+ result->SetNumResults(0);
+ cmd.Init(client_program_id_,
+ 0,
+ GL_UNIFORM_BLOCK_BINDING,
+ shared_memory_id_,
+ shared_memory_offset_);
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_FALSE))
+ .RetiresOnSaturation();
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(0, result->GetNumResults());
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
+}
+
+TEST_P(GLES2DecoderWithShaderTest,
+ GetActiveUniformBlockivResultNotInitFails) {
+ GetActiveUniformBlockiv cmd;
+ typedef GetActiveUniformBlockiv::Result Result;
+ Result* result = static_cast<Result*>(shared_memory_address_);
+ result->SetNumResults(1); // Should be initialized to 0.
+ cmd.Init(client_program_id_,
+ 0,
+ GL_UNIFORM_BLOCK_BINDING,
+ shared_memory_id_,
+ shared_memory_offset_);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformBlockivBadProgramFails) {
+ GetActiveUniformBlockiv cmd;
+ typedef GetActiveUniformBlockiv::Result Result;
+ Result* result = static_cast<Result*>(shared_memory_address_);
+ result->SetNumResults(0);
+ cmd.Init(kInvalidClientId,
+ 0,
+ GL_UNIFORM_BLOCK_BINDING,
+ shared_memory_id_,
+ shared_memory_offset_);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(0, result->GetNumResults());
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
+}
+
+TEST_P(GLES2DecoderWithShaderTest,
+ GetActiveUniformBlockivBadSharedMemoryFails) {
+ GetActiveUniformBlockiv cmd;
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+ cmd.Init(client_program_id_,
+ 0,
+ GL_UNIFORM_BLOCK_BINDING,
+ kInvalidSharedMemoryId,
+ shared_memory_offset_);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+ cmd.Init(client_program_id_,
+ 0,
+ GL_UNIFORM_BLOCK_BINDING,
+ shared_memory_id_,
+ kInvalidSharedMemoryOffset);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+}
+
TEST_P(GLES2DecoderWithShaderTest, GetActiveAttribSucceeds) {
const GLuint kAttribIndex = 1;
const uint32 kBucketId = 123;
@@ -782,6 +1037,306 @@ TEST_P(GLES2DecoderWithShaderTest, GetActiveAttribBadSharedMemoryFails) {
EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
}
+TEST_P(GLES2DecoderWithShaderTest, GetUniformIndicesSucceeds) {
+ const uint32 kBucketId = 123;
+ const char kName0[] = "Cow";
+ const char kName1[] = "Chicken";
+ const char* kNames[] = { kName0, kName1 };
+ const size_t kCount = arraysize(kNames);
+ const char kValidStrEnd = 0;
+ const GLuint kIndices[] = { 1, 2 };
+ SetBucketAsCStrings(kBucketId, kCount, kNames, kCount, kValidStrEnd);
+ GetUniformIndices::Result* result =
+ static_cast<GetUniformIndices::Result*>(shared_memory_address_);
+ GetUniformIndices cmd;
+ cmd.Init(client_program_id_,
+ kBucketId,
+ kSharedMemoryId,
+ kSharedMemoryOffset);
+ EXPECT_CALL(*gl_, GetUniformIndices(kServiceProgramId, kCount, _, _))
+ .WillOnce(SetArrayArgument<3>(kIndices, kIndices + kCount))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ result->size = 0;
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(kCount, static_cast<size_t>(result->GetNumResults()));
+ for (size_t ii = 0; ii < kCount; ++ii) {
+ EXPECT_EQ(kIndices[ii], result->GetData()[ii]);
+ }
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetUniformIndicesBadProgramFails) {
+ const uint32 kBucketId = 123;
+ const char kName0[] = "Cow";
+ const char kName1[] = "Chicken";
+ const char* kNames[] = { kName0, kName1 };
+ const size_t kCount = arraysize(kNames);
+ const char kValidStrEnd = 0;
+ SetBucketAsCStrings(kBucketId, kCount, kNames, kCount, kValidStrEnd);
+ GetUniformIndices::Result* result =
+ static_cast<GetUniformIndices::Result*>(shared_memory_address_);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ GetUniformIndices cmd;
+ // None-existant program
+ cmd.Init(kInvalidClientId,
+ kBucketId,
+ kSharedMemoryId,
+ kSharedMemoryOffset);
+ result->size = 0;
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(0, result->GetNumResults());
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
+ // Unlinked program.
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_FALSE))
+ .RetiresOnSaturation();
+ cmd.Init(client_program_id_,
+ kBucketId,
+ kSharedMemoryId,
+ kSharedMemoryOffset);
+ result->size = 0;
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(0, result->GetNumResults());
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetUniformIndicesBadParamsFails) {
+ const uint32 kBucketId = 123;
+ const char kName0[] = "Cow";
+ const char kName1[] = "Chicken";
+ const char* kNames[] = { kName0, kName1 };
+ const size_t kCount = arraysize(kNames);
+ const char kValidStrEnd = 0;
+ const GLuint kIndices[] = { 1, 2 };
+ SetBucketAsCStrings(kBucketId, kCount, kNames, kCount, kValidStrEnd);
+ GetUniformIndices::Result* result =
+ static_cast<GetUniformIndices::Result*>(shared_memory_address_);
+ GetUniformIndices cmd;
+ cmd.Init(client_program_id_,
+ kBucketId,
+ kSharedMemoryId,
+ kSharedMemoryOffset);
+ EXPECT_CALL(*gl_, GetUniformIndices(kServiceProgramId, kCount, _, _))
+ .WillOnce(SetArrayArgument<3>(kIndices, kIndices + kCount))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_INVALID_VALUE))
+ .RetiresOnSaturation();
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ result->size = 0;
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(0, result->GetNumResults());
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetUniformIndicesResultNotInitFails) {
+ const uint32 kBucketId = 123;
+ const char kName0[] = "Cow";
+ const char kName1[] = "Chicken";
+ const char* kNames[] = { kName0, kName1 };
+ const size_t kCount = arraysize(kNames);
+ const char kValidStrEnd = 0;
+ SetBucketAsCStrings(kBucketId, kCount, kNames, kCount, kValidStrEnd);
+ GetUniformIndices::Result* result =
+ static_cast<GetUniformIndices::Result*>(shared_memory_address_);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ GetUniformIndices cmd;
+ result->size = 1976; // Any value other than 0.
+ cmd.Init(kInvalidClientId,
+ kBucketId,
+ kSharedMemoryId,
+ kSharedMemoryOffset);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetUniformIndicesBadSharedMemoryFails) {
+ const uint32 kBucketId = 123;
+ const char kName0[] = "Cow";
+ const char kName1[] = "Chicken";
+ const char* kNames[] = { kName0, kName1 };
+ const size_t kCount = arraysize(kNames);
+ const char kValidStrEnd = 0;
+ SetBucketAsCStrings(kBucketId, kCount, kNames, kCount, kValidStrEnd);
+ GetUniformIndices::Result* result =
+ static_cast<GetUniformIndices::Result*>(shared_memory_address_);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ GetUniformIndices cmd;
+ cmd.Init(client_program_id_,
+ kBucketId,
+ kInvalidSharedMemoryId,
+ kSharedMemoryOffset);
+ result->size = 0;
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+ cmd.Init(client_program_id_,
+ kBucketId,
+ kSharedMemoryId,
+ kInvalidSharedMemoryOffset);
+ result->size = 0;
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformsivSucceeds) {
+ const uint32 kBucketId = 123;
+ const GLuint kIndices[] = { 1, 2 };
+ const GLint kResults[] = { 1976, 321 };
+ const size_t kCount = arraysize(kIndices);
+ SetBucketData(kBucketId, kIndices, sizeof(GLuint) * kCount);
+ GetActiveUniformsiv::Result* result =
+ static_cast<GetActiveUniformsiv::Result*>(shared_memory_address_);
+ GetActiveUniformsiv cmd;
+ cmd.Init(client_program_id_,
+ kBucketId,
+ GL_UNIFORM_TYPE,
+ kSharedMemoryId,
+ kSharedMemoryOffset);
+ EXPECT_CALL(*gl_,
+ GetActiveUniformsiv(
+ kServiceProgramId, kCount, _, GL_UNIFORM_TYPE, _))
+ .WillOnce(SetArrayArgument<4>(kResults, kResults + kCount))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ result->size = 0;
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(kCount, static_cast<size_t>(result->GetNumResults()));
+ for (size_t ii = 0; ii < kCount; ++ii) {
+ EXPECT_EQ(kResults[ii], result->GetData()[ii]);
+ }
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformsivBadProgramFails) {
+ const uint32 kBucketId = 123;
+ const GLuint kIndices[] = { 1, 2 };
+ const size_t kCount = arraysize(kIndices);
+ SetBucketData(kBucketId, kIndices, sizeof(GLuint) * kCount);
+ GetActiveUniformsiv::Result* result =
+ static_cast<GetActiveUniformsiv::Result*>(shared_memory_address_);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ GetActiveUniformsiv cmd;
+ // None-existant program
+ cmd.Init(kInvalidClientId,
+ kBucketId,
+ GL_UNIFORM_TYPE,
+ kSharedMemoryId,
+ kSharedMemoryOffset);
+ result->size = 0;
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(0, result->GetNumResults());
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
+ // Unlinked program.
+ cmd.Init(client_program_id_,
+ kBucketId,
+ GL_UNIFORM_TYPE,
+ kSharedMemoryId,
+ kSharedMemoryOffset);
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_FALSE))
+ .RetiresOnSaturation();
+ result->size = 0;
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(0, result->GetNumResults());
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformsivBadParamsFails) {
+ const uint32 kBucketId = 123;
+ const GLuint kIndices[] = { 1, 2 };
+ const GLint kResults[] = { 1976, 321 };
+ const size_t kCount = arraysize(kIndices);
+ SetBucketData(kBucketId, kIndices, sizeof(GLuint) * kCount);
+ GetActiveUniformsiv::Result* result =
+ static_cast<GetActiveUniformsiv::Result*>(shared_memory_address_);
+ GetActiveUniformsiv cmd;
+ cmd.Init(client_program_id_,
+ kBucketId,
+ GL_UNIFORM_TYPE,
+ kSharedMemoryId,
+ kSharedMemoryOffset);
+ EXPECT_CALL(*gl_,
+ GetActiveUniformsiv(
+ kServiceProgramId, kCount, _, GL_UNIFORM_TYPE, _))
+ .WillOnce(SetArrayArgument<4>(kResults, kResults + kCount))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_INVALID_VALUE))
+ .RetiresOnSaturation();
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ result->size = 0;
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(0, result->GetNumResults());
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformsivResultNotInitFails) {
+ const uint32 kBucketId = 123;
+ const GLuint kIndices[] = { 1, 2 };
+ const size_t kCount = arraysize(kIndices);
+ SetBucketData(kBucketId, kIndices, sizeof(GLuint) * kCount);
+ GetActiveUniformsiv::Result* result =
+ static_cast<GetActiveUniformsiv::Result*>(shared_memory_address_);
+ GetActiveUniformsiv cmd;
+ cmd.Init(client_program_id_,
+ kBucketId,
+ GL_UNIFORM_TYPE,
+ kSharedMemoryId,
+ kSharedMemoryOffset);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ result->size = 1976; // Any value other than 0.
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformsivBadSharedMemoryFails) {
+ const uint32 kBucketId = 123;
+ const GLuint kIndices[] = { 1, 2 };
+ const size_t kCount = arraysize(kIndices);
+ SetBucketData(kBucketId, kIndices, sizeof(GLuint) * kCount);
+ GetActiveUniformsiv::Result* result =
+ static_cast<GetActiveUniformsiv::Result*>(shared_memory_address_);
+ GetActiveUniformsiv cmd;
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ result->size = 0;
+ cmd.Init(client_program_id_,
+ kBucketId,
+ GL_UNIFORM_TYPE,
+ kInvalidSharedMemoryId,
+ kSharedMemoryOffset);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+ result->size = 0;
+ cmd.Init(client_program_id_,
+ kBucketId,
+ GL_UNIFORM_TYPE,
+ kSharedMemoryId,
+ kInvalidSharedMemoryOffset);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+}
+
TEST_P(GLES2DecoderWithShaderTest, GetShaderInfoLogValidArgs) {
const char* kInfo = "hello";
const uint32 kBucketId = 123;
@@ -790,13 +1345,13 @@ TEST_P(GLES2DecoderWithShaderTest, GetShaderInfoLogValidArgs) {
EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _));
EXPECT_CALL(*gl_, CompileShader(kServiceShaderId));
EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _))
- .WillOnce(SetArgumentPointee<2>(GL_FALSE))
+ .WillOnce(SetArgPointee<2>(GL_FALSE))
.RetiresOnSaturation();
EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_INFO_LOG_LENGTH, _))
- .WillOnce(SetArgumentPointee<2>(strlen(kInfo) + 1))
+ .WillOnce(SetArgPointee<2>(strlen(kInfo) + 1))
.RetiresOnSaturation();
EXPECT_CALL(*gl_, GetShaderInfoLog(kServiceShaderId, strlen(kInfo) + 1, _, _))
- .WillOnce(DoAll(SetArgumentPointee<2>(strlen(kInfo)),
+ .WillOnce(DoAll(SetArgPointee<2>(strlen(kInfo)),
SetArrayArgument<3>(kInfo, kInfo + strlen(kInfo) + 1)));
compile_cmd.Init(client_shader_id_);
cmd.Init(client_shader_id_, kBucketId);
@@ -818,15 +1373,168 @@ TEST_P(GLES2DecoderWithShaderTest, GetShaderInfoLogInvalidArgs) {
EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
}
+TEST_P(GLES2DecoderWithShaderTest, GetTransformFeedbackVaryingSucceeds) {
+ const GLuint kIndex = 1;
+ const uint32 kBucketId = 123;
+ const char kName[] = "HolyCow";
+ const GLsizei kBufferSize = static_cast<GLsizei>(strlen(kName) + 1);
+ const GLsizei kSize = 2;
+ const GLenum kType = GL_FLOAT_VEC2;
+ GetTransformFeedbackVarying cmd;
+ typedef GetTransformFeedbackVarying::Result Result;
+ Result* result = static_cast<Result*>(shared_memory_address_);
+ result->success = 0;
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId,
+ GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH, _))
+ .WillOnce(SetArgPointee<2>(kBufferSize))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_,
+ GetTransformFeedbackVarying(
+ kServiceProgramId, kIndex, _, _, _, _, _))
+ .WillOnce(DoAll(SetArgPointee<3>(kBufferSize - 1),
+ SetArgPointee<4>(kSize),
+ SetArgPointee<5>(kType),
+ SetArrayArgument<6>(kName, kName + kBufferSize)))
+ .RetiresOnSaturation();
+ cmd.Init(client_program_id_,
+ kIndex,
+ kBucketId,
+ shared_memory_id_,
+ shared_memory_offset_);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_NE(0, result->success);
+ EXPECT_EQ(kSize, static_cast<GLsizei>(result->size));
+ EXPECT_EQ(kType, static_cast<GLenum>(result->type));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
+ ASSERT_TRUE(bucket != NULL);
+ EXPECT_EQ(
+ 0, memcmp(bucket->GetData(0, bucket->size()), kName, bucket->size()));
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetTransformFeedbackVaryingNotInitFails) {
+ const GLuint kIndex = 1;
+ const uint32 kBucketId = 123;
+ GetTransformFeedbackVarying cmd;
+ typedef GetTransformFeedbackVarying::Result Result;
+ Result* result = static_cast<Result*>(shared_memory_address_);
+ result->success = 1;
+ cmd.Init(client_program_id_,
+ kIndex,
+ kBucketId,
+ shared_memory_id_,
+ shared_memory_offset_);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetTransformFeedbackVaryingBadProgramFails) {
+ const GLuint kIndex = 1;
+ const uint32 kBucketId = 123;
+ GetTransformFeedbackVarying cmd;
+ typedef GetTransformFeedbackVarying::Result Result;
+ Result* result = static_cast<Result*>(shared_memory_address_);
+ result->success = 0;
+ cmd.Init(kInvalidClientId,
+ kIndex,
+ kBucketId,
+ shared_memory_id_,
+ shared_memory_offset_);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(0, result->success);
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
+}
+
+TEST_P(GLES2DecoderWithShaderTest, GetTransformFeedbackVaryingBadParamsFails) {
+ const GLuint kIndex = 1;
+ const uint32 kBucketId = 123;
+ const GLsizei kBufferSize = 10;
+ GetTransformFeedbackVarying cmd;
+ typedef GetTransformFeedbackVarying::Result Result;
+ Result* result = static_cast<Result*>(shared_memory_address_);
+ result->success = 0;
+ cmd.Init(client_program_id_,
+ kIndex,
+ kBucketId,
+ shared_memory_id_,
+ shared_memory_offset_);
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId,
+ GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH, _))
+ .WillOnce(SetArgPointee<2>(kBufferSize))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_INVALID_VALUE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_,
+ GetTransformFeedbackVarying(
+ kServiceProgramId, kIndex, _, _, _, _, _))
+ .Times(1)
+ .RetiresOnSaturation();
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(0, result->success);
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
+}
+
+TEST_P(GLES2DecoderWithShaderTest,
+ GetTransformFeedbackVaryingBadSharedMemoryFails) {
+ const GLuint kIndex = 1;
+ const uint32 kBucketId = 123;
+ GetTransformFeedbackVarying cmd;
+ typedef GetTransformFeedbackVarying::Result Result;
+ Result* result = static_cast<Result*>(shared_memory_address_);
+ result->success = 0;
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ cmd.Init(client_program_id_,
+ kIndex,
+ kBucketId,
+ kInvalidSharedMemoryId,
+ shared_memory_offset_);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+ cmd.Init(client_program_id_,
+ kIndex,
+ kBucketId,
+ shared_memory_id_,
+ kInvalidSharedMemoryOffset);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+}
+
TEST_P(GLES2DecoderTest, CompileShaderValidArgs) {
+ // Compile shader should not actually call any GL calls yet.
+ CompileShader cmd;
+ cmd.Init(client_shader_id_);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+
+ // Getting the shader compilation state should trigger the actual GL calls.
EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _));
EXPECT_CALL(*gl_, CompileShader(kServiceShaderId));
EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _))
- .WillOnce(SetArgumentPointee<2>(GL_TRUE))
+ .WillOnce(SetArgPointee<2>(GL_TRUE))
.RetiresOnSaturation();
- CompileShader cmd;
- cmd.Init(client_shader_id_);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+
+ GetShaderiv status_cmd;
+ status_cmd.Init(client_shader_id_, GL_COMPILE_STATUS,
+ kSharedMemoryId, kSharedMemoryOffset);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(status_cmd));
}
TEST_P(GLES2DecoderTest, CompileShaderInvalidArgs) {
@@ -1178,6 +1886,18 @@ TEST_P(GLES2DecoderWithShaderTest, GetUniformLocationInvalidArgs) {
EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
}
+TEST_P(GLES2DecoderWithShaderTest, UniformBlockBindingValidArgs) {
+ EXPECT_CALL(*gl_, UniformBlockBinding(kServiceProgramId, 2, 3));
+ SpecializedSetup<cmds::UniformBlockBinding, 0>(true);
+ cmds::UniformBlockBinding cmd;
+ cmd.Init(client_program_id_, 2, 3);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
TEST_P(GLES2DecoderWithShaderTest, BindUniformLocationCHROMIUMBucket) {
const uint32 kBucketId = 123;
const GLint kLocation = 2;

Powered by Google App Engine
This is Rietveld 408576698