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

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

Issue 566019: Implements glGetUniformiv and glGetUniformfv. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 11 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
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698