| 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);
|
| }
|
|
|
|
|