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

Unified 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, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/client/gles2_implementation_unittest.cc
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc
index c4f7a0d4880a7fdbb8abebedf85c7d0177b84351..3a0a40cc522d733cfd883abcfc669e3c93962fac 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
@@ -41,6 +41,7 @@ using testing::InSequence;
using testing::Invoke;
using testing::Mock;
using testing::Pointee;
+using testing::SaveArg;
using testing::Sequence;
using testing::StrictMock;
using testing::Truly;
@@ -482,7 +483,7 @@ class GLES2ImplementationTest : public testing::Test {
capabilities.major_version = major_version;
capabilities.minor_version = minor_version;
EXPECT_CALL(*gpu_control_, GetCapabilities())
- .WillOnce(testing::Return(capabilities));
+ .WillOnce(Return(capabilities));
{
InSequence sequence;
@@ -505,7 +506,7 @@ class GLES2ImplementationTest : public testing::Test {
return false;
helper_->CommandBufferHelper::Finish();
- ::testing::Mock::VerifyAndClearExpectations(gl_.get());
+ Mock::VerifyAndClearExpectations(gl_.get());
scoped_refptr<Buffer> ring_buffer = helper_->get_ring_buffer();
commands_ = static_cast<CommandBufferEntry*>(ring_buffer->memory()) +
@@ -513,7 +514,7 @@ class GLES2ImplementationTest : public testing::Test {
ClearCommands();
EXPECT_TRUE(transfer_buffer_->InSync());
- ::testing::Mock::VerifyAndClearExpectations(command_buffer());
+ Mock::VerifyAndClearExpectations(command_buffer());
return true;
}
@@ -3948,7 +3949,7 @@ TEST_F(GLES2ImplementationTest, AllowNestedTracesCHROMIUM) {
TEST_F(GLES2ImplementationTest, InsertFenceSyncCHROMIUM) {
const GLuint64 kFenceSync = 123u;
EXPECT_CALL(*gpu_control_, GenerateFenceSyncRelease())
- .WillOnce(testing::Return(kFenceSync));
+ .WillOnce(Return(kFenceSync));
struct Cmds {
cmds::InsertFenceSyncCHROMIUM insert_fence_sync;
@@ -3969,31 +3970,31 @@ TEST_F(GLES2ImplementationTest, GenSyncTokenCHROMIUM) {
GLbyte sync_token_data[GL_SYNC_TOKEN_SIZE_CHROMIUM];
EXPECT_CALL(*gpu_control_, GetNamespaceID())
- .WillRepeatedly(testing::Return(kNamespaceId));
+ .WillRepeatedly(Return(kNamespaceId));
EXPECT_CALL(*gpu_control_, GetCommandBufferID())
- .WillRepeatedly(testing::Return(kCommandBufferId));
+ .WillRepeatedly(Return(kCommandBufferId));
EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData())
- .WillRepeatedly(testing::Return(0));
+ .WillRepeatedly(Return(0));
gl_->GenSyncTokenCHROMIUM(kFenceSync, nullptr);
EXPECT_EQ(GL_INVALID_VALUE, CheckError());
EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync))
- .WillOnce(testing::Return(false));
+ .WillOnce(Return(false));
gl_->GenSyncTokenCHROMIUM(kFenceSync, sync_token_data);
EXPECT_EQ(GL_INVALID_VALUE, CheckError());
EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync))
- .WillOnce(testing::Return(true));
+ .WillOnce(Return(true));
EXPECT_CALL(*gpu_control_, IsFenceSyncFlushReceived(kFenceSync))
- .WillOnce(testing::Return(false));
+ .WillOnce(Return(false));
gl_->GenSyncTokenCHROMIUM(kFenceSync, sync_token_data);
EXPECT_EQ(GL_INVALID_OPERATION, CheckError());
EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync))
- .WillOnce(testing::Return(true));
+ .WillOnce(Return(true));
EXPECT_CALL(*gpu_control_, IsFenceSyncFlushReceived(kFenceSync))
- .WillOnce(testing::Return(true));
+ .WillOnce(Return(true));
ClearCommands();
gl_->GenSyncTokenCHROMIUM(kFenceSync, sync_token_data);
EXPECT_TRUE(NoCommandsWritten());
@@ -4015,31 +4016,31 @@ TEST_F(GLES2ImplementationTest, GenUnverifiedSyncTokenCHROMIUM) {
GLbyte sync_token_data[GL_SYNC_TOKEN_SIZE_CHROMIUM];
EXPECT_CALL(*gpu_control_, GetNamespaceID())
- .WillRepeatedly(testing::Return(kNamespaceId));
+ .WillRepeatedly(Return(kNamespaceId));
EXPECT_CALL(*gpu_control_, GetCommandBufferID())
- .WillRepeatedly(testing::Return(kCommandBufferId));
+ .WillRepeatedly(Return(kCommandBufferId));
EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData())
- .WillRepeatedly(testing::Return(0));
+ .WillRepeatedly(Return(0));
gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, nullptr);
EXPECT_EQ(GL_INVALID_VALUE, CheckError());
EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync))
- .WillOnce(testing::Return(false));
+ .WillOnce(Return(false));
gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, sync_token_data);
EXPECT_EQ(GL_INVALID_VALUE, CheckError());
EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync))
- .WillOnce(testing::Return(true));
+ .WillOnce(Return(true));
EXPECT_CALL(*gpu_control_, IsFenceSyncFlushed(kFenceSync))
- .WillOnce(testing::Return(false));
+ .WillOnce(Return(false));
gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, sync_token_data);
EXPECT_EQ(GL_INVALID_OPERATION, CheckError());
EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync))
- .WillOnce(testing::Return(true));
+ .WillOnce(Return(true));
EXPECT_CALL(*gpu_control_, IsFenceSyncFlushed(kFenceSync))
- .WillOnce(testing::Return(true));
+ .WillOnce(Return(true));
ClearCommands();
gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, sync_token_data);
EXPECT_TRUE(NoCommandsWritten());
@@ -4068,23 +4069,23 @@ TEST_F(GLES2ImplementationTest, VerifySyncTokensCHROMIUM) {
GLbyte* sync_token_datas[] = { sync_token.GetData() };
EXPECT_CALL(*gpu_control_, GetNamespaceID())
- .WillRepeatedly(testing::Return(kNamespaceId));
+ .WillRepeatedly(Return(kNamespaceId));
EXPECT_CALL(*gpu_control_, GetCommandBufferID())
- .WillRepeatedly(testing::Return(kCommandBufferId));
+ .WillRepeatedly(Return(kCommandBufferId));
EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData())
- .WillRepeatedly(testing::Return(0));
+ .WillRepeatedly(Return(0));
EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync))
- .WillOnce(testing::Return(true));
+ .WillOnce(Return(true));
EXPECT_CALL(*gpu_control_, IsFenceSyncFlushed(kFenceSync))
- .WillOnce(testing::Return(true));
+ .WillOnce(Return(true));
gl_->GenUnverifiedSyncTokenCHROMIUM(kFenceSync, sync_token.GetData());
ASSERT_TRUE(sync_token.HasData());
ASSERT_FALSE(sync_token.verified_flush());
ClearCommands();
EXPECT_CALL(*gpu_control_, CanWaitUnverifiedSyncToken(_))
- .WillOnce(testing::Return(false));
+ .WillOnce(Return(false));
gl_->VerifySyncTokensCHROMIUM(sync_token_datas, 1);
EXPECT_TRUE(NoCommandsWritten());
EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
@@ -4092,7 +4093,7 @@ TEST_F(GLES2ImplementationTest, VerifySyncTokensCHROMIUM) {
ClearCommands();
EXPECT_CALL(*gpu_control_, CanWaitUnverifiedSyncToken(_))
- .WillOnce(testing::Return(true));
+ .WillOnce(Return(true));
EXPECT_CALL(*gpu_control_, EnsureWorkVisible());
gl_->VerifySyncTokensCHROMIUM(sync_token_datas, arraysize(sync_token_datas));
EXPECT_TRUE(NoCommandsWritten());
@@ -4174,15 +4175,13 @@ TEST_F(GLES2ImplementationTest, WaitSyncTokenCHROMIUM) {
GLbyte sync_token[GL_SYNC_TOKEN_SIZE_CHROMIUM];
EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(kFenceSync))
- .WillOnce(testing::Return(true));
+ .WillOnce(Return(true));
EXPECT_CALL(*gpu_control_, IsFenceSyncFlushReceived(kFenceSync))
- .WillOnce(testing::Return(true));
- EXPECT_CALL(*gpu_control_, GetNamespaceID())
- .WillOnce(testing::Return(kNamespaceId));
+ .WillOnce(Return(true));
+ EXPECT_CALL(*gpu_control_, GetNamespaceID()).WillOnce(Return(kNamespaceId));
EXPECT_CALL(*gpu_control_, GetCommandBufferID())
- .WillOnce(testing::Return(kCommandBufferId));
- EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData())
- .WillOnce(testing::Return(0));
+ .WillOnce(Return(kCommandBufferId));
+ EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData()).WillOnce(Return(0));
gl_->GenSyncTokenCHROMIUM(kFenceSync, sync_token);
struct Cmds {
@@ -4221,7 +4220,7 @@ TEST_F(GLES2ImplementationTest, WaitSyncTokenCHROMIUMErrors) {
gpu::SyncToken unverified_sync_token(CommandBufferNamespace::GPU_IO, 0,
gpu::CommandBufferId(), 0);
EXPECT_CALL(*gpu_control_, CanWaitUnverifiedSyncToken(_))
- .WillOnce(testing::Return(false));
+ .WillOnce(Return(false));
gl_->WaitSyncTokenCHROMIUM(unverified_sync_token.GetConstData());
EXPECT_TRUE(NoCommandsWritten());
EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
@@ -4452,6 +4451,79 @@ TEST_F(GLES2ImplementationTest, GetInternalformativ) {
EXPECT_EQ(static_cast<ResultType>(kNumSampleCounts), result);
}
+static void CountCallback(int* count) {
+ (*count)++;
+}
+
+TEST_F(GLES2ImplementationTest, SignalSyncToken) {
+ EXPECT_CALL(*gpu_control_, GenerateFenceSyncRelease()).WillOnce(Return(1));
+ const uint64_t fence_sync = gl_->InsertFenceSyncCHROMIUM();
+ gl_->ShallowFlushCHROMIUM();
+
+ EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(fence_sync))
+ .WillOnce(Return(true));
+ EXPECT_CALL(*gpu_control_, IsFenceSyncFlushReceived(fence_sync))
+ .WillOnce(Return(true));
+ EXPECT_CALL(*gpu_control_, GetNamespaceID()).WillOnce(Return(GPU_IO));
+ EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData()).WillOnce(Return(0));
+ EXPECT_CALL(*gpu_control_, GetCommandBufferID())
+ .WillOnce(Return(CommandBufferId::FromUnsafeValue(1)));
+ gpu::SyncToken sync_token;
+ gl_->GenSyncTokenCHROMIUM(fence_sync, sync_token.GetData());
+
+ int signaled_count = 0;
+
+ // Request a signal sync token, which gives a callback to the GpuControl to
+ // run when the sync token is reached.
+ base::Closure signal_closure;
+ EXPECT_CALL(*gpu_control_, SignalSyncToken(_, _))
+ .WillOnce(SaveArg<1>(&signal_closure));
+ gl_->SignalSyncToken(sync_token, base::Bind(&CountCallback, &signaled_count));
+ EXPECT_EQ(0, signaled_count);
+
+ // When GpuControl runs the callback, the original callback we gave to
+ // GLES2Implementation is run.
+ signal_closure.Run();
+ EXPECT_EQ(1, signaled_count);
+}
+
+TEST_F(GLES2ImplementationTest, SignalSyncTokenAfterContextLoss) {
+ EXPECT_CALL(*gpu_control_, GenerateFenceSyncRelease()).WillOnce(Return(1));
+ const uint64_t fence_sync = gl_->InsertFenceSyncCHROMIUM();
+ gl_->ShallowFlushCHROMIUM();
+
+ EXPECT_CALL(*gpu_control_, IsFenceSyncRelease(fence_sync))
+ .WillOnce(Return(true));
+ EXPECT_CALL(*gpu_control_, IsFenceSyncFlushReceived(fence_sync))
+ .WillOnce(Return(true));
+ EXPECT_CALL(*gpu_control_, GetNamespaceID()).WillOnce(Return(GPU_IO));
+ EXPECT_CALL(*gpu_control_, GetExtraCommandBufferData()).WillOnce(Return(0));
+ EXPECT_CALL(*gpu_control_, GetCommandBufferID())
+ .WillOnce(Return(CommandBufferId::FromUnsafeValue(1)));
+ gpu::SyncToken sync_token;
+ gl_->GenSyncTokenCHROMIUM(fence_sync, sync_token.GetData());
+
+ int signaled_count = 0;
+
+ // Request a signal sync token, which gives a callback to the GpuControl to
+ // run when the sync token is reached.
+ base::Closure signal_closure;
+ EXPECT_CALL(*gpu_control_, SignalSyncToken(_, _))
+ .WillOnce(SaveArg<1>(&signal_closure));
+ gl_->SignalSyncToken(sync_token, base::Bind(&CountCallback, &signaled_count));
+ EXPECT_EQ(0, signaled_count);
+
+ // Inform the GLES2Implementation that the context is lost.
+ GpuControlClient* gl_as_client = gl_;
+ gl_as_client->OnGpuControlLostContext();
+
+ // When GpuControl runs the callback, the original callback we gave to
+ // GLES2Implementation is *not* run, since the context is lost and we
+ // have already run the lost context callback.
+ signal_closure.Run();
+ EXPECT_EQ(0, signaled_count);
+}
+
TEST_F(GLES2ImplementationManualInitTest, LoseContextOnOOM) {
ContextInitOptions init_options;
init_options.lose_context_when_out_of_memory = true;
« 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