| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Tests for GLES2Implementation. | 5 // Tests for GLES2Implementation. |
| 6 | 6 |
| 7 #include "gpu/command_buffer/client/gles2_implementation.h" | 7 #include "gpu/command_buffer/client/gles2_implementation.h" |
| 8 | 8 |
| 9 #include <GLES2/gl2.h> | 9 #include <GLES2/gl2.h> |
| 10 #include <GLES2/gl2ext.h> | 10 #include <GLES2/gl2ext.h> |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 #endif | 34 #endif |
| 35 | 35 |
| 36 using testing::_; | 36 using testing::_; |
| 37 using testing::AtLeast; | 37 using testing::AtLeast; |
| 38 using testing::AnyNumber; | 38 using testing::AnyNumber; |
| 39 using testing::DoAll; | 39 using testing::DoAll; |
| 40 using testing::InSequence; | 40 using testing::InSequence; |
| 41 using testing::Invoke; | 41 using testing::Invoke; |
| 42 using testing::Mock; | 42 using testing::Mock; |
| 43 using testing::Pointee; | 43 using testing::Pointee; |
| 44 using testing::SaveArg; |
| 44 using testing::Sequence; | 45 using testing::Sequence; |
| 45 using testing::StrictMock; | 46 using testing::StrictMock; |
| 46 using testing::Truly; | 47 using testing::Truly; |
| 47 using testing::Return; | 48 using testing::Return; |
| 48 | 49 |
| 49 namespace gpu { | 50 namespace gpu { |
| 50 namespace gles2 { | 51 namespace gles2 { |
| 51 | 52 |
| 52 ACTION_P2(SetMemory, dst, obj) { | 53 ACTION_P2(SetMemory, dst, obj) { |
| 53 memcpy(dst, &obj, sizeof(obj)); | 54 memcpy(dst, &obj, sizeof(obj)); |
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 kMaxTransformFeedbackSeparateAttribs; | 476 kMaxTransformFeedbackSeparateAttribs; |
| 476 capabilities.max_uniform_buffer_bindings = kMaxUniformBufferBindings; | 477 capabilities.max_uniform_buffer_bindings = kMaxUniformBufferBindings; |
| 477 capabilities.bind_generates_resource_chromium = | 478 capabilities.bind_generates_resource_chromium = |
| 478 bind_generates_resource_service ? 1 : 0; | 479 bind_generates_resource_service ? 1 : 0; |
| 479 capabilities.sync_query = sync_query; | 480 capabilities.sync_query = sync_query; |
| 480 capabilities.occlusion_query_boolean = occlusion_query_boolean; | 481 capabilities.occlusion_query_boolean = occlusion_query_boolean; |
| 481 capabilities.timer_queries = timer_queries; | 482 capabilities.timer_queries = timer_queries; |
| 482 capabilities.major_version = major_version; | 483 capabilities.major_version = major_version; |
| 483 capabilities.minor_version = minor_version; | 484 capabilities.minor_version = minor_version; |
| 484 EXPECT_CALL(*gpu_control_, GetCapabilities()) | 485 EXPECT_CALL(*gpu_control_, GetCapabilities()) |
| 485 .WillOnce(testing::Return(capabilities)); | 486 .WillOnce(Return(capabilities)); |
| 486 | 487 |
| 487 { | 488 { |
| 488 InSequence sequence; | 489 InSequence sequence; |
| 489 | 490 |
| 490 const bool support_client_side_arrays = true; | 491 const bool support_client_side_arrays = true; |
| 491 gl_.reset(new GLES2Implementation(helper_.get(), | 492 gl_.reset(new GLES2Implementation(helper_.get(), |
| 492 share_group, | 493 share_group, |
| 493 transfer_buffer_.get(), | 494 transfer_buffer_.get(), |
| 494 bind_generates_resource_client, | 495 bind_generates_resource_client, |
| 495 lose_context_when_out_of_memory, | 496 lose_context_when_out_of_memory, |
| 496 support_client_side_arrays, | 497 support_client_side_arrays, |
| 497 gpu_control_.get())); | 498 gpu_control_.get())); |
| 498 } | 499 } |
| 499 | 500 |
| 500 // The client should be set to something non-null. | 501 // The client should be set to something non-null. |
| 501 EXPECT_CALL(*gpu_control_, SetGpuControlClient(gl_.get())).Times(1); | 502 EXPECT_CALL(*gpu_control_, SetGpuControlClient(gl_.get())).Times(1); |
| 502 | 503 |
| 503 if (!gl_->Initialize(kTransferBufferSize, kTransferBufferSize, | 504 if (!gl_->Initialize(kTransferBufferSize, kTransferBufferSize, |
| 504 kTransferBufferSize, SharedMemoryLimits::kNoLimit)) | 505 kTransferBufferSize, SharedMemoryLimits::kNoLimit)) |
| 505 return false; | 506 return false; |
| 506 | 507 |
| 507 helper_->CommandBufferHelper::Finish(); | 508 helper_->CommandBufferHelper::Finish(); |
| 508 ::testing::Mock::VerifyAndClearExpectations(gl_.get()); | 509 Mock::VerifyAndClearExpectations(gl_.get()); |
| 509 | 510 |
| 510 scoped_refptr<Buffer> ring_buffer = helper_->get_ring_buffer(); | 511 scoped_refptr<Buffer> ring_buffer = helper_->get_ring_buffer(); |
| 511 commands_ = static_cast<CommandBufferEntry*>(ring_buffer->memory()) + | 512 commands_ = static_cast<CommandBufferEntry*>(ring_buffer->memory()) + |
| 512 command_buffer()->GetPutOffset(); | 513 command_buffer()->GetPutOffset(); |
| 513 ClearCommands(); | 514 ClearCommands(); |
| 514 EXPECT_TRUE(transfer_buffer_->InSync()); | 515 EXPECT_TRUE(transfer_buffer_->InSync()); |
| 515 | 516 |
| 516 ::testing::Mock::VerifyAndClearExpectations(command_buffer()); | 517 Mock::VerifyAndClearExpectations(command_buffer()); |
| 517 return true; | 518 return true; |
| 518 } | 519 } |
| 519 | 520 |
| 520 void TearDown() { | 521 void TearDown() { |
| 521 Mock::VerifyAndClear(gl_.get()); | 522 Mock::VerifyAndClear(gl_.get()); |
| 522 EXPECT_CALL(*command_buffer(), OnFlush()).Times(AnyNumber()); | 523 EXPECT_CALL(*command_buffer(), OnFlush()).Times(AnyNumber()); |
| 523 // For command buffer. | 524 // For command buffer. |
| 524 EXPECT_CALL(*command_buffer(), DestroyTransferBuffer(_)) | 525 EXPECT_CALL(*command_buffer(), DestroyTransferBuffer(_)) |
| 525 .Times(AtLeast(1)); | 526 .Times(AtLeast(1)); |
| 526 // The client should be unset. | 527 // The client should be unset. |
| (...skipping 3414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3941 EXPECT_EQ(GL_NO_ERROR, CheckError()); | 3942 EXPECT_EQ(GL_NO_ERROR, CheckError()); |
| 3942 | 3943 |
| 3943 // No more corresponding begin tracer marker should error. | 3944 // No more corresponding begin tracer marker should error. |
| 3944 gl_->TraceEndCHROMIUM(); | 3945 gl_->TraceEndCHROMIUM(); |
| 3945 EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); | 3946 EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); |
| 3946 } | 3947 } |
| 3947 | 3948 |
| 3948 TEST_F(GLES2ImplementationTest, InsertFenceSyncCHROMIUM) { | 3949 TEST_F(GLES2ImplementationTest, InsertFenceSyncCHROMIUM) { |
| 3949 const GLuint64 kFenceSync = 123u; | 3950 const GLuint64 kFenceSync = 123u; |
| 3950 EXPECT_CALL(*gpu_control_, GenerateFenceSyncRelease()) | 3951 EXPECT_CALL(*gpu_control_, GenerateFenceSyncRelease()) |
| 3951 .WillOnce(testing::Return(kFenceSync)); | 3952 .WillOnce(Return(kFenceSync)); |
| 3952 | 3953 |
| 3953 struct Cmds { | 3954 struct Cmds { |
| 3954 cmds::InsertFenceSyncCHROMIUM insert_fence_sync; | 3955 cmds::InsertFenceSyncCHROMIUM insert_fence_sync; |
| 3955 }; | 3956 }; |
| 3956 Cmds expected; | 3957 Cmds expected; |
| 3957 expected.insert_fence_sync.Init(kFenceSync); | 3958 expected.insert_fence_sync.Init(kFenceSync); |
| 3958 | 3959 |
| 3959 const GLuint64 fence_sync = gl_->InsertFenceSyncCHROMIUM(); | 3960 const GLuint64 fence_sync = gl_->InsertFenceSyncCHROMIUM(); |
| 3960 EXPECT_EQ(kFenceSync, fence_sync); | 3961 EXPECT_EQ(kFenceSync, fence_sync); |
| 3961 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 3962 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
| 3962 } | 3963 } |
| 3963 | 3964 |
| 3964 TEST_F(GLES2ImplementationTest, GenSyncTokenCHROMIUM) { | 3965 TEST_F(GLES2ImplementationTest, GenSyncTokenCHROMIUM) { |
| 3965 const CommandBufferNamespace kNamespaceId = CommandBufferNamespace::GPU_IO; | 3966 const CommandBufferNamespace kNamespaceId = CommandBufferNamespace::GPU_IO; |
| 3966 const CommandBufferId kCommandBufferId = | 3967 const CommandBufferId kCommandBufferId = |
| 3967 CommandBufferId::FromUnsafeValue(234u); | 3968 CommandBufferId::FromUnsafeValue(234u); |
| 3968 const GLuint64 kFenceSync = 123u; | 3969 const GLuint64 kFenceSync = 123u; |
| 3969 GLbyte sync_token_data[GL_SYNC_TOKEN_SIZE_CHROMIUM]; | 3970 GLbyte sync_token_data[GL_SYNC_TOKEN_SIZE_CHROMIUM]; |
| 3970 | 3971 |
| 3971 EXPECT_CALL(*gpu_control_, GetNamespaceID()) | 3972 EXPECT_CALL(*gpu_control_, GetNamespaceID()) |
| 3972 .WillRepeatedly(testing::Return(kNamespaceId)); | 3973 .WillRepeatedly(Return(kNamespaceId)); |
| 3973 EXPECT_CALL(*gpu_control_, GetCommandBufferID()) | 3974 EXPECT_CALL(*gpu_control_, GetCommandBufferID()) |
| 3974 .WillRepeatedly(testing::Return(kCommandBufferId)); | 3975 .WillRepeatedly(Return(kCommandBufferId)); |
| 3975 EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData()) | 3976 EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData()) |
| 3976 .WillRepeatedly(testing::Return(0)); | 3977 .WillRepeatedly(Return(0)); |
| 3977 | 3978 |
| 3978 gl_->GenSyncTokenCHROMIUM(kFenceSync, nullptr); | 3979 gl_->GenSyncTokenCHROMIUM(kFenceSync, nullptr); |
| 3979 EXPECT_EQ(GL_INVALID_VALUE, CheckError()); | 3980 EXPECT_EQ(GL_INVALID_VALUE, CheckError()); |
| 3980 | 3981 |
| 3981 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) | 3982 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) |
| 3982 .WillOnce(testing::Return(false)); | 3983 .WillOnce(Return(false)); |
| 3983 gl_->GenSyncTokenCHROMIUM(kFenceSync, sync_token_data); | 3984 gl_->GenSyncTokenCHROMIUM(kFenceSync, sync_token_data); |
| 3984 EXPECT_EQ(GL_INVALID_VALUE, CheckError()); | 3985 EXPECT_EQ(GL_INVALID_VALUE, CheckError()); |
| 3985 | 3986 |
| 3986 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) | 3987 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) |
| 3987 .WillOnce(testing::Return(true)); | 3988 .WillOnce(Return(true)); |
| 3988 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushReceived(kFenceSync)) | 3989 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushReceived(kFenceSync)) |
| 3989 .WillOnce(testing::Return(false)); | 3990 .WillOnce(Return(false)); |
| 3990 gl_->GenSyncTokenCHROMIUM(kFenceSync, sync_token_data); | 3991 gl_->GenSyncTokenCHROMIUM(kFenceSync, sync_token_data); |
| 3991 EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); | 3992 EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); |
| 3992 | 3993 |
| 3993 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) | 3994 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) |
| 3994 .WillOnce(testing::Return(true)); | 3995 .WillOnce(Return(true)); |
| 3995 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushReceived(kFenceSync)) | 3996 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushReceived(kFenceSync)) |
| 3996 .WillOnce(testing::Return(true)); | 3997 .WillOnce(Return(true)); |
| 3997 ClearCommands(); | 3998 ClearCommands(); |
| 3998 gl_->GenSyncTokenCHROMIUM(kFenceSync, sync_token_data); | 3999 gl_->GenSyncTokenCHROMIUM(kFenceSync, sync_token_data); |
| 3999 EXPECT_TRUE(NoCommandsWritten()); | 4000 EXPECT_TRUE(NoCommandsWritten()); |
| 4000 EXPECT_EQ(GL_NO_ERROR, CheckError()); | 4001 EXPECT_EQ(GL_NO_ERROR, CheckError()); |
| 4001 | 4002 |
| 4002 SyncToken sync_token; | 4003 SyncToken sync_token; |
| 4003 memcpy(&sync_token, sync_token_data, sizeof(SyncToken)); | 4004 memcpy(&sync_token, sync_token_data, sizeof(SyncToken)); |
| 4004 EXPECT_TRUE(sync_token.verified_flush()); | 4005 EXPECT_TRUE(sync_token.verified_flush()); |
| 4005 EXPECT_EQ(kNamespaceId, sync_token.namespace_id()); | 4006 EXPECT_EQ(kNamespaceId, sync_token.namespace_id()); |
| 4006 EXPECT_EQ(kCommandBufferId, sync_token.command_buffer_id()); | 4007 EXPECT_EQ(kCommandBufferId, sync_token.command_buffer_id()); |
| 4007 EXPECT_EQ(kFenceSync, sync_token.release_count()); | 4008 EXPECT_EQ(kFenceSync, sync_token.release_count()); |
| 4008 } | 4009 } |
| 4009 | 4010 |
| 4010 TEST_F(GLES2ImplementationTest, GenUnverifiedSyncTokenCHROMIUM) { | 4011 TEST_F(GLES2ImplementationTest, GenUnverifiedSyncTokenCHROMIUM) { |
| 4011 const CommandBufferNamespace kNamespaceId = CommandBufferNamespace::GPU_IO; | 4012 const CommandBufferNamespace kNamespaceId = CommandBufferNamespace::GPU_IO; |
| 4012 const CommandBufferId kCommandBufferId = | 4013 const CommandBufferId kCommandBufferId = |
| 4013 CommandBufferId::FromUnsafeValue(234u); | 4014 CommandBufferId::FromUnsafeValue(234u); |
| 4014 const GLuint64 kFenceSync = 123u; | 4015 const GLuint64 kFenceSync = 123u; |
| 4015 GLbyte sync_token_data[GL_SYNC_TOKEN_SIZE_CHROMIUM]; | 4016 GLbyte sync_token_data[GL_SYNC_TOKEN_SIZE_CHROMIUM]; |
| 4016 | 4017 |
| 4017 EXPECT_CALL(*gpu_control_, GetNamespaceID()) | 4018 EXPECT_CALL(*gpu_control_, GetNamespaceID()) |
| 4018 .WillRepeatedly(testing::Return(kNamespaceId)); | 4019 .WillRepeatedly(Return(kNamespaceId)); |
| 4019 EXPECT_CALL(*gpu_control_, GetCommandBufferID()) | 4020 EXPECT_CALL(*gpu_control_, GetCommandBufferID()) |
| 4020 .WillRepeatedly(testing::Return(kCommandBufferId)); | 4021 .WillRepeatedly(Return(kCommandBufferId)); |
| 4021 EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData()) | 4022 EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData()) |
| 4022 .WillRepeatedly(testing::Return(0)); | 4023 .WillRepeatedly(Return(0)); |
| 4023 | 4024 |
| 4024 gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, nullptr); | 4025 gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, nullptr); |
| 4025 EXPECT_EQ(GL_INVALID_VALUE, CheckError()); | 4026 EXPECT_EQ(GL_INVALID_VALUE, CheckError()); |
| 4026 | 4027 |
| 4027 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) | 4028 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) |
| 4028 .WillOnce(testing::Return(false)); | 4029 .WillOnce(Return(false)); |
| 4029 gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, sync_token_data); | 4030 gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, sync_token_data); |
| 4030 EXPECT_EQ(GL_INVALID_VALUE, CheckError()); | 4031 EXPECT_EQ(GL_INVALID_VALUE, CheckError()); |
| 4031 | 4032 |
| 4032 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) | 4033 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) |
| 4033 .WillOnce(testing::Return(true)); | 4034 .WillOnce(Return(true)); |
| 4034 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushed(kFenceSync)) | 4035 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushed(kFenceSync)) |
| 4035 .WillOnce(testing::Return(false)); | 4036 .WillOnce(Return(false)); |
| 4036 gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, sync_token_data); | 4037 gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, sync_token_data); |
| 4037 EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); | 4038 EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); |
| 4038 | 4039 |
| 4039 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) | 4040 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) |
| 4040 .WillOnce(testing::Return(true)); | 4041 .WillOnce(Return(true)); |
| 4041 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushed(kFenceSync)) | 4042 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushed(kFenceSync)) |
| 4042 .WillOnce(testing::Return(true)); | 4043 .WillOnce(Return(true)); |
| 4043 ClearCommands(); | 4044 ClearCommands(); |
| 4044 gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, sync_token_data); | 4045 gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, sync_token_data); |
| 4045 EXPECT_TRUE(NoCommandsWritten()); | 4046 EXPECT_TRUE(NoCommandsWritten()); |
| 4046 EXPECT_EQ(GL_NO_ERROR, CheckError()); | 4047 EXPECT_EQ(GL_NO_ERROR, CheckError()); |
| 4047 | 4048 |
| 4048 SyncToken sync_token; | 4049 SyncToken sync_token; |
| 4049 memcpy(&sync_token, sync_token_data, sizeof(SyncToken)); | 4050 memcpy(&sync_token, sync_token_data, sizeof(SyncToken)); |
| 4050 EXPECT_FALSE(sync_token.verified_flush()); | 4051 EXPECT_FALSE(sync_token.verified_flush()); |
| 4051 EXPECT_EQ(kNamespaceId, sync_token.namespace_id()); | 4052 EXPECT_EQ(kNamespaceId, sync_token.namespace_id()); |
| 4052 EXPECT_EQ(kCommandBufferId, sync_token.command_buffer_id()); | 4053 EXPECT_EQ(kCommandBufferId, sync_token.command_buffer_id()); |
| 4053 EXPECT_EQ(kFenceSync, sync_token.release_count()); | 4054 EXPECT_EQ(kFenceSync, sync_token.release_count()); |
| 4054 } | 4055 } |
| 4055 | 4056 |
| 4056 TEST_F(GLES2ImplementationTest, VerifySyncTokensCHROMIUM) { | 4057 TEST_F(GLES2ImplementationTest, VerifySyncTokensCHROMIUM) { |
| 4057 ExpectedMemoryInfo result = | 4058 ExpectedMemoryInfo result = |
| 4058 GetExpectedResultMemory(sizeof(cmds::GetError::Result)); | 4059 GetExpectedResultMemory(sizeof(cmds::GetError::Result)); |
| 4059 EXPECT_CALL(*command_buffer(), OnFlush()) | 4060 EXPECT_CALL(*command_buffer(), OnFlush()) |
| 4060 .WillRepeatedly(SetMemory(result.ptr, GLuint(GL_NO_ERROR))) | 4061 .WillRepeatedly(SetMemory(result.ptr, GLuint(GL_NO_ERROR))) |
| 4061 .RetiresOnSaturation(); | 4062 .RetiresOnSaturation(); |
| 4062 | 4063 |
| 4063 const CommandBufferNamespace kNamespaceId = CommandBufferNamespace::GPU_IO; | 4064 const CommandBufferNamespace kNamespaceId = CommandBufferNamespace::GPU_IO; |
| 4064 const CommandBufferId kCommandBufferId = | 4065 const CommandBufferId kCommandBufferId = |
| 4065 CommandBufferId::FromUnsafeValue(234u); | 4066 CommandBufferId::FromUnsafeValue(234u); |
| 4066 const GLuint64 kFenceSync = 123u; | 4067 const GLuint64 kFenceSync = 123u; |
| 4067 gpu::SyncToken sync_token; | 4068 gpu::SyncToken sync_token; |
| 4068 GLbyte* sync_token_datas[] = { sync_token.GetData() }; | 4069 GLbyte* sync_token_datas[] = { sync_token.GetData() }; |
| 4069 | 4070 |
| 4070 EXPECT_CALL(*gpu_control_, GetNamespaceID()) | 4071 EXPECT_CALL(*gpu_control_, GetNamespaceID()) |
| 4071 .WillRepeatedly(testing::Return(kNamespaceId)); | 4072 .WillRepeatedly(Return(kNamespaceId)); |
| 4072 EXPECT_CALL(*gpu_control_, GetCommandBufferID()) | 4073 EXPECT_CALL(*gpu_control_, GetCommandBufferID()) |
| 4073 .WillRepeatedly(testing::Return(kCommandBufferId)); | 4074 .WillRepeatedly(Return(kCommandBufferId)); |
| 4074 EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData()) | 4075 EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData()) |
| 4075 .WillRepeatedly(testing::Return(0)); | 4076 .WillRepeatedly(Return(0)); |
| 4076 | 4077 |
| 4077 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) | 4078 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) |
| 4078 .WillOnce(testing::Return(true)); | 4079 .WillOnce(Return(true)); |
| 4079 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushed(kFenceSync)) | 4080 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushed(kFenceSync)) |
| 4080 .WillOnce(testing::Return(true)); | 4081 .WillOnce(Return(true)); |
| 4081 gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, sync_token.GetData()); | 4082 gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, sync_token.GetData()); |
| 4082 ASSERT_TRUE(sync_token.HasData()); | 4083 ASSERT_TRUE(sync_token.HasData()); |
| 4083 ASSERT_FALSE(sync_token.verified_flush()); | 4084 ASSERT_FALSE(sync_token.verified_flush()); |
| 4084 | 4085 |
| 4085 ClearCommands(); | 4086 ClearCommands(); |
| 4086 EXPECT_CALL(*gpu_control_, CanWaitUnverifiedSyncToken(_)) | 4087 EXPECT_CALL(*gpu_control_, CanWaitUnverifiedSyncToken(_)) |
| 4087 .WillOnce(testing::Return(false)); | 4088 .WillOnce(Return(false)); |
| 4088 gl_->VerifySyncTokensCHROMIUM(sync_token_datas, 1); | 4089 gl_->VerifySyncTokensCHROMIUM(sync_token_datas, 1); |
| 4089 EXPECT_TRUE(NoCommandsWritten()); | 4090 EXPECT_TRUE(NoCommandsWritten()); |
| 4090 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); | 4091 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); |
| 4091 EXPECT_FALSE(sync_token.verified_flush()); | 4092 EXPECT_FALSE(sync_token.verified_flush()); |
| 4092 | 4093 |
| 4093 ClearCommands(); | 4094 ClearCommands(); |
| 4094 EXPECT_CALL(*gpu_control_, CanWaitUnverifiedSyncToken(_)) | 4095 EXPECT_CALL(*gpu_control_, CanWaitUnverifiedSyncToken(_)) |
| 4095 .WillOnce(testing::Return(true)); | 4096 .WillOnce(Return(true)); |
| 4096 EXPECT_CALL(*gpu_control_, EnsureWorkVisible()); | 4097 EXPECT_CALL(*gpu_control_, EnsureWorkVisible()); |
| 4097 gl_->VerifySyncTokensCHROMIUM(sync_token_datas, arraysize(sync_token_datas)); | 4098 gl_->VerifySyncTokensCHROMIUM(sync_token_datas, arraysize(sync_token_datas)); |
| 4098 EXPECT_TRUE(NoCommandsWritten()); | 4099 EXPECT_TRUE(NoCommandsWritten()); |
| 4099 EXPECT_EQ(GL_NO_ERROR, CheckError()); | 4100 EXPECT_EQ(GL_NO_ERROR, CheckError()); |
| 4100 | 4101 |
| 4101 EXPECT_EQ(kNamespaceId, sync_token.namespace_id()); | 4102 EXPECT_EQ(kNamespaceId, sync_token.namespace_id()); |
| 4102 EXPECT_EQ(kCommandBufferId, sync_token.command_buffer_id()); | 4103 EXPECT_EQ(kCommandBufferId, sync_token.command_buffer_id()); |
| 4103 EXPECT_EQ(kFenceSync, sync_token.release_count()); | 4104 EXPECT_EQ(kFenceSync, sync_token.release_count()); |
| 4104 EXPECT_TRUE(sync_token.verified_flush()); | 4105 EXPECT_TRUE(sync_token.verified_flush()); |
| 4105 } | 4106 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4167 } | 4168 } |
| 4168 | 4169 |
| 4169 TEST_F(GLES2ImplementationTest, WaitSyncTokenCHROMIUM) { | 4170 TEST_F(GLES2ImplementationTest, WaitSyncTokenCHROMIUM) { |
| 4170 const CommandBufferNamespace kNamespaceId = CommandBufferNamespace::GPU_IO; | 4171 const CommandBufferNamespace kNamespaceId = CommandBufferNamespace::GPU_IO; |
| 4171 const CommandBufferId kCommandBufferId = | 4172 const CommandBufferId kCommandBufferId = |
| 4172 CommandBufferId::FromUnsafeValue(234u); | 4173 CommandBufferId::FromUnsafeValue(234u); |
| 4173 const GLuint64 kFenceSync = 456u; | 4174 const GLuint64 kFenceSync = 456u; |
| 4174 GLbyte sync_token[GL_SYNC_TOKEN_SIZE_CHROMIUM]; | 4175 GLbyte sync_token[GL_SYNC_TOKEN_SIZE_CHROMIUM]; |
| 4175 | 4176 |
| 4176 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) | 4177 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync)) |
| 4177 .WillOnce(testing::Return(true)); | 4178 .WillOnce(Return(true)); |
| 4178 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushReceived(kFenceSync)) | 4179 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushReceived(kFenceSync)) |
| 4179 .WillOnce(testing::Return(true)); | 4180 .WillOnce(Return(true)); |
| 4180 EXPECT_CALL(*gpu_control_, GetNamespaceID()) | 4181 EXPECT_CALL(*gpu_control_, GetNamespaceID()).WillOnce(Return(kNamespaceId)); |
| 4181 .WillOnce(testing::Return(kNamespaceId)); | |
| 4182 EXPECT_CALL(*gpu_control_, GetCommandBufferID()) | 4182 EXPECT_CALL(*gpu_control_, GetCommandBufferID()) |
| 4183 .WillOnce(testing::Return(kCommandBufferId)); | 4183 .WillOnce(Return(kCommandBufferId)); |
| 4184 EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData()) | 4184 EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData()).WillOnce(Return(0)); |
| 4185 .WillOnce(testing::Return(0)); | |
| 4186 gl_->GenSyncTokenCHROMIUM(kFenceSync, sync_token); | 4185 gl_->GenSyncTokenCHROMIUM(kFenceSync, sync_token); |
| 4187 | 4186 |
| 4188 struct Cmds { | 4187 struct Cmds { |
| 4189 cmds::WaitSyncTokenCHROMIUM wait_sync_token; | 4188 cmds::WaitSyncTokenCHROMIUM wait_sync_token; |
| 4190 }; | 4189 }; |
| 4191 Cmds expected; | 4190 Cmds expected; |
| 4192 expected.wait_sync_token.Init(kNamespaceId, kCommandBufferId.GetUnsafeValue(), | 4191 expected.wait_sync_token.Init(kNamespaceId, kCommandBufferId.GetUnsafeValue(), |
| 4193 kFenceSync); | 4192 kFenceSync); |
| 4194 | 4193 |
| 4195 gl_->WaitSyncTokenCHROMIUM(sync_token); | 4194 gl_->WaitSyncTokenCHROMIUM(sync_token); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 4214 gpu::SyncToken invalid_sync_token; | 4213 gpu::SyncToken invalid_sync_token; |
| 4215 gl_->WaitSyncTokenCHROMIUM(invalid_sync_token.GetConstData()); | 4214 gl_->WaitSyncTokenCHROMIUM(invalid_sync_token.GetConstData()); |
| 4216 EXPECT_TRUE(NoCommandsWritten()); | 4215 EXPECT_TRUE(NoCommandsWritten()); |
| 4217 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError()); | 4216 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError()); |
| 4218 | 4217 |
| 4219 // Unverified sync token should produce INVALID_OPERATION. | 4218 // Unverified sync token should produce INVALID_OPERATION. |
| 4220 ClearCommands(); | 4219 ClearCommands(); |
| 4221 gpu::SyncToken unverified_sync_token(CommandBufferNamespace::GPU_IO, 0, | 4220 gpu::SyncToken unverified_sync_token(CommandBufferNamespace::GPU_IO, 0, |
| 4222 gpu::CommandBufferId(), 0); | 4221 gpu::CommandBufferId(), 0); |
| 4223 EXPECT_CALL(*gpu_control_, CanWaitUnverifiedSyncToken(_)) | 4222 EXPECT_CALL(*gpu_control_, CanWaitUnverifiedSyncToken(_)) |
| 4224 .WillOnce(testing::Return(false)); | 4223 .WillOnce(Return(false)); |
| 4225 gl_->WaitSyncTokenCHROMIUM(unverified_sync_token.GetConstData()); | 4224 gl_->WaitSyncTokenCHROMIUM(unverified_sync_token.GetConstData()); |
| 4226 EXPECT_TRUE(NoCommandsWritten()); | 4225 EXPECT_TRUE(NoCommandsWritten()); |
| 4227 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); | 4226 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); |
| 4228 } | 4227 } |
| 4229 | 4228 |
| 4230 TEST_F(GLES2ImplementationTest, IsEnabled) { | 4229 TEST_F(GLES2ImplementationTest, IsEnabled) { |
| 4231 // If we use a valid enum, its state is cached on client side, so no command | 4230 // If we use a valid enum, its state is cached on client side, so no command |
| 4232 // is actually generated, and this test will fail. | 4231 // is actually generated, and this test will fail. |
| 4233 // TODO(zmo): it seems we never need the command. Maybe remove it. | 4232 // TODO(zmo): it seems we never need the command. Maybe remove it. |
| 4234 GLenum kCap = 1; | 4233 GLenum kCap = 1; |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4445 result1.id, result1.offset); | 4444 result1.id, result1.offset); |
| 4446 EXPECT_CALL(*command_buffer(), OnFlush()) | 4445 EXPECT_CALL(*command_buffer(), OnFlush()) |
| 4447 .WillOnce(SetMemory(result1.ptr, | 4446 .WillOnce(SetMemory(result1.ptr, |
| 4448 SizedResultHelper<ResultType>(kNumSampleCounts))) | 4447 SizedResultHelper<ResultType>(kNumSampleCounts))) |
| 4449 .RetiresOnSaturation(); | 4448 .RetiresOnSaturation(); |
| 4450 gl_->GetInternalformativ(123, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 1, &result); | 4449 gl_->GetInternalformativ(123, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 1, &result); |
| 4451 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 4450 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
| 4452 EXPECT_EQ(static_cast<ResultType>(kNumSampleCounts), result); | 4451 EXPECT_EQ(static_cast<ResultType>(kNumSampleCounts), result); |
| 4453 } | 4452 } |
| 4454 | 4453 |
| 4454 static void CountCallback(int* count) { |
| 4455 (*count)++; |
| 4456 } |
| 4457 |
| 4458 TEST_F(GLES2ImplementationTest, SignalSyncToken) { |
| 4459 EXPECT_CALL(*gpu_control_, GenerateFenceSyncRelease()).WillOnce(Return(1)); |
| 4460 const uint64_t fence_sync = gl_->InsertFenceSyncCHROMIUM(); |
| 4461 gl_->ShallowFlushCHROMIUM(); |
| 4462 |
| 4463 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(fence_sync)) |
| 4464 .WillOnce(Return(true)); |
| 4465 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushReceived(fence_sync)) |
| 4466 .WillOnce(Return(true)); |
| 4467 EXPECT_CALL(*gpu_control_, GetNamespaceID()).WillOnce(Return(GPU_IO)); |
| 4468 EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData()).WillOnce(Return(0)); |
| 4469 EXPECT_CALL(*gpu_control_, GetCommandBufferID()) |
| 4470 .WillOnce(Return(CommandBufferId::FromUnsafeValue(1))); |
| 4471 gpu::SyncToken sync_token; |
| 4472 gl_->GenSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); |
| 4473 |
| 4474 int signaled_count = 0; |
| 4475 |
| 4476 // Request a signal sync token, which gives a callback to the GpuControl to |
| 4477 // run when the sync token is reached. |
| 4478 base::Closure signal_closure; |
| 4479 EXPECT_CALL(*gpu_control_, SignalSyncToken(_, _)) |
| 4480 .WillOnce(SaveArg<1>(&signal_closure)); |
| 4481 gl_->SignalSyncToken(sync_token, base::Bind(&CountCallback, &signaled_count)); |
| 4482 EXPECT_EQ(0, signaled_count); |
| 4483 |
| 4484 // When GpuControl runs the callback, the original callback we gave to |
| 4485 // GLES2Implementation is run. |
| 4486 signal_closure.Run(); |
| 4487 EXPECT_EQ(1, signaled_count); |
| 4488 } |
| 4489 |
| 4490 TEST_F(GLES2ImplementationTest, SignalSyncTokenAfterContextLoss) { |
| 4491 EXPECT_CALL(*gpu_control_, GenerateFenceSyncRelease()).WillOnce(Return(1)); |
| 4492 const uint64_t fence_sync = gl_->InsertFenceSyncCHROMIUM(); |
| 4493 gl_->ShallowFlushCHROMIUM(); |
| 4494 |
| 4495 EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(fence_sync)) |
| 4496 .WillOnce(Return(true)); |
| 4497 EXPECT_CALL(*gpu_control_, IsFenceSyncFlushReceived(fence_sync)) |
| 4498 .WillOnce(Return(true)); |
| 4499 EXPECT_CALL(*gpu_control_, GetNamespaceID()).WillOnce(Return(GPU_IO)); |
| 4500 EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData()).WillOnce(Return(0)); |
| 4501 EXPECT_CALL(*gpu_control_, GetCommandBufferID()) |
| 4502 .WillOnce(Return(CommandBufferId::FromUnsafeValue(1))); |
| 4503 gpu::SyncToken sync_token; |
| 4504 gl_->GenSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); |
| 4505 |
| 4506 int signaled_count = 0; |
| 4507 |
| 4508 // Request a signal sync token, which gives a callback to the GpuControl to |
| 4509 // run when the sync token is reached. |
| 4510 base::Closure signal_closure; |
| 4511 EXPECT_CALL(*gpu_control_, SignalSyncToken(_, _)) |
| 4512 .WillOnce(SaveArg<1>(&signal_closure)); |
| 4513 gl_->SignalSyncToken(sync_token, base::Bind(&CountCallback, &signaled_count)); |
| 4514 EXPECT_EQ(0, signaled_count); |
| 4515 |
| 4516 // Inform the GLES2Implementation that the context is lost. |
| 4517 GpuControlClient* gl_as_client = gl_; |
| 4518 gl_as_client->OnGpuControlLostContext(); |
| 4519 |
| 4520 // When GpuControl runs the callback, the original callback we gave to |
| 4521 // GLES2Implementation is *not* run, since the context is lost and we |
| 4522 // have already run the lost context callback. |
| 4523 signal_closure.Run(); |
| 4524 EXPECT_EQ(0, signaled_count); |
| 4525 } |
| 4526 |
| 4455 TEST_F(GLES2ImplementationManualInitTest, LoseContextOnOOM) { | 4527 TEST_F(GLES2ImplementationManualInitTest, LoseContextOnOOM) { |
| 4456 ContextInitOptions init_options; | 4528 ContextInitOptions init_options; |
| 4457 init_options.lose_context_when_out_of_memory = true; | 4529 init_options.lose_context_when_out_of_memory = true; |
| 4458 ASSERT_TRUE(Initialize(init_options)); | 4530 ASSERT_TRUE(Initialize(init_options)); |
| 4459 | 4531 |
| 4460 struct Cmds { | 4532 struct Cmds { |
| 4461 cmds::LoseContextCHROMIUM cmd; | 4533 cmds::LoseContextCHROMIUM cmd; |
| 4462 }; | 4534 }; |
| 4463 | 4535 |
| 4464 GLsizei max = std::numeric_limits<GLsizei>::max(); | 4536 GLsizei max = std::numeric_limits<GLsizei>::max(); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4507 ContextInitOptions init_options; | 4579 ContextInitOptions init_options; |
| 4508 init_options.transfer_buffer_initialize_fail = true; | 4580 init_options.transfer_buffer_initialize_fail = true; |
| 4509 EXPECT_FALSE(Initialize(init_options)); | 4581 EXPECT_FALSE(Initialize(init_options)); |
| 4510 } | 4582 } |
| 4511 | 4583 |
| 4512 #include "base/macros.h" | 4584 #include "base/macros.h" |
| 4513 #include "gpu/command_buffer/client/gles2_implementation_unittest_autogen.h" | 4585 #include "gpu/command_buffer/client/gles2_implementation_unittest_autogen.h" |
| 4514 | 4586 |
| 4515 } // namespace gles2 | 4587 } // namespace gles2 |
| 4516 } // namespace gpu | 4588 } // namespace gpu |
| OLD | NEW |