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

Unified Diff: components/mus/gles2/command_buffer_local.cc

Issue 1460833002: gpu: Implement the new fence syncs in mojo command buffer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update Created 5 years, 1 month 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 | « components/mus/gles2/command_buffer_local.h ('k') | components/mus/public/interfaces/command_buffer.mojom » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/mus/gles2/command_buffer_local.cc
diff --git a/components/mus/gles2/command_buffer_local.cc b/components/mus/gles2/command_buffer_local.cc
index abdaa4896422006e7f585bfab4ec65193daa4f38..d84c53ace1a7761a8e9b0a9742419a0b4618de73 100644
--- a/components/mus/gles2/command_buffer_local.cc
+++ b/components/mus/gles2/command_buffer_local.cc
@@ -4,11 +4,13 @@
#include "components/mus/gles2/command_buffer_local.h"
+#include "base/atomic_sequence_num.h"
#include "base/bind.h"
#include "base/memory/shared_memory.h"
#include "components/mus/gles2/command_buffer_local_client.h"
#include "components/mus/gles2/gpu_memory_tracker.h"
#include "components/mus/gles2/mojo_gpu_memory_buffer.h"
+#include "gpu/command_buffer/common/sync_token.h"
#include "gpu/command_buffer/service/command_buffer_service.h"
#include "gpu/command_buffer/service/context_group.h"
#include "gpu/command_buffer/service/gpu_scheduler.h"
@@ -26,12 +28,19 @@
namespace mus {
+namespace {
+
+base::StaticAtomicSequenceNumber g_next_command_buffer_id;
+
+}
+
const unsigned int GL_READ_WRITE_CHROMIUM = 0x78F2;
CommandBufferLocal::CommandBufferLocal(CommandBufferLocalClient* client,
gfx::AcceleratedWidget widget,
const scoped_refptr<GpuState>& gpu_state)
- : widget_(widget),
+ : command_buffer_id_(g_next_command_buffer_id.GetNext()),
+ widget_(widget),
gpu_state_(gpu_state),
client_(client),
next_fence_sync_release_(1),
@@ -90,6 +99,9 @@ bool CommandBufferLocal::Initialize() {
decoder_.reset(::gpu::gles2::GLES2Decoder::Create(context_group.get()));
scheduler_.reset(new gpu::GpuScheduler(command_buffer_.get(), decoder_.get(),
decoder_.get()));
+ sync_point_order_data_ = gpu::SyncPointOrderData::Create();
+ sync_point_client_ = gpu_state_->sync_point_manager()->CreateSyncPointClient(
+ sync_point_order_data_, GetNamespaceID(), GetCommandBufferID());
decoder_->set_engine(scheduler_.get());
decoder_->SetWaitSyncPointCallback(
base::Bind(&CommandBufferLocal::OnWaitSyncPoint, base::Unretained(this)));
@@ -214,13 +226,11 @@ bool CommandBufferLocal::IsGpuChannelLost() {
}
gpu::CommandBufferNamespace CommandBufferLocal::GetNamespaceID() const {
- NOTIMPLEMENTED();
- return gpu::CommandBufferNamespace::INVALID;
+ return gpu::CommandBufferNamespace::MOJO_LOCAL;
}
uint64_t CommandBufferLocal::GetCommandBufferID() const {
- NOTIMPLEMENTED();
- return 0;
+ return command_buffer_id_;
}
uint64_t CommandBufferLocal::GenerateFenceSyncRelease() {
@@ -247,8 +257,9 @@ bool CommandBufferLocal::IsFenceSyncFlushReceived(uint64_t release) {
bool CommandBufferLocal::CanWaitUnverifiedSyncToken(
const gpu::SyncToken* sync_token) {
- // All sync tokens must be flushed before being waited on.
- return false;
+ // Right now, MOJO_LOCAL is only used by trusted code, so it is safe to wait
+ // on a sync token in MOJO_LOCAL command buffer.
+ return sync_token->namespace_id() == gpu::CommandBufferNamespace::MOJO_LOCAL;
}
void CommandBufferLocal::PumpCommands() {
@@ -257,7 +268,12 @@ void CommandBufferLocal::PumpCommands() {
command_buffer_->SetParseError(::gpu::error::kLostContext);
return;
}
+ gpu::SyncPointManager* sync_point_manager = gpu_state_->sync_point_manager();
+ const uint32_t order_num = sync_point_order_data_
+ ->GenerateUnprocessedOrderNumber(sync_point_manager);
+ sync_point_order_data_->BeginProcessingOrderNumber(order_num);
scheduler_->PutChanged();
+ sync_point_order_data_->FinishProcessingOrderNumber(order_num);
}
void CommandBufferLocal::OnUpdateVSyncParameters(
@@ -272,29 +288,24 @@ bool CommandBufferLocal::OnWaitSyncPoint(uint32_t sync_point) {
if (!sync_point)
return true;
- bool context_changed = false;
- while (!gpu_state_->sync_point_manager()->IsSyncPointRetired(sync_point)) {
+ if (gpu_state_->sync_point_manager()->IsSyncPointRetired(sync_point))
+ return true;
+
+ do {
gpu_state_->command_buffer_task_runner()->RunOneTask();
- context_changed = true;
- }
+ } while (!gpu_state_->sync_point_manager()->IsSyncPointRetired(sync_point));
// RunOneTask() changes the current GL context, so we have to recover it.
- if (context_changed) {
- if (!decoder_->MakeCurrent()) {
- command_buffer_->SetContextLostReason(decoder_->GetContextLostReason());
- command_buffer_->SetParseError(::gpu::error::kLostContext);
- }
+ if (!decoder_->MakeCurrent()) {
+ command_buffer_->SetContextLostReason(decoder_->GetContextLostReason());
+ command_buffer_->SetParseError(::gpu::error::kLostContext);
}
return true;
}
void CommandBufferLocal::OnFenceSyncRelease(uint64_t release) {
- // TODO(dyen): Implement once CommandBufferID has been figured out and
- // we have a SyncPointClient. It would probably look like what is commented
- // out below:
- // if (!sync_point_client_->client_state()->IsFenceSyncReleased(release))
- // sync_point_client_->ReleaseFenceSync(release);
- NOTIMPLEMENTED();
+ if (!sync_point_client_->client_state()->IsFenceSyncReleased(release))
+ sync_point_client_->ReleaseFenceSync(release);
}
bool CommandBufferLocal::OnWaitFenceSync(
@@ -314,17 +325,16 @@ bool CommandBufferLocal::OnWaitFenceSync(
if (release_state->IsFenceSyncReleased(release))
return true;
- // TODO(dyen): Implement once CommandBufferID has been figured out and
- // we have a SyncPointClient. It would probably look like what is commented
- // out below:
- // scheduler_->SetScheduled(false);
- // sync_point_client_->Wait(
- // release_state.get(),
- // release,
- // base::Bind(&CommandBufferLocal::OnSyncPointRetired,
- // weak_factory_.GetWeakPtr()));
- NOTIMPLEMENTED();
- return scheduler_->scheduled();
+ do {
+ gpu_state_->command_buffer_task_runner()->RunOneTask();
+ } while (!release_state->IsFenceSyncReleased(release));
+
+ // RunOneTask() changes the current GL context, so we have to recover it.
+ if (!decoder_->MakeCurrent()) {
+ command_buffer_->SetContextLostReason(decoder_->GetContextLostReason());
+ command_buffer_->SetParseError(::gpu::error::kLostContext);
+ }
+ return true;
}
void CommandBufferLocal::OnParseError() {
« no previous file with comments | « components/mus/gles2/command_buffer_local.h ('k') | components/mus/public/interfaces/command_buffer.mojom » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698