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

Side by Side Diff: gpu/command_buffer/client/gles2_implementation_unittest.cc

Issue 1917283003: Add a test for not signaling sync points after context loss (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: signal-and-lost: . Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698