Index: gpu/command_buffer/client/gles2_implementation_unittest.cc |
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc |
index be1f1a3a9a4319b48d282eead89d8784a127713f..5c944a873520c586a091e20533a75de75f076c1d 100644 |
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc |
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc |
@@ -383,6 +383,7 @@ class GLES2ImplementationTest : public testing::Test { |
static const GLuint kTexturesStartId = 1; |
static const GLuint kQueriesStartId = 1; |
static const GLuint kVertexArraysStartId = 1; |
+ static const GLuint kValuebuffersStartId = 1; |
typedef MockTransferBuffer::ExpectedMemoryInfo ExpectedMemoryInfo; |
@@ -408,43 +409,36 @@ class GLES2ImplementationTest : public testing::Test { |
helper_->Initialize(kCommandBufferSizeBytes); |
gpu_control_.reset(new StrictMock<MockClientGpuControl>()); |
- EXPECT_CALL(*gpu_control_, GetCapabilities()) |
- .WillOnce(testing::Return(Capabilities())); |
- |
- GLES2Implementation::GLStaticState state; |
- GLES2Implementation::GLStaticState::IntState& int_state = state.int_state; |
- int_state.max_combined_texture_image_units = |
+ Capabilities capabilities; |
+ capabilities.VisitPrecisions( |
+ [](GLenum shader, GLenum type, |
+ Capabilities::ShaderPrecision* precision) { |
+ precision->min_range = 3; |
+ precision->max_range = 5; |
+ precision->precision = 7; |
+ }); |
+ capabilities.max_combined_texture_image_units = |
kMaxCombinedTextureImageUnits; |
- int_state.max_cube_map_texture_size = kMaxCubeMapTextureSize; |
- int_state.max_fragment_uniform_vectors = kMaxFragmentUniformVectors; |
- int_state.max_renderbuffer_size = kMaxRenderbufferSize; |
- int_state.max_texture_image_units = kMaxTextureImageUnits; |
- int_state.max_texture_size = kMaxTextureSize; |
- int_state.max_varying_vectors = kMaxVaryingVectors; |
- int_state.max_vertex_attribs = kMaxVertexAttribs; |
- int_state.max_vertex_texture_image_units = kMaxVertexTextureImageUnits; |
- int_state.max_vertex_uniform_vectors = kMaxVertexUniformVectors; |
- int_state.num_compressed_texture_formats = kNumCompressedTextureFormats; |
- int_state.num_shader_binary_formats = kNumShaderBinaryFormats; |
- int_state.bind_generates_resource_chromium = |
+ capabilities.max_cube_map_texture_size = kMaxCubeMapTextureSize; |
+ capabilities.max_fragment_uniform_vectors = kMaxFragmentUniformVectors; |
+ capabilities.max_renderbuffer_size = kMaxRenderbufferSize; |
+ capabilities.max_texture_image_units = kMaxTextureImageUnits; |
+ capabilities.max_texture_size = kMaxTextureSize; |
+ capabilities.max_varying_vectors = kMaxVaryingVectors; |
+ capabilities.max_vertex_attribs = kMaxVertexAttribs; |
+ capabilities.max_vertex_texture_image_units = kMaxVertexTextureImageUnits; |
+ capabilities.max_vertex_uniform_vectors = kMaxVertexUniformVectors; |
+ capabilities.num_compressed_texture_formats = |
+ kNumCompressedTextureFormats; |
+ capabilities.num_shader_binary_formats = kNumShaderBinaryFormats; |
+ capabilities.bind_generates_resource_chromium = |
bind_generates_resource_service ? 1 : 0; |
- |
- // This just happens to work for now because IntState has 1 GLint per |
- // state. |
- // If IntState gets more complicated this code will need to get more |
- // complicated. |
- ExpectedMemoryInfo mem1 = transfer_buffer_->GetExpectedMemory( |
- sizeof(GLES2Implementation::GLStaticState::IntState) * 2 + |
- sizeof(cmds::GetShaderPrecisionFormat::Result) * 12); |
+ EXPECT_CALL(*gpu_control_, GetCapabilities()) |
+ .WillOnce(testing::Return(capabilities)); |
{ |
InSequence sequence; |
- EXPECT_CALL(*command_buffer_, OnFlush()) |
- .WillOnce(SetMemory(mem1.ptr + sizeof(int_state), int_state)) |
- .RetiresOnSaturation(); |
- GetNextToken(); // eat the token that starting up will use. |
- |
const bool support_client_side_arrays = true; |
gl_.reset(new GLES2Implementation(helper_.get(), |
share_group, |
@@ -461,7 +455,6 @@ class GLES2ImplementationTest : public testing::Test { |
return false; |
} |
- EXPECT_CALL(*command_buffer_, OnFlush()).Times(1).RetiresOnSaturation(); |
helper_->CommandBufferHelper::Finish(); |
::testing::Mock::VerifyAndClearExpectations(gl_.get()); |
@@ -755,6 +748,7 @@ const GLuint GLES2ImplementationTest::kRenderbuffersStartId; |
const GLuint GLES2ImplementationTest::kTexturesStartId; |
const GLuint GLES2ImplementationTest::kQueriesStartId; |
const GLuint GLES2ImplementationTest::kVertexArraysStartId; |
+const GLuint GLES2ImplementationTest::kValuebuffersStartId; |
#endif |
TEST_F(GLES2ImplementationTest, Basic) { |
@@ -817,20 +811,22 @@ TEST_F(GLES2ImplementationTest, GetShaderPrecisionFormat) { |
cmds::GetShaderPrecisionFormat cmd; |
}; |
typedef cmds::GetShaderPrecisionFormat::Result Result; |
+ const unsigned kDummyType1 = 3; |
+ const unsigned kDummyType2 = 4; |
- // The first call for mediump should trigger a command buffer request. |
+ // The first call for dummy type 1 should trigger a command buffer request. |
GLint range1[2] = {0, 0}; |
GLint precision1 = 0; |
Cmds expected1; |
ExpectedMemoryInfo client_result1 = GetExpectedResultMemory(4); |
- expected1.cmd.Init(GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT, |
- client_result1.id, client_result1.offset); |
+ expected1.cmd.Init(GL_FRAGMENT_SHADER, kDummyType1, client_result1.id, |
+ client_result1.offset); |
Result server_result1 = {true, 14, 14, 10}; |
EXPECT_CALL(*command_buffer(), OnFlush()) |
.WillOnce(SetMemory(client_result1.ptr, server_result1)) |
.RetiresOnSaturation(); |
- gl_->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT, |
- range1, &precision1); |
+ gl_->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, kDummyType1, range1, |
+ &precision1); |
const void* commands2 = GetPut(); |
EXPECT_NE(commands_, commands2); |
EXPECT_EQ(0, memcmp(&expected1, commands_, sizeof(expected1))); |
@@ -838,39 +834,53 @@ TEST_F(GLES2ImplementationTest, GetShaderPrecisionFormat) { |
EXPECT_EQ(range1[1], 14); |
EXPECT_EQ(precision1, 10); |
- // The second call for mediump should use the cached value and avoid |
+ // The second call for dummy type 1 should use the cached value and avoid |
// triggering a command buffer request, so we do not expect a call to |
// OnFlush() here. We do expect the results to be correct though. |
GLint range2[2] = {0, 0}; |
GLint precision2 = 0; |
- gl_->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT, |
- range2, &precision2); |
+ gl_->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, kDummyType1, range2, |
+ &precision2); |
const void* commands3 = GetPut(); |
EXPECT_EQ(commands2, commands3); |
EXPECT_EQ(range2[0], 14); |
EXPECT_EQ(range2[1], 14); |
EXPECT_EQ(precision2, 10); |
- // If we then make a request for highp, we should get another command |
+ // If we then make a request for dummy type 2, we should get another command |
// buffer request since it hasn't been cached yet. |
GLint range3[2] = {0, 0}; |
GLint precision3 = 0; |
Cmds expected3; |
ExpectedMemoryInfo result3 = GetExpectedResultMemory(4); |
- expected3.cmd.Init(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, |
- result3.id, result3.offset); |
+ expected3.cmd.Init(GL_FRAGMENT_SHADER, kDummyType2, result3.id, |
+ result3.offset); |
Result result3_source = {true, 62, 62, 16}; |
EXPECT_CALL(*command_buffer(), OnFlush()) |
.WillOnce(SetMemory(result3.ptr, result3_source)) |
.RetiresOnSaturation(); |
- gl_->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, |
- range3, &precision3); |
+ gl_->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, kDummyType2, range3, |
+ &precision3); |
const void* commands4 = GetPut(); |
EXPECT_NE(commands3, commands4); |
EXPECT_EQ(0, memcmp(&expected3, commands3, sizeof(expected3))); |
EXPECT_EQ(range3[0], 62); |
EXPECT_EQ(range3[1], 62); |
EXPECT_EQ(precision3, 16); |
+ |
+ // Any call for predefined types should use the cached value from the |
+ // Capabilities and avoid triggering a command buffer request, so we do not |
+ // expect a call to OnFlush() here. We do expect the results to be correct |
+ // though. |
+ GLint range4[2] = {0, 0}; |
+ GLint precision4 = 0; |
+ gl_->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT, range4, |
+ &precision4); |
+ const void* commands5 = GetPut(); |
+ EXPECT_EQ(commands4, commands5); |
+ EXPECT_EQ(range4[0], 3); |
+ EXPECT_EQ(range4[1], 5); |
+ EXPECT_EQ(precision4, 7); |
} |
TEST_F(GLES2ImplementationTest, ShaderSource) { |
@@ -1947,122 +1957,6 @@ TEST_F(GLES2ImplementationTest, MapUnmapTexSubImage2DCHROMIUMBadArgs) { |
EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); |
} |
-TEST_F(GLES2ImplementationTest, GetMultipleIntegervCHROMIUMValidArgs) { |
- const GLenum pnames[] = { |
- GL_DEPTH_WRITEMASK, |
- GL_COLOR_WRITEMASK, |
- GL_STENCIL_WRITEMASK, |
- }; |
- const GLint num_results = 6; |
- GLint results[num_results + 1]; |
- struct Cmds { |
- cmds::GetMultipleIntegervCHROMIUM get_multiple; |
- cmd::SetToken set_token; |
- }; |
- const GLsizei kNumPnames = arraysize(pnames); |
- const GLsizeiptr kResultsSize = num_results * sizeof(results[0]); |
- const size_t kPNamesSize = kNumPnames * sizeof(pnames[0]); |
- |
- ExpectedMemoryInfo mem1 = GetExpectedMemory(kPNamesSize + kResultsSize); |
- ExpectedMemoryInfo result1 = GetExpectedResultMemory( |
- sizeof(cmds::GetError::Result)); |
- |
- const uint32 kPnamesOffset = mem1.offset; |
- const uint32 kResultsOffset = mem1.offset + kPNamesSize; |
- Cmds expected; |
- expected.get_multiple.Init( |
- mem1.id, kPnamesOffset, kNumPnames, |
- mem1.id, kResultsOffset, kResultsSize); |
- expected.set_token.Init(GetNextToken()); |
- |
- const GLint kSentinel = 0x12345678; |
- memset(results, 0, sizeof(results)); |
- results[num_results] = kSentinel; |
- const GLint returned_results[] = { |
- 1, 0, 1, 0, 1, -1, |
- }; |
- // One call to flush to wait for results |
- EXPECT_CALL(*command_buffer(), OnFlush()) |
- .WillOnce(SetMemoryFromArray(mem1.ptr + kPNamesSize, |
- returned_results, sizeof(returned_results))) |
- .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR))) |
- .RetiresOnSaturation(); |
- |
- gl_->GetMultipleIntegervCHROMIUM( |
- &pnames[0], kNumPnames, &results[0], kResultsSize); |
- EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
- EXPECT_EQ(0, memcmp(&returned_results, results, sizeof(returned_results))); |
- EXPECT_EQ(kSentinel, results[num_results]); |
- EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError()); |
-} |
- |
-TEST_F(GLES2ImplementationTest, GetMultipleIntegervCHROMIUMBadArgs) { |
- GLenum pnames[] = { |
- GL_DEPTH_WRITEMASK, |
- GL_COLOR_WRITEMASK, |
- GL_STENCIL_WRITEMASK, |
- }; |
- const GLint num_results = 6; |
- GLint results[num_results + 1]; |
- const GLsizei kNumPnames = arraysize(pnames); |
- const GLsizeiptr kResultsSize = num_results * sizeof(results[0]); |
- |
- ExpectedMemoryInfo result1 = |
- GetExpectedResultMemory(sizeof(cmds::GetError::Result)); |
- ExpectedMemoryInfo result2 = |
- GetExpectedResultMemory(sizeof(cmds::GetError::Result)); |
- ExpectedMemoryInfo result3 = |
- GetExpectedResultMemory(sizeof(cmds::GetError::Result)); |
- ExpectedMemoryInfo result4 = |
- GetExpectedResultMemory(sizeof(cmds::GetError::Result)); |
- |
- // Calls to flush to wait for GetError |
- EXPECT_CALL(*command_buffer(), OnFlush()) |
- .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR))) |
- .WillOnce(SetMemory(result2.ptr, GLuint(GL_NO_ERROR))) |
- .WillOnce(SetMemory(result3.ptr, GLuint(GL_NO_ERROR))) |
- .WillOnce(SetMemory(result4.ptr, GLuint(GL_NO_ERROR))) |
- .RetiresOnSaturation(); |
- |
- const GLint kSentinel = 0x12345678; |
- memset(results, 0, sizeof(results)); |
- results[num_results] = kSentinel; |
- // try bad size. |
- gl_->GetMultipleIntegervCHROMIUM( |
- &pnames[0], kNumPnames, &results[0], kResultsSize + 1); |
- EXPECT_TRUE(NoCommandsWritten()); |
- EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); |
- EXPECT_EQ(0, results[0]); |
- EXPECT_EQ(kSentinel, results[num_results]); |
- // try bad size. |
- ClearCommands(); |
- gl_->GetMultipleIntegervCHROMIUM( |
- &pnames[0], kNumPnames, &results[0], kResultsSize - 1); |
- EXPECT_TRUE(NoCommandsWritten()); |
- EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); |
- EXPECT_EQ(0, results[0]); |
- EXPECT_EQ(kSentinel, results[num_results]); |
- // try uncleared results. |
- ClearCommands(); |
- results[2] = 1; |
- gl_->GetMultipleIntegervCHROMIUM( |
- &pnames[0], kNumPnames, &results[0], kResultsSize); |
- EXPECT_TRUE(NoCommandsWritten()); |
- EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); |
- EXPECT_EQ(0, results[0]); |
- EXPECT_EQ(kSentinel, results[num_results]); |
- // try bad enum results. |
- ClearCommands(); |
- results[2] = 0; |
- pnames[1] = GL_TRUE; |
- gl_->GetMultipleIntegervCHROMIUM( |
- &pnames[0], kNumPnames, &results[0], kResultsSize); |
- EXPECT_TRUE(NoCommandsWritten()); |
- EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), gl_->GetError()); |
- EXPECT_EQ(0, results[0]); |
- EXPECT_EQ(kSentinel, results[num_results]); |
-} |
- |
TEST_F(GLES2ImplementationTest, GetProgramInfoCHROMIUMGoodArgs) { |
const uint32 kBucketId = GLES2Implementation::kResultBucketId; |
const GLuint kProgramId = 123; |