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

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

Issue 2752393002: gpu: Add SequenceId for identifying sync point sequences. (Closed)
Patch Set: piman's review 3 Created 3 years, 9 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') | gpu/ipc/service/stream_texture_android.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 6d305cf9ab99b670e9d8c743e9ad21c6cbd1161d..9dc66b7908d55eada1cdc8f273f6a05280a75535 100644
--- a/gpu/ipc/service/gpu_command_buffer_stub.cc
+++ b/gpu/ipc/service/gpu_command_buffer_stub.cc
@@ -117,10 +117,8 @@ class GpuCommandBufferMemoryTracker : public gles2::MemoryTracker {
&GpuCommandBufferMemoryTracker::LogMemoryStatsPeriodic);
}
- void TrackMemoryAllocatedChange(
- size_t old_size, size_t new_size) override {
- tracking_group_->TrackMemoryAllocatedChange(
- old_size, new_size);
+ void TrackMemoryAllocatedChange(size_t old_size, size_t new_size) override {
+ tracking_group_->TrackMemoryAllocatedChange(old_size, new_size);
}
bool EnsureGPUMemoryAvailable(size_t size_needed) override {
@@ -213,21 +211,20 @@ DevToolsChannelData::CreateForChannel(GpuChannel* channel) {
return base::WrapUnique(new DevToolsChannelData(res.release()));
}
-CommandBufferId GetCommandBufferID(int channel_id, int32_t route_id) {
- return CommandBufferId::FromUnsafeValue(
- (static_cast<uint64_t>(channel_id) << 32) | route_id);
-}
-
} // namespace
std::unique_ptr<GpuCommandBufferStub> GpuCommandBufferStub::Create(
GpuChannel* channel,
GpuCommandBufferStub* share_command_buffer_stub,
const GPUCreateCommandBufferConfig& init_params,
+ CommandBufferId command_buffer_id,
+ SequenceId sequence_id,
+ int32_t stream_id,
int32_t route_id,
std::unique_ptr<base::SharedMemory> shared_state_shm) {
std::unique_ptr<GpuCommandBufferStub> stub(
- new GpuCommandBufferStub(channel, init_params, route_id));
+ new GpuCommandBufferStub(channel, init_params, command_buffer_id,
+ sequence_id, stream_id, route_id));
if (!stub->Initialize(share_command_buffer_stub, init_params,
std::move(shared_state_shm)))
return nullptr;
@@ -237,13 +234,17 @@ std::unique_ptr<GpuCommandBufferStub> GpuCommandBufferStub::Create(
GpuCommandBufferStub::GpuCommandBufferStub(
GpuChannel* channel,
const GPUCreateCommandBufferConfig& init_params,
+ CommandBufferId command_buffer_id,
+ SequenceId sequence_id,
+ int32_t stream_id,
int32_t route_id)
: channel_(channel),
initialized_(false),
surface_handle_(init_params.surface_handle),
use_virtualized_gl_context_(false),
- command_buffer_id_(GetCommandBufferID(channel->client_id(), route_id)),
- stream_id_(init_params.stream_id),
+ command_buffer_id_(command_buffer_id),
+ sequence_id_(sequence_id),
+ stream_id_(stream_id),
route_id_(route_id),
last_flush_count_(0),
waiting_for_sync_point_(false),
@@ -256,14 +257,12 @@ GpuCommandBufferStub::~GpuCommandBufferStub() {
}
GpuMemoryManager* GpuCommandBufferStub::GetMemoryManager() const {
- return channel()->gpu_channel_manager()->gpu_memory_manager();
+ return channel()->gpu_channel_manager()->gpu_memory_manager();
}
bool GpuCommandBufferStub::OnMessageReceived(const IPC::Message& message) {
- TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"),
- "GPUTask",
- "data",
- DevToolsChannelData::CreateForChannel(channel()));
+ TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "GPUTask",
+ "data", DevToolsChannelData::CreateForChannel(channel()));
FastSetActiveURL(active_url_, active_url_hash_, channel_);
bool have_context = false;
@@ -303,12 +302,9 @@ bool GpuCommandBufferStub::OnMessageReceived(const IPC::Message& message) {
OnRegisterTransferBuffer);
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_DestroyTransferBuffer,
OnDestroyTransferBuffer);
- IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_WaitSyncToken,
- OnWaitSyncToken)
- IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SignalSyncToken,
- OnSignalSyncToken)
- IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SignalQuery,
- OnSignalQuery)
+ IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_WaitSyncToken, OnWaitSyncToken)
+ IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SignalSyncToken, OnSignalSyncToken)
+ IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SignalQuery, OnSignalQuery)
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_CreateImage, OnCreateImage);
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_DestroyImage, OnDestroyImage);
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_CreateStreamTexture,
@@ -414,7 +410,7 @@ void GpuCommandBufferStub::PerformWork() {
if (executor_) {
uint32_t current_unprocessed_num =
- channel()->gpu_channel_manager()->GetUnprocessedOrderNum();
+ channel()->sync_point_manager()->GetUnprocessedOrderNum();
// We're idle when no messages were processed or scheduled.
bool is_idle = (previous_processed_num_ == current_unprocessed_num);
if (!is_idle && !last_idle_time_.is_null()) {
@@ -445,7 +441,7 @@ bool GpuCommandBufferStub::HasUnprocessedCommands() {
if (command_buffer_) {
CommandBuffer::State state = command_buffer_->GetLastState();
return command_buffer_->GetPutOffset() != state.get_offset &&
- !error::IsError(state.error);
+ !error::IsError(state.error);
}
return false;
}
@@ -470,7 +466,7 @@ void GpuCommandBufferStub::ScheduleDelayedWork(base::TimeDelta delay) {
// Idle when no messages are processed between now and when
// PollWork is called.
previous_processed_num_ =
- channel()->gpu_channel_manager()->GetProcessedOrderNum();
+ channel()->sync_point_manager()->GetProcessedOrderNum();
if (last_idle_time_.is_null())
last_idle_time_ = current_time;
@@ -517,8 +513,9 @@ void GpuCommandBufferStub::Destroy() {
// (exit_on_context_lost workaround), then don't tell the browser about
// offscreen context destruction here since it's not client-invoked, and
// might bypass the 3D API blocking logic.
- if ((surface_handle_ == gpu::kNullSurfaceHandle) && !active_url_.is_empty()
- && !gpu_channel_manager->is_exiting_for_lost_context()) {
+ if ((surface_handle_ == gpu::kNullSurfaceHandle) &&
+ !active_url_.is_empty() &&
+ !gpu_channel_manager->is_exiting_for_lost_context()) {
gpu_channel_manager->delegate()->DidDestroyOffscreenContext(active_url_);
}
}
@@ -530,7 +527,10 @@ void GpuCommandBufferStub::Destroy() {
// destroy it before those.
executor_.reset();
- sync_point_client_.reset();
+ if (sync_point_client_state_) {
+ sync_point_client_state_->Destroy();
+ sync_point_client_state_ = nullptr;
+ }
bool have_context = false;
if (decoder_ && decoder_->GetGLContext()) {
@@ -639,16 +639,16 @@ bool GpuCommandBufferStub::Initialize(
use_virtualized_gl_context_ = false;
#endif
- command_buffer_.reset(new CommandBufferService(
- context_group_->transfer_buffer_manager()));
+ command_buffer_.reset(
+ new CommandBufferService(context_group_->transfer_buffer_manager()));
decoder_.reset(gles2::GLES2Decoder::Create(context_group_.get()));
executor_.reset(new CommandExecutor(command_buffer_.get(), decoder_.get(),
decoder_.get()));
- sync_point_client_ = base::MakeUnique<SyncPointClient>(
- channel_->sync_point_manager(),
- channel_->GetSyncPointOrderData(stream_id_),
- CommandBufferNamespace::GPU_IO, command_buffer_id_);
+
+ sync_point_client_state_ =
+ channel_->sync_point_manager()->CreateSyncPointClientState(
+ CommandBufferNamespace::GPU_IO, command_buffer_id_, sequence_id_);
executor_->SetPreemptByFlag(channel_->preempted_flag());
@@ -758,8 +758,7 @@ bool GpuCommandBufferStub::Initialize(
}
if (!context->GetGLStateRestorer()) {
- context->SetGLStateRestorer(
- new GLStateRestorerImpl(decoder_->AsWeakPtr()));
+ context->SetGLStateRestorer(new GLStateRestorerImpl(decoder_->AsWeakPtr()));
}
if (!context_group_->has_program_cache() &&
@@ -779,12 +778,10 @@ bool GpuCommandBufferStub::Initialize(
decoder_->set_log_commands(true);
}
- decoder_->GetLogger()->SetMsgCallback(
- base::Bind(&GpuCommandBufferStub::SendConsoleMessage,
- base::Unretained(this)));
- decoder_->SetShaderCacheCallback(
- base::Bind(&GpuCommandBufferStub::SendCachedShader,
- base::Unretained(this)));
+ decoder_->GetLogger()->SetMsgCallback(base::Bind(
+ &GpuCommandBufferStub::SendConsoleMessage, base::Unretained(this)));
+ decoder_->SetShaderCacheCallback(base::Bind(
+ &GpuCommandBufferStub::SendCachedShader, base::Unretained(this)));
decoder_->SetFenceSyncReleaseCallback(base::Bind(
&GpuCommandBufferStub::OnFenceSyncRelease, base::Unretained(this)));
decoder_->SetWaitSyncTokenCallback(base::Bind(
@@ -909,8 +906,8 @@ void GpuCommandBufferStub::CheckCompleteWaits() {
if (wait_for_token_ || wait_for_get_offset_) {
CommandBuffer::State state = command_buffer_->GetLastState();
if (wait_for_token_ &&
- (CommandBuffer::InRange(
- wait_for_token_->start, wait_for_token_->end, state.token) ||
+ (CommandBuffer::InRange(wait_for_token_->start, wait_for_token_->end,
+ state.token) ||
state.error != error::kNoError)) {
ReportState();
GpuCommandBufferMsg_WaitForTokenInRange::WriteReplyParams(
@@ -920,8 +917,7 @@ void GpuCommandBufferStub::CheckCompleteWaits() {
}
if (wait_for_get_offset_ &&
(CommandBuffer::InRange(wait_for_get_offset_->start,
- wait_for_get_offset_->end,
- state.get_offset) ||
+ wait_for_get_offset_->end, state.get_offset) ||
state.error != error::kNoError)) {
ReportState();
GpuCommandBufferMsg_WaitForGetOffsetInRange::WriteReplyParams(
@@ -1000,7 +996,9 @@ void GpuCommandBufferStub::OnCommandProcessed() {
channel_->watchdog()->CheckArmed();
}
-void GpuCommandBufferStub::ReportState() { command_buffer_->UpdateState(); }
+void GpuCommandBufferStub::ReportState() {
+ command_buffer_->UpdateState();
+}
void GpuCommandBufferStub::PutChanged() {
FastSetActiveURL(active_url_, active_url_hash_, channel_);
@@ -1009,7 +1007,7 @@ void GpuCommandBufferStub::PutChanged() {
void GpuCommandBufferStub::OnSignalSyncToken(const SyncToken& sync_token,
uint32_t id) {
- if (!sync_point_client_->WaitNonThreadSafe(
+ if (!sync_point_client_state_->WaitNonThreadSafe(
sync_token, channel_->task_runner(),
base::Bind(&GpuCommandBufferStub::OnSignalAck, this->AsWeakPtr(),
id))) {
@@ -1025,13 +1023,10 @@ void GpuCommandBufferStub::OnSignalQuery(uint32_t query_id, uint32_t id) {
if (decoder_) {
gles2::QueryManager* query_manager = decoder_->GetQueryManager();
if (query_manager) {
- gles2::QueryManager::Query* query =
- query_manager->GetQuery(query_id);
+ gles2::QueryManager::Query* query = query_manager->GetQuery(query_id);
if (query) {
- query->AddCallback(
- base::Bind(&GpuCommandBufferStub::OnSignalAck,
- this->AsWeakPtr(),
- id));
+ query->AddCallback(base::Bind(&GpuCommandBufferStub::OnSignalAck,
+ this->AsWeakPtr(), id));
return;
}
}
@@ -1048,7 +1043,7 @@ void GpuCommandBufferStub::OnFenceSyncRelease(uint64_t release) {
mailbox_manager->PushTextureUpdates(sync_token);
command_buffer_->SetReleaseCount(release);
- sync_point_client_->ReleaseFenceSync(release);
+ sync_point_client_state_->ReleaseFenceSync(release);
}
void GpuCommandBufferStub::OnDescheduleUntilFinished() {
@@ -1056,14 +1051,14 @@ void GpuCommandBufferStub::OnDescheduleUntilFinished() {
DCHECK(executor_->HasPollingWork());
executor_->SetScheduled(false);
- channel_->OnStreamRescheduled(stream_id_, false);
+ channel_->OnCommandBufferDescheduled(this);
}
void GpuCommandBufferStub::OnRescheduleAfterFinished() {
DCHECK(!executor_->scheduled());
executor_->SetScheduled(true);
- channel_->OnStreamRescheduled(stream_id_, true);
+ channel_->OnCommandBufferScheduled(this);
}
bool GpuCommandBufferStub::OnWaitSyncToken(const SyncToken& sync_token) {
@@ -1072,14 +1067,14 @@ bool GpuCommandBufferStub::OnWaitSyncToken(const SyncToken& sync_token) {
TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitSyncToken", this, "GpuCommandBufferStub",
this);
- waiting_for_sync_point_ = sync_point_client_->WaitNonThreadSafe(
+ waiting_for_sync_point_ = sync_point_client_state_->WaitNonThreadSafe(
sync_token, channel_->task_runner(),
base::Bind(&GpuCommandBufferStub::OnWaitSyncTokenCompleted, AsWeakPtr(),
sync_token));
if (waiting_for_sync_point_) {
executor_->SetScheduled(false);
- channel_->OnStreamRescheduled(stream_id_, false);
+ channel_->OnCommandBufferDescheduled(this);
return true;
}
@@ -1099,7 +1094,7 @@ void GpuCommandBufferStub::OnWaitSyncTokenCompleted(
// again and call PullTextureUpdates once this command buffer gets scheduled.
waiting_for_sync_point_ = false;
executor_->SetScheduled(true);
- channel_->OnStreamRescheduled(stream_id_, true);
+ channel_->OnCommandBufferScheduled(this);
}
void GpuCommandBufferStub::OnCreateImage(
@@ -1146,7 +1141,7 @@ void GpuCommandBufferStub::OnCreateImage(
image_manager->AddImage(image.get(), id);
if (image_release_count)
- sync_point_client_->ReleaseFenceSync(image_release_count);
+ sync_point_client_state_->ReleaseFenceSync(image_release_count);
}
void GpuCommandBufferStub::OnDestroyImage(int32_t id) {
« no previous file with comments | « gpu/ipc/service/gpu_command_buffer_stub.h ('k') | gpu/ipc/service/stream_texture_android.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698