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) { |