OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 6 |
| 7 #include "base/command_line.h" |
| 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
| 10 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
| 11 #include "gpu/command_buffer/common/id_allocator.h" |
| 12 #include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h" |
| 13 #include "gpu/command_buffer/service/async_pixel_transfer_manager.h" |
| 14 #include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" |
| 15 #include "gpu/command_buffer/service/cmd_buffer_engine.h" |
| 16 #include "gpu/command_buffer/service/context_group.h" |
| 17 #include "gpu/command_buffer/service/context_state.h" |
| 18 #include "gpu/command_buffer/service/gl_surface_mock.h" |
| 19 #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" |
| 20 |
| 21 #include "gpu/command_buffer/service/gpu_switches.h" |
| 22 #include "gpu/command_buffer/service/image_manager.h" |
| 23 #include "gpu/command_buffer/service/mailbox_manager.h" |
| 24 #include "gpu/command_buffer/service/mocks.h" |
| 25 #include "gpu/command_buffer/service/program_manager.h" |
| 26 #include "gpu/command_buffer/service/test_helper.h" |
| 27 #include "testing/gtest/include/gtest/gtest.h" |
| 28 #include "ui/gl/gl_implementation.h" |
| 29 #include "ui/gl/gl_mock.h" |
| 30 #include "ui/gl/gl_surface_stub.h" |
| 31 |
| 32 #if !defined(GL_DEPTH24_STENCIL8) |
| 33 #define GL_DEPTH24_STENCIL8 0x88F0 |
| 34 #endif |
| 35 |
| 36 using ::gfx::MockGLInterface; |
| 37 using ::testing::_; |
| 38 using ::testing::DoAll; |
| 39 using ::testing::InSequence; |
| 40 using ::testing::Invoke; |
| 41 using ::testing::MatcherCast; |
| 42 using ::testing::Mock; |
| 43 using ::testing::Pointee; |
| 44 using ::testing::Return; |
| 45 using ::testing::SaveArg; |
| 46 using ::testing::SetArrayArgument; |
| 47 using ::testing::SetArgumentPointee; |
| 48 using ::testing::SetArgPointee; |
| 49 using ::testing::StrEq; |
| 50 using ::testing::StrictMock; |
| 51 |
| 52 namespace gpu { |
| 53 namespace gles2 { |
| 54 |
| 55 using namespace cmds; |
| 56 |
| 57 TEST_F(GLES2DecoderWithShaderTest, GetProgramInfoCHROMIUMValidArgs) { |
| 58 const uint32 kBucketId = 123; |
| 59 GetProgramInfoCHROMIUM cmd; |
| 60 cmd.Init(client_program_id_, kBucketId); |
| 61 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 62 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); |
| 63 EXPECT_GT(bucket->size(), 0u); |
| 64 } |
| 65 |
| 66 TEST_F(GLES2DecoderWithShaderTest, GetProgramInfoCHROMIUMInvalidArgs) { |
| 67 const uint32 kBucketId = 123; |
| 68 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); |
| 69 EXPECT_TRUE(bucket == NULL); |
| 70 GetProgramInfoCHROMIUM cmd; |
| 71 cmd.Init(kInvalidClientId, kBucketId); |
| 72 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 73 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 74 bucket = decoder_->GetBucket(kBucketId); |
| 75 ASSERT_TRUE(bucket != NULL); |
| 76 EXPECT_EQ(sizeof(ProgramInfoHeader), bucket->size()); |
| 77 ProgramInfoHeader* info = |
| 78 bucket->GetDataAs<ProgramInfoHeader*>(0, sizeof(ProgramInfoHeader)); |
| 79 ASSERT_TRUE(info != 0); |
| 80 EXPECT_EQ(0u, info->link_status); |
| 81 EXPECT_EQ(0u, info->num_attribs); |
| 82 EXPECT_EQ(0u, info->num_uniforms); |
| 83 } |
| 84 |
| 85 TEST_F(GLES2DecoderWithShaderTest, GetUniformivSucceeds) { |
| 86 GetUniformiv::Result* result = |
| 87 static_cast<GetUniformiv::Result*>(shared_memory_address_); |
| 88 result->size = 0; |
| 89 GetUniformiv cmd; |
| 90 cmd.Init(client_program_id_, |
| 91 kUniform2FakeLocation, |
| 92 kSharedMemoryId, |
| 93 kSharedMemoryOffset); |
| 94 EXPECT_CALL(*gl_, GetUniformiv(kServiceProgramId, kUniform2RealLocation, _)) |
| 95 .Times(1); |
| 96 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 97 EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), |
| 98 result->size); |
| 99 } |
| 100 |
| 101 TEST_F(GLES2DecoderWithShaderTest, GetUniformivArrayElementSucceeds) { |
| 102 GetUniformiv::Result* result = |
| 103 static_cast<GetUniformiv::Result*>(shared_memory_address_); |
| 104 result->size = 0; |
| 105 GetUniformiv cmd; |
| 106 cmd.Init(client_program_id_, |
| 107 kUniform2ElementFakeLocation, |
| 108 kSharedMemoryId, |
| 109 kSharedMemoryOffset); |
| 110 EXPECT_CALL(*gl_, |
| 111 GetUniformiv(kServiceProgramId, kUniform2ElementRealLocation, _)) |
| 112 .Times(1); |
| 113 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 114 EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), |
| 115 result->size); |
| 116 } |
| 117 |
| 118 TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadProgramFails) { |
| 119 GetUniformiv::Result* result = |
| 120 static_cast<GetUniformiv::Result*>(shared_memory_address_); |
| 121 result->size = 0; |
| 122 GetUniformiv cmd; |
| 123 // non-existant program |
| 124 cmd.Init(kInvalidClientId, |
| 125 kUniform2FakeLocation, |
| 126 kSharedMemoryId, |
| 127 kSharedMemoryOffset); |
| 128 EXPECT_CALL(*gl_, GetUniformiv(_, _, _)).Times(0); |
| 129 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 130 EXPECT_EQ(0U, result->size); |
| 131 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 132 // Valid id that is not a program. The GL spec requires a different error for |
| 133 // this case. |
| 134 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 135 result->size = kInitialResult; |
| 136 cmd.Init(client_shader_id_, |
| 137 kUniform2FakeLocation, |
| 138 kSharedMemoryId, |
| 139 kSharedMemoryOffset); |
| 140 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 141 EXPECT_EQ(0U, result->size); |
| 142 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 143 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 144 // Unlinked program |
| 145 EXPECT_CALL(*gl_, CreateProgram()) |
| 146 .Times(1) |
| 147 .WillOnce(Return(kNewServiceId)) |
| 148 .RetiresOnSaturation(); |
| 149 CreateProgram cmd2; |
| 150 cmd2.Init(kNewClientId); |
| 151 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); |
| 152 result->size = kInitialResult; |
| 153 cmd.Init(kNewClientId, |
| 154 kUniform2FakeLocation, |
| 155 kSharedMemoryId, |
| 156 kSharedMemoryOffset); |
| 157 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 158 EXPECT_EQ(0U, result->size); |
| 159 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 160 } |
| 161 |
| 162 TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadLocationFails) { |
| 163 GetUniformiv::Result* result = |
| 164 static_cast<GetUniformiv::Result*>(shared_memory_address_); |
| 165 result->size = 0; |
| 166 GetUniformiv cmd; |
| 167 // invalid location |
| 168 cmd.Init(client_program_id_, |
| 169 kInvalidUniformLocation, |
| 170 kSharedMemoryId, |
| 171 kSharedMemoryOffset); |
| 172 EXPECT_CALL(*gl_, GetUniformiv(_, _, _)).Times(0); |
| 173 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 174 EXPECT_EQ(0U, result->size); |
| 175 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 176 } |
| 177 |
| 178 TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadSharedMemoryFails) { |
| 179 GetUniformiv cmd; |
| 180 cmd.Init(client_program_id_, |
| 181 kUniform2FakeLocation, |
| 182 kInvalidSharedMemoryId, |
| 183 kSharedMemoryOffset); |
| 184 EXPECT_CALL(*gl_, GetUniformiv(_, _, _)).Times(0); |
| 185 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 186 cmd.Init(client_program_id_, |
| 187 kUniform2FakeLocation, |
| 188 kSharedMemoryId, |
| 189 kInvalidSharedMemoryOffset); |
| 190 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 191 }; |
| 192 |
| 193 TEST_F(GLES2DecoderWithShaderTest, GetUniformfvSucceeds) { |
| 194 GetUniformfv::Result* result = |
| 195 static_cast<GetUniformfv::Result*>(shared_memory_address_); |
| 196 result->size = 0; |
| 197 GetUniformfv cmd; |
| 198 cmd.Init(client_program_id_, |
| 199 kUniform2FakeLocation, |
| 200 kSharedMemoryId, |
| 201 kSharedMemoryOffset); |
| 202 EXPECT_CALL(*gl_, GetUniformfv(kServiceProgramId, kUniform2RealLocation, _)) |
| 203 .Times(1); |
| 204 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 205 EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), |
| 206 result->size); |
| 207 } |
| 208 |
| 209 TEST_F(GLES2DecoderWithShaderTest, GetUniformfvArrayElementSucceeds) { |
| 210 GetUniformfv::Result* result = |
| 211 static_cast<GetUniformfv::Result*>(shared_memory_address_); |
| 212 result->size = 0; |
| 213 GetUniformfv cmd; |
| 214 cmd.Init(client_program_id_, |
| 215 kUniform2ElementFakeLocation, |
| 216 kSharedMemoryId, |
| 217 kSharedMemoryOffset); |
| 218 EXPECT_CALL(*gl_, |
| 219 GetUniformfv(kServiceProgramId, kUniform2ElementRealLocation, _)) |
| 220 .Times(1); |
| 221 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 222 EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), |
| 223 result->size); |
| 224 } |
| 225 |
| 226 TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadProgramFails) { |
| 227 GetUniformfv::Result* result = |
| 228 static_cast<GetUniformfv::Result*>(shared_memory_address_); |
| 229 result->size = 0; |
| 230 GetUniformfv cmd; |
| 231 // non-existant program |
| 232 cmd.Init(kInvalidClientId, |
| 233 kUniform2FakeLocation, |
| 234 kSharedMemoryId, |
| 235 kSharedMemoryOffset); |
| 236 EXPECT_CALL(*gl_, GetUniformfv(_, _, _)).Times(0); |
| 237 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 238 EXPECT_EQ(0U, result->size); |
| 239 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 240 // Valid id that is not a program. The GL spec requires a different error for |
| 241 // this case. |
| 242 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 243 result->size = kInitialResult; |
| 244 cmd.Init(client_shader_id_, |
| 245 kUniform2FakeLocation, |
| 246 kSharedMemoryId, |
| 247 kSharedMemoryOffset); |
| 248 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 249 EXPECT_EQ(0U, result->size); |
| 250 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 251 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 252 // Unlinked program |
| 253 EXPECT_CALL(*gl_, CreateProgram()) |
| 254 .Times(1) |
| 255 .WillOnce(Return(kNewServiceId)) |
| 256 .RetiresOnSaturation(); |
| 257 CreateProgram cmd2; |
| 258 cmd2.Init(kNewClientId); |
| 259 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); |
| 260 result->size = kInitialResult; |
| 261 cmd.Init(kNewClientId, |
| 262 kUniform2FakeLocation, |
| 263 kSharedMemoryId, |
| 264 kSharedMemoryOffset); |
| 265 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 266 EXPECT_EQ(0U, result->size); |
| 267 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 268 } |
| 269 |
| 270 TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadLocationFails) { |
| 271 GetUniformfv::Result* result = |
| 272 static_cast<GetUniformfv::Result*>(shared_memory_address_); |
| 273 result->size = 0; |
| 274 GetUniformfv cmd; |
| 275 // invalid location |
| 276 cmd.Init(client_program_id_, |
| 277 kInvalidUniformLocation, |
| 278 kSharedMemoryId, |
| 279 kSharedMemoryOffset); |
| 280 EXPECT_CALL(*gl_, GetUniformfv(_, _, _)).Times(0); |
| 281 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 282 EXPECT_EQ(0U, result->size); |
| 283 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 284 } |
| 285 |
| 286 TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadSharedMemoryFails) { |
| 287 GetUniformfv cmd; |
| 288 cmd.Init(client_program_id_, |
| 289 kUniform2FakeLocation, |
| 290 kInvalidSharedMemoryId, |
| 291 kSharedMemoryOffset); |
| 292 EXPECT_CALL(*gl_, GetUniformfv(_, _, _)).Times(0); |
| 293 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 294 cmd.Init(client_program_id_, |
| 295 kUniform2FakeLocation, |
| 296 kSharedMemoryId, |
| 297 kInvalidSharedMemoryOffset); |
| 298 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 299 }; |
| 300 |
| 301 TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersSucceeds) { |
| 302 GetAttachedShaders cmd; |
| 303 typedef GetAttachedShaders::Result Result; |
| 304 Result* result = static_cast<Result*>(shared_memory_address_); |
| 305 result->size = 0; |
| 306 EXPECT_CALL(*gl_, GetAttachedShaders(kServiceProgramId, 1, _, _)).WillOnce( |
| 307 DoAll(SetArgumentPointee<2>(1), SetArgumentPointee<3>(kServiceShaderId))); |
| 308 cmd.Init(client_program_id_, |
| 309 shared_memory_id_, |
| 310 shared_memory_offset_, |
| 311 Result::ComputeSize(1)); |
| 312 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 313 EXPECT_EQ(1, result->GetNumResults()); |
| 314 EXPECT_EQ(client_shader_id_, result->GetData()[0]); |
| 315 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 316 } |
| 317 |
| 318 TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersResultNotInitFail) { |
| 319 GetAttachedShaders cmd; |
| 320 typedef GetAttachedShaders::Result Result; |
| 321 Result* result = static_cast<Result*>(shared_memory_address_); |
| 322 result->size = 1; |
| 323 EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)).Times(0); |
| 324 cmd.Init(client_program_id_, |
| 325 shared_memory_id_, |
| 326 shared_memory_offset_, |
| 327 Result::ComputeSize(1)); |
| 328 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 329 } |
| 330 |
| 331 TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersBadProgramFails) { |
| 332 GetAttachedShaders cmd; |
| 333 typedef GetAttachedShaders::Result Result; |
| 334 Result* result = static_cast<Result*>(shared_memory_address_); |
| 335 result->size = 0; |
| 336 EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)).Times(0); |
| 337 cmd.Init(kInvalidClientId, |
| 338 shared_memory_id_, |
| 339 shared_memory_offset_, |
| 340 Result::ComputeSize(1)); |
| 341 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 342 EXPECT_EQ(0U, result->size); |
| 343 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 344 } |
| 345 |
| 346 TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersBadSharedMemoryFails) { |
| 347 GetAttachedShaders cmd; |
| 348 typedef GetAttachedShaders::Result Result; |
| 349 cmd.Init(client_program_id_, |
| 350 kInvalidSharedMemoryId, |
| 351 shared_memory_offset_, |
| 352 Result::ComputeSize(1)); |
| 353 EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)).Times(0); |
| 354 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 355 cmd.Init(client_program_id_, |
| 356 shared_memory_id_, |
| 357 kInvalidSharedMemoryOffset, |
| 358 Result::ComputeSize(1)); |
| 359 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 360 } |
| 361 |
| 362 TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatSucceeds) { |
| 363 ScopedGLImplementationSetter gl_impl(::gfx::kGLImplementationEGLGLES2); |
| 364 GetShaderPrecisionFormat cmd; |
| 365 typedef GetShaderPrecisionFormat::Result Result; |
| 366 Result* result = static_cast<Result*>(shared_memory_address_); |
| 367 result->success = 0; |
| 368 const GLint range[2] = {62, 62}; |
| 369 const GLint precision = 16; |
| 370 EXPECT_CALL(*gl_, GetShaderPrecisionFormat(_, _, _, _)) |
| 371 .WillOnce(DoAll(SetArrayArgument<2>(range, range + 2), |
| 372 SetArgumentPointee<3>(precision))) |
| 373 .RetiresOnSaturation(); |
| 374 cmd.Init(GL_VERTEX_SHADER, |
| 375 GL_HIGH_FLOAT, |
| 376 shared_memory_id_, |
| 377 shared_memory_offset_); |
| 378 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 379 EXPECT_NE(0, result->success); |
| 380 EXPECT_EQ(range[0], result->min_range); |
| 381 EXPECT_EQ(range[1], result->max_range); |
| 382 EXPECT_EQ(precision, result->precision); |
| 383 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 384 } |
| 385 |
| 386 TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatResultNotInitFails) { |
| 387 GetShaderPrecisionFormat cmd; |
| 388 typedef GetShaderPrecisionFormat::Result Result; |
| 389 Result* result = static_cast<Result*>(shared_memory_address_); |
| 390 result->success = 1; |
| 391 // NOTE: GL might not be called. There is no Desktop OpenGL equivalent |
| 392 cmd.Init(GL_VERTEX_SHADER, |
| 393 GL_HIGH_FLOAT, |
| 394 shared_memory_id_, |
| 395 shared_memory_offset_); |
| 396 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 397 } |
| 398 |
| 399 TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatBadArgsFails) { |
| 400 typedef GetShaderPrecisionFormat::Result Result; |
| 401 Result* result = static_cast<Result*>(shared_memory_address_); |
| 402 result->success = 0; |
| 403 GetShaderPrecisionFormat cmd; |
| 404 cmd.Init( |
| 405 GL_TEXTURE_2D, GL_HIGH_FLOAT, shared_memory_id_, shared_memory_offset_); |
| 406 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 407 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); |
| 408 result->success = 0; |
| 409 cmd.Init(GL_VERTEX_SHADER, |
| 410 GL_TEXTURE_2D, |
| 411 shared_memory_id_, |
| 412 shared_memory_offset_); |
| 413 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 414 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); |
| 415 } |
| 416 |
| 417 TEST_F(GLES2DecoderWithShaderTest, |
| 418 GetShaderPrecisionFormatBadSharedMemoryFails) { |
| 419 GetShaderPrecisionFormat cmd; |
| 420 cmd.Init(GL_VERTEX_SHADER, |
| 421 GL_HIGH_FLOAT, |
| 422 kInvalidSharedMemoryId, |
| 423 shared_memory_offset_); |
| 424 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 425 cmd.Init(GL_VERTEX_SHADER, |
| 426 GL_TEXTURE_2D, |
| 427 shared_memory_id_, |
| 428 kInvalidSharedMemoryOffset); |
| 429 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 430 } |
| 431 |
| 432 TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformSucceeds) { |
| 433 const GLuint kUniformIndex = 1; |
| 434 const uint32 kBucketId = 123; |
| 435 GetActiveUniform cmd; |
| 436 typedef GetActiveUniform::Result Result; |
| 437 Result* result = static_cast<Result*>(shared_memory_address_); |
| 438 result->success = 0; |
| 439 cmd.Init(client_program_id_, |
| 440 kUniformIndex, |
| 441 kBucketId, |
| 442 shared_memory_id_, |
| 443 shared_memory_offset_); |
| 444 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 445 EXPECT_NE(0, result->success); |
| 446 EXPECT_EQ(kUniform2Size, result->size); |
| 447 EXPECT_EQ(kUniform2Type, result->type); |
| 448 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 449 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); |
| 450 ASSERT_TRUE(bucket != NULL); |
| 451 EXPECT_EQ( |
| 452 0, |
| 453 memcmp( |
| 454 bucket->GetData(0, bucket->size()), kUniform2Name, bucket->size())); |
| 455 } |
| 456 |
| 457 TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformResultNotInitFails) { |
| 458 const GLuint kUniformIndex = 1; |
| 459 const uint32 kBucketId = 123; |
| 460 GetActiveUniform cmd; |
| 461 typedef GetActiveUniform::Result Result; |
| 462 Result* result = static_cast<Result*>(shared_memory_address_); |
| 463 result->success = 1; |
| 464 cmd.Init(client_program_id_, |
| 465 kUniformIndex, |
| 466 kBucketId, |
| 467 shared_memory_id_, |
| 468 shared_memory_offset_); |
| 469 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 470 } |
| 471 |
| 472 TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadProgramFails) { |
| 473 const GLuint kUniformIndex = 1; |
| 474 const uint32 kBucketId = 123; |
| 475 GetActiveUniform cmd; |
| 476 typedef GetActiveUniform::Result Result; |
| 477 Result* result = static_cast<Result*>(shared_memory_address_); |
| 478 result->success = 0; |
| 479 cmd.Init(kInvalidClientId, |
| 480 kUniformIndex, |
| 481 kBucketId, |
| 482 shared_memory_id_, |
| 483 shared_memory_offset_); |
| 484 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 485 EXPECT_EQ(0, result->success); |
| 486 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 487 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 488 result->success = 0; |
| 489 cmd.Init(client_shader_id_, |
| 490 kUniformIndex, |
| 491 kBucketId, |
| 492 shared_memory_id_, |
| 493 shared_memory_offset_); |
| 494 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 495 EXPECT_EQ(0, result->success); |
| 496 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 497 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 498 } |
| 499 |
| 500 TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadIndexFails) { |
| 501 const uint32 kBucketId = 123; |
| 502 GetActiveUniform cmd; |
| 503 typedef GetActiveUniform::Result Result; |
| 504 Result* result = static_cast<Result*>(shared_memory_address_); |
| 505 result->success = 0; |
| 506 cmd.Init(client_program_id_, |
| 507 kBadUniformIndex, |
| 508 kBucketId, |
| 509 shared_memory_id_, |
| 510 shared_memory_offset_); |
| 511 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 512 EXPECT_EQ(0, result->success); |
| 513 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 514 } |
| 515 |
| 516 TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadSharedMemoryFails) { |
| 517 const GLuint kUniformIndex = 1; |
| 518 const uint32 kBucketId = 123; |
| 519 GetActiveUniform cmd; |
| 520 cmd.Init(client_program_id_, |
| 521 kUniformIndex, |
| 522 kBucketId, |
| 523 kInvalidSharedMemoryId, |
| 524 shared_memory_offset_); |
| 525 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 526 cmd.Init(client_program_id_, |
| 527 kUniformIndex, |
| 528 kBucketId, |
| 529 shared_memory_id_, |
| 530 kInvalidSharedMemoryOffset); |
| 531 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 532 } |
| 533 |
| 534 TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribSucceeds) { |
| 535 const GLuint kAttribIndex = 1; |
| 536 const uint32 kBucketId = 123; |
| 537 GetActiveAttrib cmd; |
| 538 typedef GetActiveAttrib::Result Result; |
| 539 Result* result = static_cast<Result*>(shared_memory_address_); |
| 540 result->success = 0; |
| 541 cmd.Init(client_program_id_, |
| 542 kAttribIndex, |
| 543 kBucketId, |
| 544 shared_memory_id_, |
| 545 shared_memory_offset_); |
| 546 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 547 EXPECT_NE(0, result->success); |
| 548 EXPECT_EQ(kAttrib2Size, result->size); |
| 549 EXPECT_EQ(kAttrib2Type, result->type); |
| 550 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 551 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); |
| 552 ASSERT_TRUE(bucket != NULL); |
| 553 EXPECT_EQ( |
| 554 0, |
| 555 memcmp(bucket->GetData(0, bucket->size()), kAttrib2Name, bucket->size())); |
| 556 } |
| 557 |
| 558 TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribResultNotInitFails) { |
| 559 const GLuint kAttribIndex = 1; |
| 560 const uint32 kBucketId = 123; |
| 561 GetActiveAttrib cmd; |
| 562 typedef GetActiveAttrib::Result Result; |
| 563 Result* result = static_cast<Result*>(shared_memory_address_); |
| 564 result->success = 1; |
| 565 cmd.Init(client_program_id_, |
| 566 kAttribIndex, |
| 567 kBucketId, |
| 568 shared_memory_id_, |
| 569 shared_memory_offset_); |
| 570 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 571 } |
| 572 |
| 573 TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadProgramFails) { |
| 574 const GLuint kAttribIndex = 1; |
| 575 const uint32 kBucketId = 123; |
| 576 GetActiveAttrib cmd; |
| 577 typedef GetActiveAttrib::Result Result; |
| 578 Result* result = static_cast<Result*>(shared_memory_address_); |
| 579 result->success = 0; |
| 580 cmd.Init(kInvalidClientId, |
| 581 kAttribIndex, |
| 582 kBucketId, |
| 583 shared_memory_id_, |
| 584 shared_memory_offset_); |
| 585 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 586 EXPECT_EQ(0, result->success); |
| 587 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 588 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 589 result->success = 0; |
| 590 cmd.Init(client_shader_id_, |
| 591 kAttribIndex, |
| 592 kBucketId, |
| 593 shared_memory_id_, |
| 594 shared_memory_offset_); |
| 595 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 596 EXPECT_EQ(0, result->success); |
| 597 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 598 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 599 } |
| 600 |
| 601 TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadIndexFails) { |
| 602 const uint32 kBucketId = 123; |
| 603 GetActiveAttrib cmd; |
| 604 typedef GetActiveAttrib::Result Result; |
| 605 Result* result = static_cast<Result*>(shared_memory_address_); |
| 606 result->success = 0; |
| 607 cmd.Init(client_program_id_, |
| 608 kBadAttribIndex, |
| 609 kBucketId, |
| 610 shared_memory_id_, |
| 611 shared_memory_offset_); |
| 612 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 613 EXPECT_EQ(0, result->success); |
| 614 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 615 } |
| 616 |
| 617 TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadSharedMemoryFails) { |
| 618 const GLuint kAttribIndex = 1; |
| 619 const uint32 kBucketId = 123; |
| 620 GetActiveAttrib cmd; |
| 621 cmd.Init(client_program_id_, |
| 622 kAttribIndex, |
| 623 kBucketId, |
| 624 kInvalidSharedMemoryId, |
| 625 shared_memory_offset_); |
| 626 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 627 cmd.Init(client_program_id_, |
| 628 kAttribIndex, |
| 629 kBucketId, |
| 630 shared_memory_id_, |
| 631 kInvalidSharedMemoryOffset); |
| 632 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 633 } |
| 634 |
| 635 TEST_F(GLES2DecoderWithShaderTest, GetShaderInfoLogValidArgs) { |
| 636 const char* kInfo = "hello"; |
| 637 const uint32 kBucketId = 123; |
| 638 CompileShader compile_cmd; |
| 639 GetShaderInfoLog cmd; |
| 640 EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _)); |
| 641 EXPECT_CALL(*gl_, CompileShader(kServiceShaderId)); |
| 642 EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _)) |
| 643 .WillOnce(SetArgumentPointee<2>(GL_FALSE)) |
| 644 .RetiresOnSaturation(); |
| 645 EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_INFO_LOG_LENGTH, _)) |
| 646 .WillOnce(SetArgumentPointee<2>(strlen(kInfo) + 1)) |
| 647 .RetiresOnSaturation(); |
| 648 EXPECT_CALL(*gl_, GetShaderInfoLog(kServiceShaderId, strlen(kInfo) + 1, _, _)) |
| 649 .WillOnce(DoAll(SetArgumentPointee<2>(strlen(kInfo)), |
| 650 SetArrayArgument<3>(kInfo, kInfo + strlen(kInfo) + 1))); |
| 651 compile_cmd.Init(client_shader_id_); |
| 652 cmd.Init(client_shader_id_, kBucketId); |
| 653 EXPECT_EQ(error::kNoError, ExecuteCmd(compile_cmd)); |
| 654 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 655 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); |
| 656 ASSERT_TRUE(bucket != NULL); |
| 657 EXPECT_EQ(strlen(kInfo) + 1, bucket->size()); |
| 658 EXPECT_EQ(0, |
| 659 memcmp(bucket->GetData(0, bucket->size()), kInfo, bucket->size())); |
| 660 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 661 } |
| 662 |
| 663 TEST_F(GLES2DecoderWithShaderTest, GetShaderInfoLogInvalidArgs) { |
| 664 const uint32 kBucketId = 123; |
| 665 GetShaderInfoLog cmd; |
| 666 cmd.Init(kInvalidClientId, kBucketId); |
| 667 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 668 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 669 } |
| 670 |
| 671 TEST_F(GLES2DecoderTest, CompileShaderValidArgs) { |
| 672 EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _)); |
| 673 EXPECT_CALL(*gl_, CompileShader(kServiceShaderId)); |
| 674 EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _)) |
| 675 .WillOnce(SetArgumentPointee<2>(GL_TRUE)) |
| 676 .RetiresOnSaturation(); |
| 677 CompileShader cmd; |
| 678 cmd.Init(client_shader_id_); |
| 679 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 680 } |
| 681 |
| 682 TEST_F(GLES2DecoderTest, CompileShaderInvalidArgs) { |
| 683 CompileShader cmd; |
| 684 cmd.Init(kInvalidClientId); |
| 685 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 686 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 687 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 688 cmd.Init(client_program_id_); |
| 689 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 690 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 691 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 692 } |
| 693 |
| 694 TEST_F(GLES2DecoderTest, ShaderSourceAndGetShaderSourceValidArgs) { |
| 695 const uint32 kBucketId = 123; |
| 696 const char kSource[] = "hello"; |
| 697 const uint32 kSourceSize = sizeof(kSource) - 1; |
| 698 memcpy(shared_memory_address_, kSource, kSourceSize); |
| 699 ShaderSource cmd; |
| 700 cmd.Init( |
| 701 client_shader_id_, kSharedMemoryId, kSharedMemoryOffset, kSourceSize); |
| 702 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 703 memset(shared_memory_address_, 0, kSourceSize); |
| 704 GetShaderSource get_cmd; |
| 705 get_cmd.Init(client_shader_id_, kBucketId); |
| 706 EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd)); |
| 707 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); |
| 708 ASSERT_TRUE(bucket != NULL); |
| 709 EXPECT_EQ(kSourceSize + 1, bucket->size()); |
| 710 EXPECT_EQ( |
| 711 0, memcmp(bucket->GetData(0, bucket->size()), kSource, bucket->size())); |
| 712 } |
| 713 |
| 714 TEST_F(GLES2DecoderTest, ShaderSourceInvalidArgs) { |
| 715 const char kSource[] = "hello"; |
| 716 const uint32 kSourceSize = sizeof(kSource) - 1; |
| 717 memcpy(shared_memory_address_, kSource, kSourceSize); |
| 718 ShaderSource cmd; |
| 719 cmd.Init(kInvalidClientId, kSharedMemoryId, kSharedMemoryOffset, kSourceSize); |
| 720 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 721 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 722 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 723 cmd.Init( |
| 724 client_program_id_, kSharedMemoryId, kSharedMemoryOffset, kSourceSize); |
| 725 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 726 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 727 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 728 cmd.Init(client_shader_id_, |
| 729 kInvalidSharedMemoryId, |
| 730 kSharedMemoryOffset, |
| 731 kSourceSize); |
| 732 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 733 cmd.Init(client_shader_id_, |
| 734 kSharedMemoryId, |
| 735 kInvalidSharedMemoryOffset, |
| 736 kSourceSize); |
| 737 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 738 cmd.Init(client_shader_id_, |
| 739 kSharedMemoryId, |
| 740 kSharedMemoryOffset, |
| 741 kSharedBufferSize); |
| 742 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 743 } |
| 744 |
| 745 TEST_F(GLES2DecoderTest, ShaderSourceBucketAndGetShaderSourceValidArgs) { |
| 746 const uint32 kInBucketId = 123; |
| 747 const uint32 kOutBucketId = 125; |
| 748 const char kSource[] = "hello"; |
| 749 const uint32 kSourceSize = sizeof(kSource) - 1; |
| 750 SetBucketAsCString(kInBucketId, kSource); |
| 751 ShaderSourceBucket cmd; |
| 752 cmd.Init(client_shader_id_, kInBucketId); |
| 753 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 754 ClearSharedMemory(); |
| 755 GetShaderSource get_cmd; |
| 756 get_cmd.Init(client_shader_id_, kOutBucketId); |
| 757 EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd)); |
| 758 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kOutBucketId); |
| 759 ASSERT_TRUE(bucket != NULL); |
| 760 EXPECT_EQ(kSourceSize + 1, bucket->size()); |
| 761 EXPECT_EQ( |
| 762 0, memcmp(bucket->GetData(0, bucket->size()), kSource, bucket->size())); |
| 763 } |
| 764 |
| 765 TEST_F(GLES2DecoderTest, ShaderSourceBucketInvalidArgs) { |
| 766 const uint32 kBucketId = 123; |
| 767 const char kSource[] = "hello"; |
| 768 const uint32 kSourceSize = sizeof(kSource) - 1; |
| 769 memcpy(shared_memory_address_, kSource, kSourceSize); |
| 770 ShaderSourceBucket cmd; |
| 771 // Test no bucket. |
| 772 cmd.Init(client_texture_id_, kBucketId); |
| 773 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 774 // Test invalid client. |
| 775 SetBucketAsCString(kBucketId, kSource); |
| 776 cmd.Init(kInvalidClientId, kBucketId); |
| 777 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 778 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 779 } |
| 780 |
| 781 TEST_F(GLES2DecoderTest, ShaderSourceStripComments) { |
| 782 const uint32 kInBucketId = 123; |
| 783 const char kSource[] = "hello/*te\ast*/world//a\ab"; |
| 784 SetBucketAsCString(kInBucketId, kSource); |
| 785 ShaderSourceBucket cmd; |
| 786 cmd.Init(client_shader_id_, kInBucketId); |
| 787 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 788 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 789 } |
| 790 |
| 791 TEST_F(GLES2DecoderWithShaderTest, Uniform1iValidArgs) { |
| 792 EXPECT_CALL(*gl_, Uniform1i(kUniform1RealLocation, 2)); |
| 793 Uniform1i cmd; |
| 794 cmd.Init(kUniform1FakeLocation, 2); |
| 795 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 796 } |
| 797 |
| 798 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivValidArgs) { |
| 799 EXPECT_CALL( |
| 800 *gl_, |
| 801 Uniform1iv(kUniform1RealLocation, |
| 802 1, |
| 803 reinterpret_cast<const GLint*>(shared_memory_address_))); |
| 804 Uniform1iv cmd; |
| 805 cmd.Init(kUniform1FakeLocation, 1, shared_memory_id_, shared_memory_offset_); |
| 806 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 807 } |
| 808 |
| 809 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidArgs2_0) { |
| 810 EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); |
| 811 Uniform1iv cmd; |
| 812 cmd.Init(kUniform1FakeLocation, 1, kInvalidSharedMemoryId, 0); |
| 813 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); |
| 814 } |
| 815 |
| 816 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidArgs2_1) { |
| 817 EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); |
| 818 Uniform1iv cmd; |
| 819 cmd.Init( |
| 820 kUniform1FakeLocation, 1, shared_memory_id_, kInvalidSharedMemoryOffset); |
| 821 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); |
| 822 } |
| 823 |
| 824 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivImmediateValidArgs) { |
| 825 Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); |
| 826 EXPECT_CALL(*gl_, |
| 827 Uniform1iv(kUniform1RealLocation, |
| 828 1, |
| 829 reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd)))); |
| 830 GLint temp[1 * 2] = { |
| 831 0, |
| 832 }; |
| 833 cmd.Init(kUniform1FakeLocation, 1, &temp[0]); |
| 834 EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); |
| 835 } |
| 836 |
| 837 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidValidArgs) { |
| 838 EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); |
| 839 Uniform1iv cmd; |
| 840 cmd.Init(kUniform1FakeLocation, 2, shared_memory_id_, shared_memory_offset_); |
| 841 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 842 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 843 } |
| 844 |
| 845 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivZeroCount) { |
| 846 EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); |
| 847 Uniform1iv cmd; |
| 848 cmd.Init(kUniform1FakeLocation, 0, shared_memory_id_, shared_memory_offset_); |
| 849 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 850 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 851 } |
| 852 |
| 853 TEST_F(GLES2DecoderWithShaderTest, Uniform1iSamplerIsLmited) { |
| 854 EXPECT_CALL(*gl_, Uniform1i(_, _)).Times(0); |
| 855 Uniform1i cmd; |
| 856 cmd.Init(kUniform1FakeLocation, kNumTextureUnits); |
| 857 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 858 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 859 } |
| 860 |
| 861 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivSamplerIsLimited) { |
| 862 EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); |
| 863 Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); |
| 864 GLint temp[] = {kNumTextureUnits}; |
| 865 cmd.Init(kUniform1FakeLocation, 1, &temp[0]); |
| 866 EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); |
| 867 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 868 } |
| 869 |
| 870 TEST_F(GLES2DecoderTest, BindAttribLocation) { |
| 871 const GLint kLocation = 2; |
| 872 const char* kName = "testing"; |
| 873 const uint32 kNameSize = strlen(kName); |
| 874 EXPECT_CALL(*gl_, |
| 875 BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName))) |
| 876 .Times(1); |
| 877 memcpy(shared_memory_address_, kName, kNameSize); |
| 878 BindAttribLocation cmd; |
| 879 cmd.Init(client_program_id_, |
| 880 kLocation, |
| 881 kSharedMemoryId, |
| 882 kSharedMemoryOffset, |
| 883 kNameSize); |
| 884 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 885 } |
| 886 |
| 887 TEST_F(GLES2DecoderTest, BindAttribLocationInvalidArgs) { |
| 888 const GLint kLocation = 2; |
| 889 const char* kName = "testing"; |
| 890 const char* kBadName = "test\aing"; |
| 891 const uint32 kNameSize = strlen(kName); |
| 892 const uint32 kBadNameSize = strlen(kBadName); |
| 893 EXPECT_CALL(*gl_, BindAttribLocation(_, _, _)).Times(0); |
| 894 memcpy(shared_memory_address_, kName, kNameSize); |
| 895 BindAttribLocation cmd; |
| 896 cmd.Init(kInvalidClientId, |
| 897 kLocation, |
| 898 kSharedMemoryId, |
| 899 kSharedMemoryOffset, |
| 900 kNameSize); |
| 901 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 902 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 903 cmd.Init(client_program_id_, |
| 904 kLocation, |
| 905 kInvalidSharedMemoryId, |
| 906 kSharedMemoryOffset, |
| 907 kNameSize); |
| 908 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 909 cmd.Init(client_program_id_, |
| 910 kLocation, |
| 911 kSharedMemoryId, |
| 912 kInvalidSharedMemoryOffset, |
| 913 kNameSize); |
| 914 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 915 cmd.Init(client_program_id_, |
| 916 kLocation, |
| 917 kSharedMemoryId, |
| 918 kSharedMemoryOffset, |
| 919 kSharedBufferSize); |
| 920 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 921 memcpy(shared_memory_address_, kBadName, kBadNameSize); |
| 922 cmd.Init(client_program_id_, |
| 923 kLocation, |
| 924 kSharedMemoryId, |
| 925 kSharedMemoryOffset, |
| 926 kBadNameSize); |
| 927 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 928 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 929 } |
| 930 |
| 931 TEST_F(GLES2DecoderTest, BindAttribLocationBucket) { |
| 932 const uint32 kBucketId = 123; |
| 933 const GLint kLocation = 2; |
| 934 const char* kName = "testing"; |
| 935 EXPECT_CALL(*gl_, |
| 936 BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName))) |
| 937 .Times(1); |
| 938 SetBucketAsCString(kBucketId, kName); |
| 939 BindAttribLocationBucket cmd; |
| 940 cmd.Init(client_program_id_, kLocation, kBucketId); |
| 941 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 942 } |
| 943 |
| 944 TEST_F(GLES2DecoderTest, BindAttribLocationBucketInvalidArgs) { |
| 945 const uint32 kBucketId = 123; |
| 946 const GLint kLocation = 2; |
| 947 const char* kName = "testing"; |
| 948 EXPECT_CALL(*gl_, BindAttribLocation(_, _, _)).Times(0); |
| 949 BindAttribLocationBucket cmd; |
| 950 // check bucket does not exist. |
| 951 cmd.Init(client_program_id_, kLocation, kBucketId); |
| 952 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 953 // check bucket is empty. |
| 954 SetBucketAsCString(kBucketId, NULL); |
| 955 cmd.Init(client_program_id_, kLocation, kBucketId); |
| 956 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 957 // Check bad program id |
| 958 SetBucketAsCString(kBucketId, kName); |
| 959 cmd.Init(kInvalidClientId, kLocation, kBucketId); |
| 960 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 961 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 962 } |
| 963 |
| 964 TEST_F(GLES2DecoderWithShaderTest, GetAttribLocation) { |
| 965 const uint32 kNameSize = strlen(kAttrib2Name); |
| 966 const char* kNonExistentName = "foobar"; |
| 967 const uint32 kNonExistentNameSize = strlen(kNonExistentName); |
| 968 typedef GetAttribLocation::Result Result; |
| 969 Result* result = GetSharedMemoryAs<Result*>(); |
| 970 *result = -1; |
| 971 char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); |
| 972 const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); |
| 973 memcpy(name, kAttrib2Name, kNameSize); |
| 974 GetAttribLocation cmd; |
| 975 cmd.Init(client_program_id_, |
| 976 kSharedMemoryId, |
| 977 kNameOffset, |
| 978 kSharedMemoryId, |
| 979 kSharedMemoryOffset, |
| 980 kNameSize); |
| 981 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 982 EXPECT_EQ(kAttrib2Location, *result); |
| 983 *result = -1; |
| 984 memcpy(name, kNonExistentName, kNonExistentNameSize); |
| 985 cmd.Init(client_program_id_, |
| 986 kSharedMemoryId, |
| 987 kNameOffset, |
| 988 kSharedMemoryId, |
| 989 kSharedMemoryOffset, |
| 990 kNonExistentNameSize); |
| 991 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 992 EXPECT_EQ(-1, *result); |
| 993 } |
| 994 |
| 995 TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationInvalidArgs) { |
| 996 const uint32 kNameSize = strlen(kAttrib2Name); |
| 997 const char* kBadName = "foo\abar"; |
| 998 const uint32 kBadNameSize = strlen(kBadName); |
| 999 typedef GetAttribLocation::Result Result; |
| 1000 Result* result = GetSharedMemoryAs<Result*>(); |
| 1001 *result = -1; |
| 1002 char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); |
| 1003 const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); |
| 1004 memcpy(name, kAttrib2Name, kNameSize); |
| 1005 GetAttribLocation cmd; |
| 1006 cmd.Init(kInvalidClientId, |
| 1007 kSharedMemoryId, |
| 1008 kNameOffset, |
| 1009 kSharedMemoryId, |
| 1010 kSharedMemoryOffset, |
| 1011 kNameSize); |
| 1012 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1013 EXPECT_EQ(-1, *result); |
| 1014 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1015 *result = -1; |
| 1016 cmd.Init(client_program_id_, |
| 1017 kInvalidSharedMemoryId, |
| 1018 kNameOffset, |
| 1019 kSharedMemoryId, |
| 1020 kSharedMemoryOffset, |
| 1021 kNameSize); |
| 1022 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1023 EXPECT_EQ(-1, *result); |
| 1024 cmd.Init(client_program_id_, |
| 1025 kSharedMemoryId, |
| 1026 kInvalidSharedMemoryOffset, |
| 1027 kSharedMemoryId, |
| 1028 kSharedMemoryOffset, |
| 1029 kNameSize); |
| 1030 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1031 EXPECT_EQ(-1, *result); |
| 1032 cmd.Init(client_program_id_, |
| 1033 kSharedMemoryId, |
| 1034 kNameOffset, |
| 1035 kInvalidSharedMemoryId, |
| 1036 kSharedMemoryOffset, |
| 1037 kNameSize); |
| 1038 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1039 EXPECT_EQ(-1, *result); |
| 1040 cmd.Init(client_program_id_, |
| 1041 kSharedMemoryId, |
| 1042 kNameOffset, |
| 1043 kSharedMemoryId, |
| 1044 kInvalidSharedMemoryOffset, |
| 1045 kNameSize); |
| 1046 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1047 EXPECT_EQ(-1, *result); |
| 1048 cmd.Init(client_program_id_, |
| 1049 kSharedMemoryId, |
| 1050 kNameOffset, |
| 1051 kSharedMemoryId, |
| 1052 kSharedMemoryOffset, |
| 1053 kSharedBufferSize); |
| 1054 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1055 EXPECT_EQ(-1, *result); |
| 1056 memcpy(name, kBadName, kBadNameSize); |
| 1057 cmd.Init(client_program_id_, |
| 1058 kSharedMemoryId, |
| 1059 kNameOffset, |
| 1060 kSharedMemoryId, |
| 1061 kSharedMemoryOffset, |
| 1062 kBadNameSize); |
| 1063 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1064 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1065 } |
| 1066 |
| 1067 TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationBucket) { |
| 1068 const uint32 kBucketId = 123; |
| 1069 const char* kNonExistentName = "foobar"; |
| 1070 typedef GetAttribLocationBucket::Result Result; |
| 1071 Result* result = GetSharedMemoryAs<Result*>(); |
| 1072 SetBucketAsCString(kBucketId, kAttrib2Name); |
| 1073 *result = -1; |
| 1074 GetAttribLocationBucket cmd; |
| 1075 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1076 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1077 EXPECT_EQ(kAttrib2Location, *result); |
| 1078 SetBucketAsCString(kBucketId, kNonExistentName); |
| 1079 *result = -1; |
| 1080 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1081 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1082 EXPECT_EQ(-1, *result); |
| 1083 } |
| 1084 |
| 1085 TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationBucketInvalidArgs) { |
| 1086 const uint32 kBucketId = 123; |
| 1087 typedef GetAttribLocationBucket::Result Result; |
| 1088 Result* result = GetSharedMemoryAs<Result*>(); |
| 1089 *result = -1; |
| 1090 GetAttribLocationBucket cmd; |
| 1091 // Check no bucket |
| 1092 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1093 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1094 EXPECT_EQ(-1, *result); |
| 1095 // Check bad program id. |
| 1096 SetBucketAsCString(kBucketId, kAttrib2Name); |
| 1097 cmd.Init(kInvalidClientId, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1098 *result = -1; |
| 1099 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1100 EXPECT_EQ(-1, *result); |
| 1101 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1102 // Check bad memory |
| 1103 cmd.Init(client_program_id_, |
| 1104 kBucketId, |
| 1105 kInvalidSharedMemoryId, |
| 1106 kSharedMemoryOffset); |
| 1107 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1108 cmd.Init(client_program_id_, |
| 1109 kBucketId, |
| 1110 kSharedMemoryId, |
| 1111 kInvalidSharedMemoryOffset); |
| 1112 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1113 } |
| 1114 |
| 1115 TEST_F(GLES2DecoderWithShaderTest, GetUniformLocation) { |
| 1116 const uint32 kNameSize = strlen(kUniform2Name); |
| 1117 const char* kNonExistentName = "foobar"; |
| 1118 const uint32 kNonExistentNameSize = strlen(kNonExistentName); |
| 1119 typedef GetUniformLocation::Result Result; |
| 1120 Result* result = GetSharedMemoryAs<Result*>(); |
| 1121 *result = -1; |
| 1122 char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); |
| 1123 const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); |
| 1124 memcpy(name, kUniform2Name, kNameSize); |
| 1125 GetUniformLocation cmd; |
| 1126 cmd.Init(client_program_id_, |
| 1127 kSharedMemoryId, |
| 1128 kNameOffset, |
| 1129 kSharedMemoryId, |
| 1130 kSharedMemoryOffset, |
| 1131 kNameSize); |
| 1132 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1133 EXPECT_EQ(kUniform2FakeLocation, *result); |
| 1134 memcpy(name, kNonExistentName, kNonExistentNameSize); |
| 1135 *result = -1; |
| 1136 cmd.Init(client_program_id_, |
| 1137 kSharedMemoryId, |
| 1138 kNameOffset, |
| 1139 kSharedMemoryId, |
| 1140 kSharedMemoryOffset, |
| 1141 kNonExistentNameSize); |
| 1142 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1143 EXPECT_EQ(-1, *result); |
| 1144 } |
| 1145 |
| 1146 TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationInvalidArgs) { |
| 1147 const uint32 kNameSize = strlen(kUniform2Name); |
| 1148 const char* kBadName = "foo\abar"; |
| 1149 const uint32 kBadNameSize = strlen(kBadName); |
| 1150 typedef GetUniformLocation::Result Result; |
| 1151 Result* result = GetSharedMemoryAs<Result*>(); |
| 1152 *result = -1; |
| 1153 char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); |
| 1154 const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); |
| 1155 memcpy(name, kUniform2Name, kNameSize); |
| 1156 GetUniformLocation cmd; |
| 1157 cmd.Init(kInvalidClientId, |
| 1158 kSharedMemoryId, |
| 1159 kNameOffset, |
| 1160 kSharedMemoryId, |
| 1161 kSharedMemoryOffset, |
| 1162 kNameSize); |
| 1163 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1164 EXPECT_EQ(-1, *result); |
| 1165 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1166 *result = -1; |
| 1167 cmd.Init(client_program_id_, |
| 1168 kInvalidSharedMemoryId, |
| 1169 kNameOffset, |
| 1170 kSharedMemoryId, |
| 1171 kSharedMemoryOffset, |
| 1172 kNameSize); |
| 1173 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1174 EXPECT_EQ(-1, *result); |
| 1175 cmd.Init(client_program_id_, |
| 1176 kSharedMemoryId, |
| 1177 kInvalidSharedMemoryOffset, |
| 1178 kSharedMemoryId, |
| 1179 kSharedMemoryOffset, |
| 1180 kNameSize); |
| 1181 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1182 EXPECT_EQ(-1, *result); |
| 1183 cmd.Init(client_program_id_, |
| 1184 kSharedMemoryId, |
| 1185 kNameOffset, |
| 1186 kInvalidSharedMemoryId, |
| 1187 kSharedMemoryOffset, |
| 1188 kNameSize); |
| 1189 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1190 EXPECT_EQ(-1, *result); |
| 1191 cmd.Init(client_program_id_, |
| 1192 kSharedMemoryId, |
| 1193 kNameOffset, |
| 1194 kSharedMemoryId, |
| 1195 kInvalidSharedMemoryOffset, |
| 1196 kNameSize); |
| 1197 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1198 EXPECT_EQ(-1, *result); |
| 1199 cmd.Init(client_program_id_, |
| 1200 kSharedMemoryId, |
| 1201 kNameOffset, |
| 1202 kSharedMemoryId, |
| 1203 kSharedMemoryOffset, |
| 1204 kSharedBufferSize); |
| 1205 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1206 EXPECT_EQ(-1, *result); |
| 1207 memcpy(name, kBadName, kBadNameSize); |
| 1208 cmd.Init(client_program_id_, |
| 1209 kSharedMemoryId, |
| 1210 kNameOffset, |
| 1211 kSharedMemoryId, |
| 1212 kSharedMemoryOffset, |
| 1213 kBadNameSize); |
| 1214 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1215 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1216 } |
| 1217 |
| 1218 TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationBucket) { |
| 1219 const uint32 kBucketId = 123; |
| 1220 const char* kNonExistentName = "foobar"; |
| 1221 typedef GetUniformLocationBucket::Result Result; |
| 1222 Result* result = GetSharedMemoryAs<Result*>(); |
| 1223 SetBucketAsCString(kBucketId, kUniform2Name); |
| 1224 *result = -1; |
| 1225 GetUniformLocationBucket cmd; |
| 1226 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1227 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1228 EXPECT_EQ(kUniform2FakeLocation, *result); |
| 1229 SetBucketAsCString(kBucketId, kNonExistentName); |
| 1230 *result = -1; |
| 1231 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1232 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1233 EXPECT_EQ(-1, *result); |
| 1234 } |
| 1235 |
| 1236 TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationBucketInvalidArgs) { |
| 1237 const uint32 kBucketId = 123; |
| 1238 typedef GetUniformLocationBucket::Result Result; |
| 1239 Result* result = GetSharedMemoryAs<Result*>(); |
| 1240 *result = -1; |
| 1241 GetUniformLocationBucket cmd; |
| 1242 // Check no bucket |
| 1243 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1244 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1245 EXPECT_EQ(-1, *result); |
| 1246 // Check bad program id. |
| 1247 SetBucketAsCString(kBucketId, kUniform2Name); |
| 1248 cmd.Init(kInvalidClientId, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1249 *result = -1; |
| 1250 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1251 EXPECT_EQ(-1, *result); |
| 1252 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1253 // Check bad memory |
| 1254 cmd.Init(client_program_id_, |
| 1255 kBucketId, |
| 1256 kInvalidSharedMemoryId, |
| 1257 kSharedMemoryOffset); |
| 1258 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1259 cmd.Init(client_program_id_, |
| 1260 kBucketId, |
| 1261 kSharedMemoryId, |
| 1262 kInvalidSharedMemoryOffset); |
| 1263 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1264 } |
| 1265 |
| 1266 TEST_F(GLES2DecoderWithShaderTest, BindUniformLocationCHROMIUM) { |
| 1267 const GLint kLocation = 2; |
| 1268 const char* kName = "testing"; |
| 1269 const uint32 kNameSize = strlen(kName); |
| 1270 const char* kBadName1 = "gl_testing"; |
| 1271 const uint32 kBadName1Size = strlen(kBadName1); |
| 1272 const char* kBadName2 = "testing[1]"; |
| 1273 const uint32 kBadName2Size = strlen(kBadName2); |
| 1274 memcpy(shared_memory_address_, kName, kNameSize); |
| 1275 BindUniformLocationCHROMIUM cmd; |
| 1276 cmd.Init(client_program_id_, |
| 1277 kLocation, |
| 1278 kSharedMemoryId, |
| 1279 kSharedMemoryOffset, |
| 1280 kNameSize); |
| 1281 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1282 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 1283 // check negative location |
| 1284 memcpy(shared_memory_address_, kName, kNameSize); |
| 1285 cmd.Init( |
| 1286 client_program_id_, -1, kSharedMemoryId, kSharedMemoryOffset, kNameSize); |
| 1287 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1288 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1289 // check highest location |
| 1290 memcpy(shared_memory_address_, kName, kNameSize); |
| 1291 GLint kMaxLocation = |
| 1292 (kMaxFragmentUniformVectors + kMaxVertexUniformVectors) * 4 - 1; |
| 1293 cmd.Init(client_program_id_, |
| 1294 kMaxLocation, |
| 1295 kSharedMemoryId, |
| 1296 kSharedMemoryOffset, |
| 1297 kNameSize); |
| 1298 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1299 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 1300 // check too high location |
| 1301 memcpy(shared_memory_address_, kName, kNameSize); |
| 1302 cmd.Init(client_program_id_, |
| 1303 kMaxLocation + 1, |
| 1304 kSharedMemoryId, |
| 1305 kSharedMemoryOffset, |
| 1306 kNameSize); |
| 1307 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1308 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1309 // check bad name "gl_..." |
| 1310 memcpy(shared_memory_address_, kBadName1, kBadName1Size); |
| 1311 cmd.Init(client_program_id_, |
| 1312 kLocation, |
| 1313 kSharedMemoryId, |
| 1314 kSharedMemoryOffset, |
| 1315 kBadName1Size); |
| 1316 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1317 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 1318 // check bad name "name[1]" non zero |
| 1319 memcpy(shared_memory_address_, kBadName2, kBadName2Size); |
| 1320 cmd.Init(client_program_id_, |
| 1321 kLocation, |
| 1322 kSharedMemoryId, |
| 1323 kSharedMemoryOffset, |
| 1324 kBadName2Size); |
| 1325 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1326 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1327 } |
| 1328 |
| 1329 TEST_F(GLES2DecoderManualInitTest, ClearUniformsBeforeFirstProgramUse) { |
| 1330 CommandLine command_line(0, NULL); |
| 1331 command_line.AppendSwitchASCII( |
| 1332 switches::kGpuDriverBugWorkarounds, |
| 1333 base::IntToString(gpu::CLEAR_UNIFORMS_BEFORE_FIRST_PROGRAM_USE)); |
| 1334 InitState init; |
| 1335 init.gl_version = "3.0"; |
| 1336 init.has_alpha = true; |
| 1337 init.request_alpha = true; |
| 1338 init.bind_generates_resource = true; |
| 1339 InitDecoderWithCommandLine(init, &command_line); |
| 1340 { |
| 1341 static AttribInfo attribs[] = { |
| 1342 { |
| 1343 kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, |
| 1344 }, |
| 1345 { |
| 1346 kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, |
| 1347 }, |
| 1348 { |
| 1349 kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, |
| 1350 }, |
| 1351 }; |
| 1352 static UniformInfo uniforms[] = { |
| 1353 {kUniform1Name, kUniform1Size, kUniform1Type, kUniform1FakeLocation, |
| 1354 kUniform1RealLocation, kUniform1DesiredLocation}, |
| 1355 {kUniform2Name, kUniform2Size, kUniform2Type, kUniform2FakeLocation, |
| 1356 kUniform2RealLocation, kUniform2DesiredLocation}, |
| 1357 {kUniform3Name, kUniform3Size, kUniform3Type, kUniform3FakeLocation, |
| 1358 kUniform3RealLocation, kUniform3DesiredLocation}, |
| 1359 }; |
| 1360 SetupShader(attribs, |
| 1361 arraysize(attribs), |
| 1362 uniforms, |
| 1363 arraysize(uniforms), |
| 1364 client_program_id_, |
| 1365 kServiceProgramId, |
| 1366 client_vertex_shader_id_, |
| 1367 kServiceVertexShaderId, |
| 1368 client_fragment_shader_id_, |
| 1369 kServiceFragmentShaderId); |
| 1370 TestHelper::SetupExpectationsForClearingUniforms( |
| 1371 gl_.get(), uniforms, arraysize(uniforms)); |
| 1372 } |
| 1373 |
| 1374 { |
| 1375 EXPECT_CALL(*gl_, UseProgram(kServiceProgramId)) |
| 1376 .Times(1) |
| 1377 .RetiresOnSaturation(); |
| 1378 cmds::UseProgram cmd; |
| 1379 cmd.Init(client_program_id_); |
| 1380 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1381 } |
| 1382 } |
| 1383 |
| 1384 // TODO(gman): DeleteProgram |
| 1385 |
| 1386 // TODO(gman): UseProgram |
| 1387 |
| 1388 // TODO(gman): DeleteShader |
| 1389 |
| 1390 } // namespace gles2 |
| 1391 } // namespace gpu |
OLD | NEW |