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

Side by Side Diff: content/common/gpu/gpu_command_buffer_stub.cc

Issue 12330129: Make WaitSyncPoint go through command buffers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix test Created 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/common/gpu/gpu_command_buffer_stub.h ('k') | content/common/gpu/gpu_messages.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "base/bind_helpers.h" 6 #include "base/bind_helpers.h"
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/hash.h" 9 #include "base/hash.h"
10 #include "base/shared_memory.h" 10 #include "base/shared_memory.h"
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 154
155 bool GpuCommandBufferStub::OnMessageReceived(const IPC::Message& message) { 155 bool GpuCommandBufferStub::OnMessageReceived(const IPC::Message& message) {
156 FastSetActiveURL(active_url_, active_url_hash_); 156 FastSetActiveURL(active_url_, active_url_hash_);
157 157
158 // Ensure the appropriate GL context is current before handling any IPC 158 // Ensure the appropriate GL context is current before handling any IPC
159 // messages directed at the command buffer. This ensures that the message 159 // messages directed at the command buffer. This ensures that the message
160 // handler can assume that the context is current (not necessary for 160 // handler can assume that the context is current (not necessary for
161 // Echo, RetireSyncPoint, or WaitSyncPoint). 161 // Echo, RetireSyncPoint, or WaitSyncPoint).
162 if (decoder_.get() && 162 if (decoder_.get() &&
163 message.type() != GpuCommandBufferMsg_Echo::ID && 163 message.type() != GpuCommandBufferMsg_Echo::ID &&
164 message.type() != GpuCommandBufferMsg_RetireSyncPoint::ID && 164 message.type() != GpuCommandBufferMsg_RetireSyncPoint::ID) {
165 message.type() != GpuCommandBufferMsg_WaitSyncPoint::ID) {
166 if (!MakeCurrent()) 165 if (!MakeCurrent())
167 return false; 166 return false;
168 } 167 }
169 168
170 // Always use IPC_MESSAGE_HANDLER_DELAY_REPLY for synchronous message handlers 169 // Always use IPC_MESSAGE_HANDLER_DELAY_REPLY for synchronous message handlers
171 // here. This is so the reply can be delayed if the scheduler is unscheduled. 170 // here. This is so the reply can be delayed if the scheduler is unscheduled.
172 bool handled = true; 171 bool handled = true;
173 IPC_BEGIN_MESSAGE_MAP(GpuCommandBufferStub, message) 172 IPC_BEGIN_MESSAGE_MAP(GpuCommandBufferStub, message)
174 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_Initialize, 173 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_Initialize,
175 OnInitialize); 174 OnInitialize);
(...skipping 18 matching lines...) Expand all
194 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_DestroyVideoDecoder, 193 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_DestroyVideoDecoder,
195 OnDestroyVideoDecoder) 194 OnDestroyVideoDecoder)
196 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SetSurfaceVisible, 195 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SetSurfaceVisible,
197 OnSetSurfaceVisible) 196 OnSetSurfaceVisible)
198 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_DiscardBackbuffer, 197 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_DiscardBackbuffer,
199 OnDiscardBackbuffer) 198 OnDiscardBackbuffer)
200 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_EnsureBackbuffer, 199 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_EnsureBackbuffer,
201 OnEnsureBackbuffer) 200 OnEnsureBackbuffer)
202 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_RetireSyncPoint, 201 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_RetireSyncPoint,
203 OnRetireSyncPoint) 202 OnRetireSyncPoint)
204 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_WaitSyncPoint,
205 OnWaitSyncPoint)
206 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SignalSyncPoint, 203 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SignalSyncPoint,
207 OnSignalSyncPoint) 204 OnSignalSyncPoint)
208 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SendClientManagedMemoryStats, 205 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SendClientManagedMemoryStats,
209 OnReceivedClientManagedMemoryStats) 206 OnReceivedClientManagedMemoryStats)
210 IPC_MESSAGE_HANDLER( 207 IPC_MESSAGE_HANDLER(
211 GpuCommandBufferMsg_SetClientHasMemoryAllocationChangedCallback, 208 GpuCommandBufferMsg_SetClientHasMemoryAllocationChangedCallback,
212 OnSetClientHasMemoryAllocationChangedCallback) 209 OnSetClientHasMemoryAllocationChangedCallback)
213 IPC_MESSAGE_UNHANDLED(handled = false) 210 IPC_MESSAGE_UNHANDLED(handled = false)
214 IPC_END_MESSAGE_MAP() 211 IPC_END_MESSAGE_MAP()
215 212
216 // Ensure that any delayed work that was created will be handled. 213 // Ensure that any delayed work that was created will be handled.
217 ScheduleDelayedWork(kHandleMoreWorkPeriodMs); 214 ScheduleDelayedWork(kHandleMoreWorkPeriodMs);
218 215
219 DCHECK(handled); 216 DCHECK(handled);
220 return handled; 217 return handled;
221 } 218 }
222 219
223 bool GpuCommandBufferStub::Send(IPC::Message* message) { 220 bool GpuCommandBufferStub::Send(IPC::Message* message) {
224 return channel_->Send(message); 221 return channel_->Send(message);
225 } 222 }
226 223
227 bool GpuCommandBufferStub::IsScheduled() { 224 bool GpuCommandBufferStub::IsScheduled() {
228 return sync_point_wait_count_ == 0 && 225 return (!scheduler_.get() || scheduler_->IsScheduled());
229 (!scheduler_.get() || scheduler_->IsScheduled());
230 } 226 }
231 227
232 bool GpuCommandBufferStub::HasMoreWork() { 228 bool GpuCommandBufferStub::HasMoreWork() {
233 return scheduler_.get() && scheduler_->HasMoreWork(); 229 return scheduler_.get() && scheduler_->HasMoreWork();
234 } 230 }
235 231
236 void GpuCommandBufferStub::PollWork() { 232 void GpuCommandBufferStub::PollWork() {
237 TRACE_EVENT0("gpu", "GpuCommandBufferStub::PollWork"); 233 TRACE_EVENT0("gpu", "GpuCommandBufferStub::PollWork");
238 delayed_work_scheduled_ = false; 234 delayed_work_scheduled_ = false;
239 FastSetActiveURL(active_url_, active_url_hash_); 235 FastSetActiveURL(active_url_, active_url_hash_);
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 } 467 }
472 468
473 if (CommandLine::ForCurrentProcess()->HasSwitch( 469 if (CommandLine::ForCurrentProcess()->HasSwitch(
474 switches::kEnableGPUServiceLogging)) { 470 switches::kEnableGPUServiceLogging)) {
475 decoder_->set_log_commands(true); 471 decoder_->set_log_commands(true);
476 } 472 }
477 473
478 decoder_->SetMsgCallback( 474 decoder_->SetMsgCallback(
479 base::Bind(&GpuCommandBufferStub::SendConsoleMessage, 475 base::Bind(&GpuCommandBufferStub::SendConsoleMessage,
480 base::Unretained(this))); 476 base::Unretained(this)));
477 decoder_->SetWaitSyncPointCallback(
478 base::Bind(&GpuCommandBufferStub::OnWaitSyncPoint,
479 base::Unretained(this)));
481 480
482 command_buffer_->SetPutOffsetChangeCallback( 481 command_buffer_->SetPutOffsetChangeCallback(
483 base::Bind(&GpuCommandBufferStub::PutChanged, base::Unretained(this))); 482 base::Bind(&GpuCommandBufferStub::PutChanged, base::Unretained(this)));
484 command_buffer_->SetGetBufferChangeCallback( 483 command_buffer_->SetGetBufferChangeCallback(
485 base::Bind(&gpu::GpuScheduler::SetGetBuffer, 484 base::Bind(&gpu::GpuScheduler::SetGetBuffer,
486 base::Unretained(scheduler_.get()))); 485 base::Unretained(scheduler_.get())));
487 command_buffer_->SetParseErrorCallback( 486 command_buffer_->SetParseErrorCallback(
488 base::Bind(&GpuCommandBufferStub::OnParseError, base::Unretained(this))); 487 base::Bind(&GpuCommandBufferStub::OnParseError, base::Unretained(this)));
489 scheduler_->SetScheduledCallback( 488 scheduler_->SetScheduledCallback(
490 base::Bind(&GpuCommandBufferStub::OnReschedule, base::Unretained(this))); 489 base::Bind(&GpuCommandBufferStub::OnReschedule, base::Unretained(this)));
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 sync_points_.push_back(sync_point); 750 sync_points_.push_back(sync_point);
752 } 751 }
753 752
754 void GpuCommandBufferStub::OnRetireSyncPoint(uint32 sync_point) { 753 void GpuCommandBufferStub::OnRetireSyncPoint(uint32 sync_point) {
755 DCHECK(!sync_points_.empty() && sync_points_.front() == sync_point); 754 DCHECK(!sync_points_.empty() && sync_points_.front() == sync_point);
756 sync_points_.pop_front(); 755 sync_points_.pop_front();
757 GpuChannelManager* manager = channel_->gpu_channel_manager(); 756 GpuChannelManager* manager = channel_->gpu_channel_manager();
758 manager->sync_point_manager()->RetireSyncPoint(sync_point); 757 manager->sync_point_manager()->RetireSyncPoint(sync_point);
759 } 758 }
760 759
761 void GpuCommandBufferStub::OnWaitSyncPoint(uint32 sync_point) { 760 bool GpuCommandBufferStub::OnWaitSyncPoint(uint32 sync_point) {
762 if (sync_point_wait_count_ == 0) { 761 if (sync_point_wait_count_ == 0) {
763 TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitSyncPoint", this, 762 TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitSyncPoint", this,
764 "GpuCommandBufferStub", this); 763 "GpuCommandBufferStub", this);
765 } 764 }
765 scheduler_->SetScheduled(false);
766 ++sync_point_wait_count_; 766 ++sync_point_wait_count_;
767 GpuChannelManager* manager = channel_->gpu_channel_manager(); 767 GpuChannelManager* manager = channel_->gpu_channel_manager();
768 manager->sync_point_manager()->AddSyncPointCallback( 768 manager->sync_point_manager()->AddSyncPointCallback(
769 sync_point, 769 sync_point,
770 base::Bind(&GpuCommandBufferStub::OnSyncPointRetired, 770 base::Bind(&GpuCommandBufferStub::OnSyncPointRetired,
771 this->AsWeakPtr())); 771 this->AsWeakPtr()));
772 return scheduler_->IsScheduled();
772 } 773 }
773 774
774 void GpuCommandBufferStub::OnSyncPointRetired() { 775 void GpuCommandBufferStub::OnSyncPointRetired() {
775 --sync_point_wait_count_; 776 --sync_point_wait_count_;
776 if (sync_point_wait_count_ == 0) { 777 if (sync_point_wait_count_ == 0) {
777 TRACE_EVENT_ASYNC_END1("gpu", "WaitSyncPoint", this, 778 TRACE_EVENT_ASYNC_END1("gpu", "WaitSyncPoint", this,
778 "GpuCommandBufferStub", this); 779 "GpuCommandBufferStub", this);
779 } 780 }
780 OnReschedule(); 781 scheduler_->SetScheduled(true);
781 } 782 }
782 783
783 void GpuCommandBufferStub::OnSignalSyncPoint(uint32 sync_point, uint32 id) { 784 void GpuCommandBufferStub::OnSignalSyncPoint(uint32 sync_point, uint32 id) {
784 GpuChannelManager* manager = channel_->gpu_channel_manager(); 785 GpuChannelManager* manager = channel_->gpu_channel_manager();
785 manager->sync_point_manager()->AddSyncPointCallback( 786 manager->sync_point_manager()->AddSyncPointCallback(
786 sync_point, 787 sync_point,
787 base::Bind(&GpuCommandBufferStub::OnSignalSyncPointAck, 788 base::Bind(&GpuCommandBufferStub::OnSignalSyncPointAck,
788 this->AsWeakPtr(), 789 this->AsWeakPtr(),
789 id)); 790 id));
790 } 791 }
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
878 if (surface_ && MakeCurrent()) 879 if (surface_ && MakeCurrent())
879 surface_->SetFrontbufferAllocation( 880 surface_->SetFrontbufferAllocation(
880 allocation.browser_allocation.suggest_have_frontbuffer); 881 allocation.browser_allocation.suggest_have_frontbuffer);
881 } 882 }
882 883
883 last_memory_allocation_valid_ = true; 884 last_memory_allocation_valid_ = true;
884 last_memory_allocation_ = allocation; 885 last_memory_allocation_ = allocation;
885 } 886 }
886 887
887 } // namespace content 888 } // namespace content
OLDNEW
« no previous file with comments | « content/common/gpu/gpu_command_buffer_stub.h ('k') | content/common/gpu/gpu_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698