Index: gpu/command_buffer/tests/gl_manager.cc |
diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc |
index 86329147466b63f04755b5a0e502167d68d18f7a..812d8fd505e668e5b77066eafa5db46cb904cac3 100644 |
--- a/gpu/command_buffer/tests/gl_manager.cc |
+++ b/gpu/command_buffer/tests/gl_manager.cc |
@@ -21,6 +21,7 @@ |
#include "gpu/command_buffer/client/transfer_buffer.h" |
#include "gpu/command_buffer/common/constants.h" |
#include "gpu/command_buffer/common/gles2_cmd_utils.h" |
+#include "gpu/command_buffer/common/sync_token.h" |
#include "gpu/command_buffer/common/value_state.h" |
#include "gpu/command_buffer/service/command_buffer_service.h" |
#include "gpu/command_buffer/service/context_group.h" |
@@ -122,6 +123,8 @@ GLManager::Options::Options() |
GLManager::GLManager() |
: sync_point_manager_(nullptr), |
context_lost_allowed_(false), |
+ pause_commands_(false), |
+ paused_order_num_(0), |
command_buffer_id_(g_next_command_buffer_id++), |
next_fence_sync_release_(1) { |
SetupBaseContext(); |
@@ -402,11 +405,25 @@ void GLManager::PumpCommands() { |
uint32_t order_num = 0; |
if (sync_point_manager_) { |
// If sync point manager is supported, assign order numbers to commands. |
- order_num = sync_point_order_data_->GenerateUnprocessedOrderNumber( |
- sync_point_manager_); |
+ if (paused_order_num_) { |
+ // Was previous paused, continue to process the order number. |
+ order_num = paused_order_num_; |
+ paused_order_num_ = 0; |
+ } else { |
+ order_num = sync_point_order_data_->GenerateUnprocessedOrderNumber( |
+ sync_point_manager_); |
+ } |
sync_point_order_data_->BeginProcessingOrderNumber(order_num); |
} |
+ if (pause_commands_) { |
+ // Do not process commands, simply store the current order number. |
+ paused_order_num_ = order_num; |
+ |
+ sync_point_order_data_->PauseProcessingOrderNumber(order_num); |
+ return; |
+ } |
+ |
gpu_scheduler_->PutChanged(); |
::gpu::CommandBuffer::State state = command_buffer_->GetLastState(); |
if (!context_lost_allowed_) { |
@@ -533,7 +550,20 @@ bool GLManager::IsFenceSyncFlushReceived(uint64_t release) { |
void GLManager::SignalSyncToken(const gpu::SyncToken& sync_token, |
const base::Closure& callback) { |
- NOTIMPLEMENTED(); |
+ if (sync_point_manager_) { |
+ scoped_refptr<gpu::SyncPointClientState> release_state = |
+ sync_point_manager_->GetSyncPointClientState( |
+ sync_token.namespace_id(), sync_token.command_buffer_id()); |
+ |
+ if (release_state) { |
+ sync_point_client_->WaitOutOfOrder(release_state.get(), |
+ sync_token.release_count(), callback); |
+ return; |
+ } |
+ } |
+ |
+ // Something went wrong, just run the callback now. |
+ callback.Run(); |
} |
bool GLManager::CanWaitUnverifiedSyncToken(const gpu::SyncToken* sync_token) { |