| Index: gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
|
| ===================================================================
|
| --- gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc (revision 37873)
|
| +++ gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc (working copy)
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
|
| #include "gpu/command_buffer/common/gles2_cmd_format.h"
|
| +#include "gpu/command_buffer/common/gles2_cmd_utils.h"
|
| #include "gpu/command_buffer/service/gl_mock.h"
|
| #include "gpu/command_buffer/service/cmd_buffer_engine.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| @@ -288,6 +289,12 @@
|
| *gl_,
|
| GetProgramiv(kServiceProgramId, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, _))
|
| .WillOnce(SetArgumentPointee<2>(0));
|
| + EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORMS, _))
|
| + .WillOnce(SetArgumentPointee<2>(0));
|
| + EXPECT_CALL(
|
| + *gl_,
|
| + GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORM_MAX_LENGTH, _))
|
| + .WillOnce(SetArgumentPointee<2>(0));
|
| };
|
|
|
|
|
| @@ -297,8 +304,6 @@
|
| : GLES2DecoderTest() {
|
| }
|
|
|
| - static const GLint kNumAttribs = 3;
|
| - static const GLint kMaxAttribLength = 10;
|
| static const GLsizei kNumVertices = 100;
|
| static const GLsizei kNumIndices = 10;
|
| static const int kValidIndexRangeStart = 1;
|
| @@ -306,9 +311,26 @@
|
| static const int kInvalidIndexRangeStart = 0;
|
| static const int kInvalidIndexRangeCount = 7;
|
| static const int kOutOfRangeIndexRangeEnd = 10;
|
| + static const GLint kNumAttribs = 3;
|
| + static const GLint kMaxAttribLength = 10;
|
| static const char* kAttrib1Name;
|
| static const char* kAttrib2Name;
|
| static const char* kAttrib3Name;
|
| + static const GLint kNumUniforms = 3;
|
| + static const GLint kMaxUniformLength = 10;
|
| + static const char* kUniform1Name;
|
| + static const char* kUniform2Name;
|
| + static const char* kUniform3Name;
|
| + static const GLint kUniform1Size = 1;
|
| + static const GLint kUniform2Size = 3;
|
| + static const GLint kUniform3Size = 2;
|
| + static const GLint kUniform1Location = 0;
|
| + static const GLint kUniform2Location = 1;
|
| + static const GLint kUniform3Location = 2;
|
| + static const GLenum kUniform1Type = GL_FLOAT_VEC4;
|
| + static const GLenum kUniform2Type = GL_INT_VEC2;
|
| + static const GLenum kUniform3Type = GL_FLOAT_VEC3;
|
| + static const GLint kInvalidUniformLocation = 3;
|
|
|
| protected:
|
| virtual void SetUp() {
|
| @@ -326,30 +348,42 @@
|
| { kAttrib2Name, 1, GL_FLOAT_VEC2, 1, },
|
| { kAttrib3Name, 1, GL_FLOAT_VEC3, 2, },
|
| };
|
| + struct UniformInfo {
|
| + const char* name;
|
| + GLint size;
|
| + GLenum type;
|
| + GLint location;
|
| + };
|
| + static UniformInfo uniforms[] = {
|
| + { kUniform1Name, kUniform1Size, GL_FLOAT_VEC4, kUniform1Location, },
|
| + { kUniform2Name, kUniform2Size, GL_INT_VEC2, kUniform2Location, },
|
| + { kUniform3Name, kUniform3Size, GL_FLOAT_VEC3, kUniform3Location, },
|
| + };
|
| +
|
| LinkProgram cmd;
|
| cmd.Init(client_program_id_);
|
|
|
| - EXPECT_CALL(*gl_, LinkProgram(kServiceProgramId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_,
|
| - GetProgramiv(kServiceProgramId, GL_ACTIVE_ATTRIBUTES, _))
|
| - .WillOnce(SetArgumentPointee<2>(kNumAttribs))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_,
|
| - GetProgramiv(kServiceProgramId, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, _))
|
| - .WillOnce(SetArgumentPointee<2>(kMaxAttribLength))
|
| - .RetiresOnSaturation();
|
| {
|
| InSequence s;
|
| + EXPECT_CALL(*gl_, LinkProgram(kServiceProgramId))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, GetError())
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_,
|
| + GetProgramiv(kServiceProgramId, GL_ACTIVE_ATTRIBUTES, _))
|
| + .WillOnce(SetArgumentPointee<2>(kNumAttribs))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_,
|
| + GetProgramiv(kServiceProgramId, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, _))
|
| + .WillOnce(SetArgumentPointee<2>(kMaxAttribLength))
|
| + .RetiresOnSaturation();
|
| for (GLint ii = 0; ii < kNumAttribs; ++ii) {
|
| const AttribInfo& info = attribs[ii];
|
| EXPECT_CALL(*gl_,
|
| GetActiveAttrib(kServiceProgramId, ii,
|
| - kMaxAttribLength + 1, _, _, _, _))
|
| + kMaxAttribLength, _, _, _, _))
|
| .WillOnce(DoAll(
|
| SetArgumentPointee<3>(strlen(info.name)),
|
| SetArgumentPointee<4>(info.size),
|
| @@ -362,6 +396,31 @@
|
| .WillOnce(Return(info.location))
|
| .RetiresOnSaturation();
|
| }
|
| + EXPECT_CALL(*gl_,
|
| + GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORMS, _))
|
| + .WillOnce(SetArgumentPointee<2>(kNumUniforms))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_,
|
| + GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORM_MAX_LENGTH, _))
|
| + .WillOnce(SetArgumentPointee<2>(kMaxUniformLength))
|
| + .RetiresOnSaturation();
|
| + for (GLint ii = 0; ii < kNumUniforms; ++ii) {
|
| + const UniformInfo& info = uniforms[ii];
|
| + EXPECT_CALL(*gl_,
|
| + GetActiveUniform(kServiceProgramId, ii,
|
| + kMaxUniformLength, _, _, _, _))
|
| + .WillOnce(DoAll(
|
| + SetArgumentPointee<3>(strlen(info.name)),
|
| + SetArgumentPointee<4>(info.size),
|
| + SetArgumentPointee<5>(info.type),
|
| + SetArrayArgument<6>(info.name,
|
| + info.name + strlen(info.name) + 1)))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, GetUniformLocation(kServiceProgramId,
|
| + StrEq(info.name)))
|
| + .WillOnce(Return(info.location))
|
| + .RetiresOnSaturation();
|
| + }
|
| }
|
|
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| @@ -493,6 +552,9 @@
|
| const char* GLES2DecoderWithShaderTest::kAttrib1Name = "attrib1";
|
| const char* GLES2DecoderWithShaderTest::kAttrib2Name = "attrib2";
|
| const char* GLES2DecoderWithShaderTest::kAttrib3Name = "attrib3";
|
| +const char* GLES2DecoderWithShaderTest::kUniform1Name = "uniform1";
|
| +const char* GLES2DecoderWithShaderTest::kUniform2Name = "uniform2";
|
| +const char* GLES2DecoderWithShaderTest::kUniform3Name = "uniform3";
|
|
|
| TEST_F(GLES2DecoderWithShaderTest, DrawArraysNoAttributesSucceeds) {
|
| EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| @@ -790,7 +852,144 @@
|
| EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| }
|
|
|
| +TEST_F(GLES2DecoderWithShaderTest, GetUniformivSucceeds) {
|
| + GetUniformiv cmd;
|
| + cmd.Init(client_program_id_, kUniform2Location,
|
| + kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_CALL(*gl_, GetUniformiv(kServiceProgramId, kUniform2Location, _))
|
| + .Times(1);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(kUniform2Size * GLES2Util::GetGLDataTypeSize(kUniform2Type),
|
| + result_->size);
|
| +}
|
|
|
| +TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadProgramFails) {
|
| + GetUniformiv cmd;
|
| + // non-existant program
|
| + cmd.Init(kInvalidClientId, kUniform2Location,
|
| + kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_CALL(*gl_, GetUniformiv(_, _, _))
|
| + .Times(0);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(0, 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.
|
| + result_->size = kInitialResult;
|
| + cmd.Init(client_texture_id_, kUniform2Location,
|
| + kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(0, result_->size);
|
| + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| + // 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, kUniform2Location,
|
| + kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(0, result_->size);
|
| + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| +}
|
| +
|
| +TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadLocationFails) {
|
| + 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(0, result_->size);
|
| + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| +}
|
| +
|
| +TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadSharedMemoryFails) {
|
| + GetUniformiv cmd;
|
| + cmd.Init(client_program_id_, kUniform2Location,
|
| + kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_CALL(*gl_, GetUniformiv(_, _, _))
|
| + .Times(0);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| + cmd.Init(client_program_id_, kUniform2Location,
|
| + kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| +};
|
| +
|
| +TEST_F(GLES2DecoderWithShaderTest, GetUniformfvSucceeds) {
|
| + GetUniformfv cmd;
|
| + cmd.Init(client_program_id_, kUniform2Location,
|
| + kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_CALL(*gl_, GetUniformfv(kServiceProgramId, kUniform2Location, _))
|
| + .Times(1);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(kUniform2Size * GLES2Util::GetGLDataTypeSize(kUniform2Type),
|
| + result_->size);
|
| +}
|
| +
|
| +TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadProgramFails) {
|
| + GetUniformfv cmd;
|
| + // non-existant program
|
| + cmd.Init(kInvalidClientId, kUniform2Location,
|
| + kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_CALL(*gl_, GetUniformfv(_, _, _))
|
| + .Times(0);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(0, 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.
|
| + result_->size = kInitialResult;
|
| + cmd.Init(client_texture_id_, kUniform2Location,
|
| + kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(0, result_->size);
|
| + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| + // 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, kUniform2Location,
|
| + kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(0, result_->size);
|
| + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| +}
|
| +
|
| +TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadLocationFails) {
|
| + 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(0, result_->size);
|
| + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| +}
|
| +
|
| +TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadSharedMemoryFails) {
|
| + GetUniformfv cmd;
|
| + cmd.Init(client_program_id_, kUniform2Location,
|
| + kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_CALL(*gl_, GetUniformfv(_, _, _))
|
| + .Times(0);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| + cmd.Init(client_program_id_, kUniform2Location,
|
| + kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| +};
|
| +
|
| #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_autogen.h"
|
|
|
| } // namespace gles2
|
|
|