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

Unified Diff: gpu/ipc/service/gpu_command_buffer_stub.cc

Issue 2722883002: gpu: Allow waiting on sync tokens without sync token client. (Closed)
Patch Set: review Created 3 years, 10 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 | « gpu/ipc/service/gpu_command_buffer_stub.h ('k') | services/ui/gpu/gpu_service.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/ipc/service/gpu_command_buffer_stub.cc
diff --git a/gpu/ipc/service/gpu_command_buffer_stub.cc b/gpu/ipc/service/gpu_command_buffer_stub.cc
index 1cbea3224240190481891cd2ee7d745ef0df4767..ffa0a3c23bfcac4e0f8bcc846b14be68e04726b1 100644
--- a/gpu/ipc/service/gpu_command_buffer_stub.cc
+++ b/gpu/ipc/service/gpu_command_buffer_stub.cc
@@ -276,7 +276,10 @@ bool GpuCommandBufferStub::OnMessageReceived(const IPC::Message& message) {
message.type() != GpuCommandBufferMsg_WaitForTokenInRange::ID &&
message.type() != GpuCommandBufferMsg_WaitForGetOffsetInRange::ID &&
message.type() != GpuCommandBufferMsg_RegisterTransferBuffer::ID &&
- message.type() != GpuCommandBufferMsg_DestroyTransferBuffer::ID) {
+ message.type() != GpuCommandBufferMsg_DestroyTransferBuffer::ID &&
+ message.type() != GpuCommandBufferMsg_WaitSyncToken::ID &&
+ message.type() != GpuCommandBufferMsg_SignalSyncToken::ID &&
+ message.type() != GpuCommandBufferMsg_SignalQuery::ID) {
if (!MakeCurrent())
return false;
have_context = true;
@@ -642,7 +645,8 @@ bool GpuCommandBufferStub::Initialize(
decoder_.reset(gles2::GLES2Decoder::Create(context_group_.get()));
executor_.reset(new CommandExecutor(command_buffer_.get(), decoder_.get(),
decoder_.get()));
- sync_point_client_ = channel_->sync_point_manager()->CreateSyncPointClient(
+ sync_point_client_ = base::MakeUnique<SyncPointClient>(
+ channel_->sync_point_manager(),
channel_->GetSyncPointOrderData(stream_id_),
CommandBufferNamespace::GPU_IO, command_buffer_id_);
@@ -783,8 +787,8 @@ bool GpuCommandBufferStub::Initialize(
base::Unretained(this)));
decoder_->SetFenceSyncReleaseCallback(base::Bind(
&GpuCommandBufferStub::OnFenceSyncRelease, base::Unretained(this)));
- decoder_->SetWaitFenceSyncCallback(base::Bind(
- &GpuCommandBufferStub::OnWaitFenceSync, base::Unretained(this)));
+ decoder_->SetWaitSyncTokenCallback(base::Bind(
+ &GpuCommandBufferStub::OnWaitSyncToken, base::Unretained(this)));
decoder_->SetDescheduleUntilFinishedCallback(
base::Bind(&GpuCommandBufferStub::OnDescheduleUntilFinished,
base::Unretained(this)));
@@ -1002,34 +1006,12 @@ void GpuCommandBufferStub::PutChanged() {
executor_->PutChanged();
}
-void GpuCommandBufferStub::PullTextureUpdates(
- CommandBufferNamespace namespace_id,
- CommandBufferId command_buffer_id,
- uint32_t release) {
- gles2::MailboxManager* mailbox_manager =
- context_group_->mailbox_manager();
- if (mailbox_manager->UsesSync() && MakeCurrent()) {
- SyncToken sync_token(namespace_id, 0, command_buffer_id, release);
- mailbox_manager->PullTextureUpdates(sync_token);
- }
-}
-
-void GpuCommandBufferStub::OnWaitSyncToken(const SyncToken& sync_token) {
- OnWaitFenceSync(sync_token.namespace_id(), sync_token.command_buffer_id(),
- sync_token.release_count());
-}
-
void GpuCommandBufferStub::OnSignalSyncToken(const SyncToken& sync_token,
uint32_t id) {
- scoped_refptr<SyncPointClientState> release_state =
- channel_->sync_point_manager()->GetSyncPointClientState(
- sync_token.namespace_id(), sync_token.command_buffer_id());
-
- if (release_state) {
- sync_point_client_->Wait(release_state.get(), sync_token.release_count(),
- base::Bind(&GpuCommandBufferStub::OnSignalAck,
- this->AsWeakPtr(), id));
- } else {
+ if (!sync_point_client_->WaitNonThreadSafe(
+ sync_token, channel_->task_runner(),
+ base::Bind(&GpuCommandBufferStub::OnSignalAck, this->AsWeakPtr(),
+ id))) {
OnSignalAck(id);
}
}
@@ -1058,18 +1040,11 @@ void GpuCommandBufferStub::OnSignalQuery(uint32_t query_id, uint32_t id) {
}
void GpuCommandBufferStub::OnFenceSyncRelease(uint64_t release) {
- if (sync_point_client_->client_state()->IsFenceSyncReleased(release)) {
- DLOG(ERROR) << "Fence Sync has already been released.";
- return;
- }
-
- gles2::MailboxManager* mailbox_manager =
- context_group_->mailbox_manager();
- if (mailbox_manager->UsesSync() && MakeCurrent()) {
- SyncToken sync_token(CommandBufferNamespace::GPU_IO, 0,
- command_buffer_id_, release);
+ SyncToken sync_token(CommandBufferNamespace::GPU_IO, 0, command_buffer_id_,
+ release);
+ gles2::MailboxManager* mailbox_manager = context_group_->mailbox_manager();
+ if (mailbox_manager->UsesSync() && MakeCurrent())
mailbox_manager->PushTextureUpdates(sync_token);
- }
command_buffer_->SetReleaseCount(release);
sync_point_client_->ReleaseFenceSync(release);
@@ -1090,50 +1065,40 @@ void GpuCommandBufferStub::OnRescheduleAfterFinished() {
channel_->OnStreamRescheduled(stream_id_, true);
}
-bool GpuCommandBufferStub::OnWaitFenceSync(
- CommandBufferNamespace namespace_id,
- CommandBufferId command_buffer_id,
- uint64_t release) {
+bool GpuCommandBufferStub::OnWaitSyncToken(const SyncToken& sync_token) {
DCHECK(!waiting_for_sync_point_);
DCHECK(executor_->scheduled());
+ TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitSyncToken", this, "GpuCommandBufferStub",
+ this);
- scoped_refptr<SyncPointClientState> release_state =
- channel_->sync_point_manager()->GetSyncPointClientState(
- namespace_id, command_buffer_id);
+ waiting_for_sync_point_ = sync_point_client_->WaitNonThreadSafe(
+ sync_token, channel_->task_runner(),
+ base::Bind(&GpuCommandBufferStub::OnWaitSyncTokenCompleted, AsWeakPtr(),
+ sync_token));
- if (!release_state)
- return true;
-
- if (release_state->IsFenceSyncReleased(release)) {
- PullTextureUpdates(namespace_id, command_buffer_id, release);
+ if (waiting_for_sync_point_) {
+ executor_->SetScheduled(false);
+ channel_->OnStreamRescheduled(stream_id_, false);
return true;
}
- TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitFenceSync", this, "GpuCommandBufferStub",
- this);
- waiting_for_sync_point_ = true;
- sync_point_client_->WaitNonThreadSafe(
- release_state.get(), release, channel_->task_runner(),
- base::Bind(&GpuCommandBufferStub::OnWaitFenceSyncCompleted,
- this->AsWeakPtr(), namespace_id, command_buffer_id, release));
-
- if (!waiting_for_sync_point_)
- return true;
-
- executor_->SetScheduled(false);
- channel_->OnStreamRescheduled(stream_id_, false);
+ gles2::MailboxManager* mailbox_manager = context_group_->mailbox_manager();
+ if (mailbox_manager->UsesSync() && MakeCurrent())
+ mailbox_manager->PullTextureUpdates(sync_token);
return false;
}
-void GpuCommandBufferStub::OnWaitFenceSyncCompleted(
- CommandBufferNamespace namespace_id,
- CommandBufferId command_buffer_id,
- uint64_t release) {
+void GpuCommandBufferStub::OnWaitSyncTokenCompleted(
+ const SyncToken& sync_token) {
DCHECK(waiting_for_sync_point_);
- TRACE_EVENT_ASYNC_END1("gpu", "WaitFenceSync", this, "GpuCommandBufferStub",
- this);
- PullTextureUpdates(namespace_id, command_buffer_id, release);
+ TRACE_EVENT_ASYNC_END1("gpu", "WaitSyncTokenCompleted", this,
+ "GpuCommandBufferStub", this);
waiting_for_sync_point_ = false;
+
+ gles2::MailboxManager* mailbox_manager = context_group_->mailbox_manager();
+ if (mailbox_manager->UsesSync() && MakeCurrent())
+ mailbox_manager->PullTextureUpdates(sync_token);
+
executor_->SetScheduled(true);
channel_->OnStreamRescheduled(stream_id_, true);
}
@@ -1181,13 +1146,8 @@ void GpuCommandBufferStub::OnCreateImage(
return;
image_manager->AddImage(image.get(), id);
- if (image_release_count) {
- DLOG_IF(ERROR,
- image_release_count !=
- sync_point_client_->client_state()->fence_sync_release() + 1)
- << "Client released fences out of order.";
+ if (image_release_count)
sync_point_client_->ReleaseFenceSync(image_release_count);
- }
}
void GpuCommandBufferStub::OnDestroyImage(int32_t id) {
@@ -1211,14 +1171,14 @@ void GpuCommandBufferStub::SendConsoleMessage(int32_t id,
GPUCommandBufferConsoleMessage console_message;
console_message.id = id;
console_message.message = message;
- IPC::Message* msg = new GpuCommandBufferMsg_ConsoleMsg(
- route_id_, console_message);
+ IPC::Message* msg =
+ new GpuCommandBufferMsg_ConsoleMsg(route_id_, console_message);
msg->set_unblock(true);
Send(msg);
}
-void GpuCommandBufferStub::SendCachedShader(
- const std::string& key, const std::string& shader) {
+void GpuCommandBufferStub::SendCachedShader(const std::string& key,
+ const std::string& shader) {
channel_->CacheShader(key, shader);
}
« no previous file with comments | « gpu/ipc/service/gpu_command_buffer_stub.h ('k') | services/ui/gpu/gpu_service.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698