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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..00d1a18ba93779b7018923af560a235f2b7d2149 |
--- /dev/null |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc |
@@ -0,0 +1,1391 @@ |
+// Copyright (c) 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
+ |
+#include "base/command_line.h" |
+#include "base/strings/string_number_conversions.h" |
+#include "gpu/command_buffer/common/gles2_cmd_format.h" |
+#include "gpu/command_buffer/common/gles2_cmd_utils.h" |
+#include "gpu/command_buffer/common/id_allocator.h" |
+#include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h" |
+#include "gpu/command_buffer/service/async_pixel_transfer_manager.h" |
+#include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" |
+#include "gpu/command_buffer/service/cmd_buffer_engine.h" |
+#include "gpu/command_buffer/service/context_group.h" |
+#include "gpu/command_buffer/service/context_state.h" |
+#include "gpu/command_buffer/service/gl_surface_mock.h" |
+#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" |
+ |
+#include "gpu/command_buffer/service/gpu_switches.h" |
+#include "gpu/command_buffer/service/image_manager.h" |
+#include "gpu/command_buffer/service/mailbox_manager.h" |
+#include "gpu/command_buffer/service/mocks.h" |
+#include "gpu/command_buffer/service/program_manager.h" |
+#include "gpu/command_buffer/service/test_helper.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/gl/gl_implementation.h" |
+#include "ui/gl/gl_mock.h" |
+#include "ui/gl/gl_surface_stub.h" |
+ |
+#if !defined(GL_DEPTH24_STENCIL8) |
+#define GL_DEPTH24_STENCIL8 0x88F0 |
+#endif |
+ |
+using ::gfx::MockGLInterface; |
+using ::testing::_; |
+using ::testing::DoAll; |
+using ::testing::InSequence; |
+using ::testing::Invoke; |
+using ::testing::MatcherCast; |
+using ::testing::Mock; |
+using ::testing::Pointee; |
+using ::testing::Return; |
+using ::testing::SaveArg; |
+using ::testing::SetArrayArgument; |
+using ::testing::SetArgumentPointee; |
+using ::testing::SetArgPointee; |
+using ::testing::StrEq; |
+using ::testing::StrictMock; |
+ |
+namespace gpu { |
+namespace gles2 { |
+ |
+using namespace cmds; |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetProgramInfoCHROMIUMValidArgs) { |
+ const uint32 kBucketId = 123; |
+ GetProgramInfoCHROMIUM cmd; |
+ cmd.Init(client_program_id_, kBucketId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); |
+ EXPECT_GT(bucket->size(), 0u); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetProgramInfoCHROMIUMInvalidArgs) { |
+ const uint32 kBucketId = 123; |
+ CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); |
+ EXPECT_TRUE(bucket == NULL); |
+ GetProgramInfoCHROMIUM cmd; |
+ cmd.Init(kInvalidClientId, kBucketId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+ bucket = decoder_->GetBucket(kBucketId); |
+ ASSERT_TRUE(bucket != NULL); |
+ EXPECT_EQ(sizeof(ProgramInfoHeader), bucket->size()); |
+ ProgramInfoHeader* info = |
+ bucket->GetDataAs<ProgramInfoHeader*>(0, sizeof(ProgramInfoHeader)); |
+ ASSERT_TRUE(info != 0); |
+ EXPECT_EQ(0u, info->link_status); |
+ EXPECT_EQ(0u, info->num_attribs); |
+ EXPECT_EQ(0u, info->num_uniforms); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformivSucceeds) { |
+ GetUniformiv::Result* result = |
+ static_cast<GetUniformiv::Result*>(shared_memory_address_); |
+ result->size = 0; |
+ GetUniformiv cmd; |
+ cmd.Init(client_program_id_, |
+ kUniform2FakeLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_CALL(*gl_, GetUniformiv(kServiceProgramId, kUniform2RealLocation, _)) |
+ .Times(1); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), |
+ result->size); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformivArrayElementSucceeds) { |
+ GetUniformiv::Result* result = |
+ static_cast<GetUniformiv::Result*>(shared_memory_address_); |
+ result->size = 0; |
+ GetUniformiv cmd; |
+ cmd.Init(client_program_id_, |
+ kUniform2ElementFakeLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_CALL(*gl_, |
+ GetUniformiv(kServiceProgramId, kUniform2ElementRealLocation, _)) |
+ .Times(1); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), |
+ result->size); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadProgramFails) { |
+ GetUniformiv::Result* result = |
+ static_cast<GetUniformiv::Result*>(shared_memory_address_); |
+ result->size = 0; |
+ GetUniformiv cmd; |
+ // non-existant program |
+ cmd.Init(kInvalidClientId, |
+ kUniform2FakeLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_CALL(*gl_, GetUniformiv(_, _, _)).Times(0); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0U, result->size); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+// Valid id that is not a program. The GL spec requires a different error for |
+// this case. |
+#if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
+ result->size = kInitialResult; |
+ cmd.Init(client_shader_id_, |
+ kUniform2FakeLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0U, result->size); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
+ // Unlinked program |
+ EXPECT_CALL(*gl_, CreateProgram()) |
+ .Times(1) |
+ .WillOnce(Return(kNewServiceId)) |
+ .RetiresOnSaturation(); |
+ CreateProgram cmd2; |
+ cmd2.Init(kNewClientId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); |
+ result->size = kInitialResult; |
+ cmd.Init(kNewClientId, |
+ kUniform2FakeLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0U, result->size); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadLocationFails) { |
+ GetUniformiv::Result* result = |
+ static_cast<GetUniformiv::Result*>(shared_memory_address_); |
+ result->size = 0; |
+ GetUniformiv cmd; |
+ // invalid location |
+ cmd.Init(client_program_id_, |
+ kInvalidUniformLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_CALL(*gl_, GetUniformiv(_, _, _)).Times(0); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0U, result->size); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadSharedMemoryFails) { |
+ GetUniformiv cmd; |
+ cmd.Init(client_program_id_, |
+ kUniform2FakeLocation, |
+ kInvalidSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_CALL(*gl_, GetUniformiv(_, _, _)).Times(0); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ cmd.Init(client_program_id_, |
+ kUniform2FakeLocation, |
+ kSharedMemoryId, |
+ kInvalidSharedMemoryOffset); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+}; |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformfvSucceeds) { |
+ GetUniformfv::Result* result = |
+ static_cast<GetUniformfv::Result*>(shared_memory_address_); |
+ result->size = 0; |
+ GetUniformfv cmd; |
+ cmd.Init(client_program_id_, |
+ kUniform2FakeLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_CALL(*gl_, GetUniformfv(kServiceProgramId, kUniform2RealLocation, _)) |
+ .Times(1); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), |
+ result->size); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformfvArrayElementSucceeds) { |
+ GetUniformfv::Result* result = |
+ static_cast<GetUniformfv::Result*>(shared_memory_address_); |
+ result->size = 0; |
+ GetUniformfv cmd; |
+ cmd.Init(client_program_id_, |
+ kUniform2ElementFakeLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_CALL(*gl_, |
+ GetUniformfv(kServiceProgramId, kUniform2ElementRealLocation, _)) |
+ .Times(1); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), |
+ result->size); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadProgramFails) { |
+ GetUniformfv::Result* result = |
+ static_cast<GetUniformfv::Result*>(shared_memory_address_); |
+ result->size = 0; |
+ GetUniformfv cmd; |
+ // non-existant program |
+ cmd.Init(kInvalidClientId, |
+ kUniform2FakeLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_CALL(*gl_, GetUniformfv(_, _, _)).Times(0); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0U, result->size); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+// Valid id that is not a program. The GL spec requires a different error for |
+// this case. |
+#if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
+ result->size = kInitialResult; |
+ cmd.Init(client_shader_id_, |
+ kUniform2FakeLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0U, result->size); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
+ // Unlinked program |
+ EXPECT_CALL(*gl_, CreateProgram()) |
+ .Times(1) |
+ .WillOnce(Return(kNewServiceId)) |
+ .RetiresOnSaturation(); |
+ CreateProgram cmd2; |
+ cmd2.Init(kNewClientId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); |
+ result->size = kInitialResult; |
+ cmd.Init(kNewClientId, |
+ kUniform2FakeLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0U, result->size); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadLocationFails) { |
+ GetUniformfv::Result* result = |
+ static_cast<GetUniformfv::Result*>(shared_memory_address_); |
+ result->size = 0; |
+ GetUniformfv cmd; |
+ // invalid location |
+ cmd.Init(client_program_id_, |
+ kInvalidUniformLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_CALL(*gl_, GetUniformfv(_, _, _)).Times(0); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0U, result->size); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadSharedMemoryFails) { |
+ GetUniformfv cmd; |
+ cmd.Init(client_program_id_, |
+ kUniform2FakeLocation, |
+ kInvalidSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_CALL(*gl_, GetUniformfv(_, _, _)).Times(0); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ cmd.Init(client_program_id_, |
+ kUniform2FakeLocation, |
+ kSharedMemoryId, |
+ kInvalidSharedMemoryOffset); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+}; |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersSucceeds) { |
+ GetAttachedShaders cmd; |
+ typedef GetAttachedShaders::Result Result; |
+ 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))); |
+ cmd.Init(client_program_id_, |
+ shared_memory_id_, |
+ shared_memory_offset_, |
+ Result::ComputeSize(1)); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(1, result->GetNumResults()); |
+ EXPECT_EQ(client_shader_id_, result->GetData()[0]); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersResultNotInitFail) { |
+ GetAttachedShaders cmd; |
+ typedef GetAttachedShaders::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->size = 1; |
+ EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)).Times(0); |
+ cmd.Init(client_program_id_, |
+ shared_memory_id_, |
+ shared_memory_offset_, |
+ Result::ComputeSize(1)); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersBadProgramFails) { |
+ GetAttachedShaders cmd; |
+ typedef GetAttachedShaders::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->size = 0; |
+ EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)).Times(0); |
+ cmd.Init(kInvalidClientId, |
+ shared_memory_id_, |
+ shared_memory_offset_, |
+ Result::ComputeSize(1)); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0U, result->size); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersBadSharedMemoryFails) { |
+ GetAttachedShaders cmd; |
+ typedef GetAttachedShaders::Result Result; |
+ cmd.Init(client_program_id_, |
+ kInvalidSharedMemoryId, |
+ shared_memory_offset_, |
+ Result::ComputeSize(1)); |
+ EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)).Times(0); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ cmd.Init(client_program_id_, |
+ shared_memory_id_, |
+ kInvalidSharedMemoryOffset, |
+ Result::ComputeSize(1)); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatSucceeds) { |
+ ScopedGLImplementationSetter gl_impl(::gfx::kGLImplementationEGLGLES2); |
+ GetShaderPrecisionFormat cmd; |
+ typedef GetShaderPrecisionFormat::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->success = 0; |
+ const GLint range[2] = {62, 62}; |
+ const GLint precision = 16; |
+ EXPECT_CALL(*gl_, GetShaderPrecisionFormat(_, _, _, _)) |
+ .WillOnce(DoAll(SetArrayArgument<2>(range, range + 2), |
+ SetArgumentPointee<3>(precision))) |
+ .RetiresOnSaturation(); |
+ cmd.Init(GL_VERTEX_SHADER, |
+ GL_HIGH_FLOAT, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_NE(0, result->success); |
+ EXPECT_EQ(range[0], result->min_range); |
+ EXPECT_EQ(range[1], result->max_range); |
+ EXPECT_EQ(precision, result->precision); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatResultNotInitFails) { |
+ GetShaderPrecisionFormat cmd; |
+ typedef GetShaderPrecisionFormat::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->success = 1; |
+ // NOTE: GL might not be called. There is no Desktop OpenGL equivalent |
+ cmd.Init(GL_VERTEX_SHADER, |
+ GL_HIGH_FLOAT, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatBadArgsFails) { |
+ typedef GetShaderPrecisionFormat::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->success = 0; |
+ GetShaderPrecisionFormat cmd; |
+ cmd.Init( |
+ GL_TEXTURE_2D, GL_HIGH_FLOAT, shared_memory_id_, shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); |
+ result->success = 0; |
+ cmd.Init(GL_VERTEX_SHADER, |
+ GL_TEXTURE_2D, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, |
+ GetShaderPrecisionFormatBadSharedMemoryFails) { |
+ GetShaderPrecisionFormat cmd; |
+ cmd.Init(GL_VERTEX_SHADER, |
+ GL_HIGH_FLOAT, |
+ kInvalidSharedMemoryId, |
+ shared_memory_offset_); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ cmd.Init(GL_VERTEX_SHADER, |
+ GL_TEXTURE_2D, |
+ shared_memory_id_, |
+ kInvalidSharedMemoryOffset); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformSucceeds) { |
+ const GLuint kUniformIndex = 1; |
+ const uint32 kBucketId = 123; |
+ GetActiveUniform cmd; |
+ typedef GetActiveUniform::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->success = 0; |
+ cmd.Init(client_program_id_, |
+ kUniformIndex, |
+ kBucketId, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_NE(0, result->success); |
+ EXPECT_EQ(kUniform2Size, result->size); |
+ EXPECT_EQ(kUniform2Type, 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()), kUniform2Name, bucket->size())); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformResultNotInitFails) { |
+ const GLuint kUniformIndex = 1; |
+ const uint32 kBucketId = 123; |
+ GetActiveUniform cmd; |
+ typedef GetActiveUniform::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->success = 1; |
+ cmd.Init(client_program_id_, |
+ kUniformIndex, |
+ kBucketId, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadProgramFails) { |
+ const GLuint kUniformIndex = 1; |
+ const uint32 kBucketId = 123; |
+ GetActiveUniform cmd; |
+ typedef GetActiveUniform::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->success = 0; |
+ cmd.Init(kInvalidClientId, |
+ kUniformIndex, |
+ kBucketId, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0, result->success); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+#if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
+ result->success = 0; |
+ cmd.Init(client_shader_id_, |
+ kUniformIndex, |
+ kBucketId, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0, result->success); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadIndexFails) { |
+ const uint32 kBucketId = 123; |
+ GetActiveUniform cmd; |
+ typedef GetActiveUniform::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->success = 0; |
+ cmd.Init(client_program_id_, |
+ kBadUniformIndex, |
+ kBucketId, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0, result->success); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadSharedMemoryFails) { |
+ const GLuint kUniformIndex = 1; |
+ const uint32 kBucketId = 123; |
+ GetActiveUniform cmd; |
+ cmd.Init(client_program_id_, |
+ kUniformIndex, |
+ kBucketId, |
+ kInvalidSharedMemoryId, |
+ shared_memory_offset_); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ cmd.Init(client_program_id_, |
+ kUniformIndex, |
+ kBucketId, |
+ shared_memory_id_, |
+ kInvalidSharedMemoryOffset); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribSucceeds) { |
+ const GLuint kAttribIndex = 1; |
+ const uint32 kBucketId = 123; |
+ GetActiveAttrib cmd; |
+ typedef GetActiveAttrib::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->success = 0; |
+ cmd.Init(client_program_id_, |
+ kAttribIndex, |
+ kBucketId, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_NE(0, result->success); |
+ EXPECT_EQ(kAttrib2Size, result->size); |
+ EXPECT_EQ(kAttrib2Type, 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()), kAttrib2Name, bucket->size())); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribResultNotInitFails) { |
+ const GLuint kAttribIndex = 1; |
+ const uint32 kBucketId = 123; |
+ GetActiveAttrib cmd; |
+ typedef GetActiveAttrib::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->success = 1; |
+ cmd.Init(client_program_id_, |
+ kAttribIndex, |
+ kBucketId, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadProgramFails) { |
+ const GLuint kAttribIndex = 1; |
+ const uint32 kBucketId = 123; |
+ GetActiveAttrib cmd; |
+ typedef GetActiveAttrib::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->success = 0; |
+ cmd.Init(kInvalidClientId, |
+ kAttribIndex, |
+ kBucketId, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0, result->success); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+#if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
+ result->success = 0; |
+ cmd.Init(client_shader_id_, |
+ kAttribIndex, |
+ kBucketId, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0, result->success); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadIndexFails) { |
+ const uint32 kBucketId = 123; |
+ GetActiveAttrib cmd; |
+ typedef GetActiveAttrib::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->success = 0; |
+ cmd.Init(client_program_id_, |
+ kBadAttribIndex, |
+ kBucketId, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0, result->success); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadSharedMemoryFails) { |
+ const GLuint kAttribIndex = 1; |
+ const uint32 kBucketId = 123; |
+ GetActiveAttrib cmd; |
+ cmd.Init(client_program_id_, |
+ kAttribIndex, |
+ kBucketId, |
+ kInvalidSharedMemoryId, |
+ shared_memory_offset_); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ cmd.Init(client_program_id_, |
+ kAttribIndex, |
+ kBucketId, |
+ shared_memory_id_, |
+ kInvalidSharedMemoryOffset); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetShaderInfoLogValidArgs) { |
+ const char* kInfo = "hello"; |
+ const uint32 kBucketId = 123; |
+ CompileShader compile_cmd; |
+ GetShaderInfoLog cmd; |
+ EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _)); |
+ EXPECT_CALL(*gl_, CompileShader(kServiceShaderId)); |
+ EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _)) |
+ .WillOnce(SetArgumentPointee<2>(GL_FALSE)) |
+ .RetiresOnSaturation(); |
+ EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_INFO_LOG_LENGTH, _)) |
+ .WillOnce(SetArgumentPointee<2>(strlen(kInfo) + 1)) |
+ .RetiresOnSaturation(); |
+ EXPECT_CALL(*gl_, GetShaderInfoLog(kServiceShaderId, strlen(kInfo) + 1, _, _)) |
+ .WillOnce(DoAll(SetArgumentPointee<2>(strlen(kInfo)), |
+ SetArrayArgument<3>(kInfo, kInfo + strlen(kInfo) + 1))); |
+ compile_cmd.Init(client_shader_id_); |
+ cmd.Init(client_shader_id_, kBucketId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(compile_cmd)); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); |
+ ASSERT_TRUE(bucket != NULL); |
+ EXPECT_EQ(strlen(kInfo) + 1, bucket->size()); |
+ EXPECT_EQ(0, |
+ memcmp(bucket->GetData(0, bucket->size()), kInfo, bucket->size())); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetShaderInfoLogInvalidArgs) { |
+ const uint32 kBucketId = 123; |
+ GetShaderInfoLog cmd; |
+ cmd.Init(kInvalidClientId, kBucketId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderTest, CompileShaderValidArgs) { |
+ EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _)); |
+ EXPECT_CALL(*gl_, CompileShader(kServiceShaderId)); |
+ EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _)) |
+ .WillOnce(SetArgumentPointee<2>(GL_TRUE)) |
+ .RetiresOnSaturation(); |
+ CompileShader cmd; |
+ cmd.Init(client_shader_id_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderTest, CompileShaderInvalidArgs) { |
+ CompileShader cmd; |
+ cmd.Init(kInvalidClientId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+#if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
+ cmd.Init(client_program_id_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
+} |
+ |
+TEST_F(GLES2DecoderTest, ShaderSourceAndGetShaderSourceValidArgs) { |
+ const uint32 kBucketId = 123; |
+ const char kSource[] = "hello"; |
+ const uint32 kSourceSize = sizeof(kSource) - 1; |
+ memcpy(shared_memory_address_, kSource, kSourceSize); |
+ ShaderSource cmd; |
+ cmd.Init( |
+ client_shader_id_, kSharedMemoryId, kSharedMemoryOffset, kSourceSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ memset(shared_memory_address_, 0, kSourceSize); |
+ GetShaderSource get_cmd; |
+ get_cmd.Init(client_shader_id_, kBucketId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd)); |
+ CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); |
+ ASSERT_TRUE(bucket != NULL); |
+ EXPECT_EQ(kSourceSize + 1, bucket->size()); |
+ EXPECT_EQ( |
+ 0, memcmp(bucket->GetData(0, bucket->size()), kSource, bucket->size())); |
+} |
+ |
+TEST_F(GLES2DecoderTest, ShaderSourceInvalidArgs) { |
+ const char kSource[] = "hello"; |
+ const uint32 kSourceSize = sizeof(kSource) - 1; |
+ memcpy(shared_memory_address_, kSource, kSourceSize); |
+ ShaderSource cmd; |
+ cmd.Init(kInvalidClientId, kSharedMemoryId, kSharedMemoryOffset, kSourceSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+#if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
+ cmd.Init( |
+ client_program_id_, kSharedMemoryId, kSharedMemoryOffset, kSourceSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
+ cmd.Init(client_shader_id_, |
+ kInvalidSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kSourceSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ cmd.Init(client_shader_id_, |
+ kSharedMemoryId, |
+ kInvalidSharedMemoryOffset, |
+ kSourceSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ cmd.Init(client_shader_id_, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kSharedBufferSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderTest, ShaderSourceBucketAndGetShaderSourceValidArgs) { |
+ const uint32 kInBucketId = 123; |
+ const uint32 kOutBucketId = 125; |
+ const char kSource[] = "hello"; |
+ const uint32 kSourceSize = sizeof(kSource) - 1; |
+ SetBucketAsCString(kInBucketId, kSource); |
+ ShaderSourceBucket cmd; |
+ cmd.Init(client_shader_id_, kInBucketId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ ClearSharedMemory(); |
+ GetShaderSource get_cmd; |
+ get_cmd.Init(client_shader_id_, kOutBucketId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd)); |
+ CommonDecoder::Bucket* bucket = decoder_->GetBucket(kOutBucketId); |
+ ASSERT_TRUE(bucket != NULL); |
+ EXPECT_EQ(kSourceSize + 1, bucket->size()); |
+ EXPECT_EQ( |
+ 0, memcmp(bucket->GetData(0, bucket->size()), kSource, bucket->size())); |
+} |
+ |
+TEST_F(GLES2DecoderTest, ShaderSourceBucketInvalidArgs) { |
+ const uint32 kBucketId = 123; |
+ const char kSource[] = "hello"; |
+ const uint32 kSourceSize = sizeof(kSource) - 1; |
+ memcpy(shared_memory_address_, kSource, kSourceSize); |
+ ShaderSourceBucket cmd; |
+ // Test no bucket. |
+ cmd.Init(client_texture_id_, kBucketId); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ // Test invalid client. |
+ SetBucketAsCString(kBucketId, kSource); |
+ cmd.Init(kInvalidClientId, kBucketId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderTest, ShaderSourceStripComments) { |
+ const uint32 kInBucketId = 123; |
+ const char kSource[] = "hello/*te\ast*/world//a\ab"; |
+ SetBucketAsCString(kInBucketId, kSource); |
+ ShaderSourceBucket cmd; |
+ cmd.Init(client_shader_id_, kInBucketId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, Uniform1iValidArgs) { |
+ EXPECT_CALL(*gl_, Uniform1i(kUniform1RealLocation, 2)); |
+ Uniform1i cmd; |
+ cmd.Init(kUniform1FakeLocation, 2); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, Uniform1ivValidArgs) { |
+ EXPECT_CALL( |
+ *gl_, |
+ Uniform1iv(kUniform1RealLocation, |
+ 1, |
+ reinterpret_cast<const GLint*>(shared_memory_address_))); |
+ Uniform1iv cmd; |
+ cmd.Init(kUniform1FakeLocation, 1, shared_memory_id_, shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidArgs2_0) { |
+ EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); |
+ Uniform1iv cmd; |
+ cmd.Init(kUniform1FakeLocation, 1, kInvalidSharedMemoryId, 0); |
+ EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidArgs2_1) { |
+ EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); |
+ Uniform1iv cmd; |
+ cmd.Init( |
+ kUniform1FakeLocation, 1, shared_memory_id_, kInvalidSharedMemoryOffset); |
+ EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, Uniform1ivImmediateValidArgs) { |
+ Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); |
+ EXPECT_CALL(*gl_, |
+ Uniform1iv(kUniform1RealLocation, |
+ 1, |
+ reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd)))); |
+ GLint temp[1 * 2] = { |
+ 0, |
+ }; |
+ cmd.Init(kUniform1FakeLocation, 1, &temp[0]); |
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidValidArgs) { |
+ EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); |
+ Uniform1iv cmd; |
+ cmd.Init(kUniform1FakeLocation, 2, shared_memory_id_, shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, Uniform1ivZeroCount) { |
+ EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); |
+ Uniform1iv cmd; |
+ cmd.Init(kUniform1FakeLocation, 0, shared_memory_id_, shared_memory_offset_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, Uniform1iSamplerIsLmited) { |
+ EXPECT_CALL(*gl_, Uniform1i(_, _)).Times(0); |
+ Uniform1i cmd; |
+ cmd.Init(kUniform1FakeLocation, kNumTextureUnits); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, Uniform1ivSamplerIsLimited) { |
+ EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); |
+ Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); |
+ GLint temp[] = {kNumTextureUnits}; |
+ cmd.Init(kUniform1FakeLocation, 1, &temp[0]); |
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderTest, BindAttribLocation) { |
+ const GLint kLocation = 2; |
+ const char* kName = "testing"; |
+ const uint32 kNameSize = strlen(kName); |
+ EXPECT_CALL(*gl_, |
+ BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName))) |
+ .Times(1); |
+ memcpy(shared_memory_address_, kName, kNameSize); |
+ BindAttribLocation cmd; |
+ cmd.Init(client_program_id_, |
+ kLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderTest, BindAttribLocationInvalidArgs) { |
+ const GLint kLocation = 2; |
+ const char* kName = "testing"; |
+ const char* kBadName = "test\aing"; |
+ const uint32 kNameSize = strlen(kName); |
+ const uint32 kBadNameSize = strlen(kBadName); |
+ EXPECT_CALL(*gl_, BindAttribLocation(_, _, _)).Times(0); |
+ memcpy(shared_memory_address_, kName, kNameSize); |
+ BindAttribLocation cmd; |
+ cmd.Init(kInvalidClientId, |
+ kLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+ cmd.Init(client_program_id_, |
+ kLocation, |
+ kInvalidSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ cmd.Init(client_program_id_, |
+ kLocation, |
+ kSharedMemoryId, |
+ kInvalidSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ cmd.Init(client_program_id_, |
+ kLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kSharedBufferSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ memcpy(shared_memory_address_, kBadName, kBadNameSize); |
+ cmd.Init(client_program_id_, |
+ kLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kBadNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderTest, BindAttribLocationBucket) { |
+ const uint32 kBucketId = 123; |
+ const GLint kLocation = 2; |
+ const char* kName = "testing"; |
+ EXPECT_CALL(*gl_, |
+ BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName))) |
+ .Times(1); |
+ SetBucketAsCString(kBucketId, kName); |
+ BindAttribLocationBucket cmd; |
+ cmd.Init(client_program_id_, kLocation, kBucketId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderTest, BindAttribLocationBucketInvalidArgs) { |
+ const uint32 kBucketId = 123; |
+ const GLint kLocation = 2; |
+ const char* kName = "testing"; |
+ EXPECT_CALL(*gl_, BindAttribLocation(_, _, _)).Times(0); |
+ BindAttribLocationBucket cmd; |
+ // check bucket does not exist. |
+ cmd.Init(client_program_id_, kLocation, kBucketId); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ // check bucket is empty. |
+ SetBucketAsCString(kBucketId, NULL); |
+ cmd.Init(client_program_id_, kLocation, kBucketId); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ // Check bad program id |
+ SetBucketAsCString(kBucketId, kName); |
+ cmd.Init(kInvalidClientId, kLocation, kBucketId); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetAttribLocation) { |
+ const uint32 kNameSize = strlen(kAttrib2Name); |
+ const char* kNonExistentName = "foobar"; |
+ const uint32 kNonExistentNameSize = strlen(kNonExistentName); |
+ typedef GetAttribLocation::Result Result; |
+ Result* result = GetSharedMemoryAs<Result*>(); |
+ *result = -1; |
+ char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); |
+ const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); |
+ memcpy(name, kAttrib2Name, kNameSize); |
+ GetAttribLocation cmd; |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(kAttrib2Location, *result); |
+ *result = -1; |
+ memcpy(name, kNonExistentName, kNonExistentNameSize); |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNonExistentNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationInvalidArgs) { |
+ const uint32 kNameSize = strlen(kAttrib2Name); |
+ const char* kBadName = "foo\abar"; |
+ const uint32 kBadNameSize = strlen(kBadName); |
+ typedef GetAttribLocation::Result Result; |
+ Result* result = GetSharedMemoryAs<Result*>(); |
+ *result = -1; |
+ char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); |
+ const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); |
+ memcpy(name, kAttrib2Name, kNameSize); |
+ GetAttribLocation cmd; |
+ cmd.Init(kInvalidClientId, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+ *result = -1; |
+ cmd.Init(client_program_id_, |
+ kInvalidSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kInvalidSharedMemoryOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kInvalidSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kInvalidSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kSharedBufferSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ memcpy(name, kBadName, kBadNameSize); |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kBadNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationBucket) { |
+ const uint32 kBucketId = 123; |
+ const char* kNonExistentName = "foobar"; |
+ typedef GetAttribLocationBucket::Result Result; |
+ Result* result = GetSharedMemoryAs<Result*>(); |
+ SetBucketAsCString(kBucketId, kAttrib2Name); |
+ *result = -1; |
+ GetAttribLocationBucket cmd; |
+ cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(kAttrib2Location, *result); |
+ SetBucketAsCString(kBucketId, kNonExistentName); |
+ *result = -1; |
+ cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationBucketInvalidArgs) { |
+ const uint32 kBucketId = 123; |
+ typedef GetAttribLocationBucket::Result Result; |
+ Result* result = GetSharedMemoryAs<Result*>(); |
+ *result = -1; |
+ GetAttribLocationBucket cmd; |
+ // Check no bucket |
+ cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ // Check bad program id. |
+ SetBucketAsCString(kBucketId, kAttrib2Name); |
+ cmd.Init(kInvalidClientId, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
+ *result = -1; |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+ // Check bad memory |
+ cmd.Init(client_program_id_, |
+ kBucketId, |
+ kInvalidSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ cmd.Init(client_program_id_, |
+ kBucketId, |
+ kSharedMemoryId, |
+ kInvalidSharedMemoryOffset); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformLocation) { |
+ const uint32 kNameSize = strlen(kUniform2Name); |
+ const char* kNonExistentName = "foobar"; |
+ const uint32 kNonExistentNameSize = strlen(kNonExistentName); |
+ typedef GetUniformLocation::Result Result; |
+ Result* result = GetSharedMemoryAs<Result*>(); |
+ *result = -1; |
+ char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); |
+ const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); |
+ memcpy(name, kUniform2Name, kNameSize); |
+ GetUniformLocation cmd; |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(kUniform2FakeLocation, *result); |
+ memcpy(name, kNonExistentName, kNonExistentNameSize); |
+ *result = -1; |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNonExistentNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationInvalidArgs) { |
+ const uint32 kNameSize = strlen(kUniform2Name); |
+ const char* kBadName = "foo\abar"; |
+ const uint32 kBadNameSize = strlen(kBadName); |
+ typedef GetUniformLocation::Result Result; |
+ Result* result = GetSharedMemoryAs<Result*>(); |
+ *result = -1; |
+ char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); |
+ const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); |
+ memcpy(name, kUniform2Name, kNameSize); |
+ GetUniformLocation cmd; |
+ cmd.Init(kInvalidClientId, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+ *result = -1; |
+ cmd.Init(client_program_id_, |
+ kInvalidSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kInvalidSharedMemoryOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kInvalidSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kInvalidSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kSharedBufferSize); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ memcpy(name, kBadName, kBadNameSize); |
+ cmd.Init(client_program_id_, |
+ kSharedMemoryId, |
+ kNameOffset, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kBadNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationBucket) { |
+ const uint32 kBucketId = 123; |
+ const char* kNonExistentName = "foobar"; |
+ typedef GetUniformLocationBucket::Result Result; |
+ Result* result = GetSharedMemoryAs<Result*>(); |
+ SetBucketAsCString(kBucketId, kUniform2Name); |
+ *result = -1; |
+ GetUniformLocationBucket cmd; |
+ cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(kUniform2FakeLocation, *result); |
+ SetBucketAsCString(kBucketId, kNonExistentName); |
+ *result = -1; |
+ cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationBucketInvalidArgs) { |
+ const uint32 kBucketId = 123; |
+ typedef GetUniformLocationBucket::Result Result; |
+ Result* result = GetSharedMemoryAs<Result*>(); |
+ *result = -1; |
+ GetUniformLocationBucket cmd; |
+ // Check no bucket |
+ cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ // Check bad program id. |
+ SetBucketAsCString(kBucketId, kUniform2Name); |
+ cmd.Init(kInvalidClientId, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
+ *result = -1; |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(-1, *result); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+ // Check bad memory |
+ cmd.Init(client_program_id_, |
+ kBucketId, |
+ kInvalidSharedMemoryId, |
+ kSharedMemoryOffset); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ cmd.Init(client_program_id_, |
+ kBucketId, |
+ kSharedMemoryId, |
+ kInvalidSharedMemoryOffset); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_F(GLES2DecoderWithShaderTest, BindUniformLocationCHROMIUM) { |
+ const GLint kLocation = 2; |
+ const char* kName = "testing"; |
+ const uint32 kNameSize = strlen(kName); |
+ const char* kBadName1 = "gl_testing"; |
+ const uint32 kBadName1Size = strlen(kBadName1); |
+ const char* kBadName2 = "testing[1]"; |
+ const uint32 kBadName2Size = strlen(kBadName2); |
+ memcpy(shared_memory_address_, kName, kNameSize); |
+ BindUniformLocationCHROMIUM cmd; |
+ cmd.Init(client_program_id_, |
+ kLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+ // check negative location |
+ memcpy(shared_memory_address_, kName, kNameSize); |
+ cmd.Init( |
+ client_program_id_, -1, kSharedMemoryId, kSharedMemoryOffset, kNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+ // check highest location |
+ memcpy(shared_memory_address_, kName, kNameSize); |
+ GLint kMaxLocation = |
+ (kMaxFragmentUniformVectors + kMaxVertexUniformVectors) * 4 - 1; |
+ cmd.Init(client_program_id_, |
+ kMaxLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+ // check too high location |
+ memcpy(shared_memory_address_, kName, kNameSize); |
+ cmd.Init(client_program_id_, |
+ kMaxLocation + 1, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kNameSize); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+ // check bad name "gl_..." |
+ memcpy(shared_memory_address_, kBadName1, kBadName1Size); |
+ cmd.Init(client_program_id_, |
+ kLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kBadName1Size); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+ // check bad name "name[1]" non zero |
+ memcpy(shared_memory_address_, kBadName2, kBadName2Size); |
+ cmd.Init(client_program_id_, |
+ kLocation, |
+ kSharedMemoryId, |
+ kSharedMemoryOffset, |
+ kBadName2Size); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+ |
+TEST_F(GLES2DecoderManualInitTest, ClearUniformsBeforeFirstProgramUse) { |
+ CommandLine command_line(0, NULL); |
+ command_line.AppendSwitchASCII( |
+ switches::kGpuDriverBugWorkarounds, |
+ base::IntToString(gpu::CLEAR_UNIFORMS_BEFORE_FIRST_PROGRAM_USE)); |
+ InitState init; |
+ init.gl_version = "3.0"; |
+ init.has_alpha = true; |
+ init.request_alpha = true; |
+ init.bind_generates_resource = true; |
+ InitDecoderWithCommandLine(init, &command_line); |
+ { |
+ static AttribInfo attribs[] = { |
+ { |
+ kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, |
+ }, |
+ { |
+ kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, |
+ }, |
+ { |
+ kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, |
+ }, |
+ }; |
+ static UniformInfo uniforms[] = { |
+ {kUniform1Name, kUniform1Size, kUniform1Type, kUniform1FakeLocation, |
+ kUniform1RealLocation, kUniform1DesiredLocation}, |
+ {kUniform2Name, kUniform2Size, kUniform2Type, kUniform2FakeLocation, |
+ kUniform2RealLocation, kUniform2DesiredLocation}, |
+ {kUniform3Name, kUniform3Size, kUniform3Type, kUniform3FakeLocation, |
+ kUniform3RealLocation, kUniform3DesiredLocation}, |
+ }; |
+ SetupShader(attribs, |
+ arraysize(attribs), |
+ uniforms, |
+ arraysize(uniforms), |
+ client_program_id_, |
+ kServiceProgramId, |
+ client_vertex_shader_id_, |
+ kServiceVertexShaderId, |
+ client_fragment_shader_id_, |
+ kServiceFragmentShaderId); |
+ TestHelper::SetupExpectationsForClearingUniforms( |
+ gl_.get(), uniforms, arraysize(uniforms)); |
+ } |
+ |
+ { |
+ EXPECT_CALL(*gl_, UseProgram(kServiceProgramId)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ cmds::UseProgram cmd; |
+ cmd.Init(client_program_id_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ } |
+} |
+ |
+// TODO(gman): DeleteProgram |
+ |
+// TODO(gman): UseProgram |
+ |
+// TODO(gman): DeleteShader |
+ |
+} // namespace gles2 |
+} // namespace gpu |