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

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

Issue 782583003: List sync points to wait on in AsyncFlush message Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years 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
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 #if defined(OS_WIN) 5 #if defined(OS_WIN)
6 #include <windows.h> 6 #include <windows.h>
7 #endif 7 #endif
8 8
9 #include "content/common/gpu/gpu_channel.h" 9 #include "content/common/gpu/gpu_channel.h"
10 10
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 void OnFilterAdded(IPC::Sender* sender) override { 91 void OnFilterAdded(IPC::Sender* sender) override {
92 DCHECK(!sender_); 92 DCHECK(!sender_);
93 sender_ = sender; 93 sender_ = sender;
94 } 94 }
95 95
96 void OnFilterRemoved() override { 96 void OnFilterRemoved() override {
97 DCHECK(sender_); 97 DCHECK(sender_);
98 sender_ = NULL; 98 sender_ = NULL;
99 } 99 }
100 100
101 struct MessageStatus {
102 int routing_id;
103 bool forwarded;
104 bool handled;
105 };
106
107 void OnRetireSyncPoint(uint32 sync_point) {
108 if (future_sync_points_) {
109 current_status_.handled = false;
110 } else {
111 DLOG(ERROR) << "Untrusted client should not send "
112 "GpuCommandBufferMsg_RetireSyncPoint message";
113 current_status_.forwarded = false;
114 }
115 }
116
117 void OnAsyncFlush(int32 put_offset,
118 uint32 flush_count,
119 const std::vector<uint32>& sync_points,
120 const std::vector<ui::LatencyInfo>& latency_info) {
121 std::vector<uint32> sanitized_sync_points;
122 for (uint32 sync_point : sync_points) {
123 if (sync_point_manager_->WasSyncPointGenerated(sync_point))
124 sanitized_sync_points.push_back(sync_point);
125 }
126 message_loop_->PostTask(
127 FROM_HERE,
128 base::Bind(base::IgnoreResult(&GpuChannel::OnMessageReceived),
129 gpu_channel_,
130 GpuCommandBufferMsg_AsyncFlush(
131 current_status_.routing_id, put_offset, flush_count,
132 sanitized_sync_points, latency_info)));
133 }
134
135 void OnInsertSyncPoint(bool retire, uint32* sync_point) {
136 if (!future_sync_points_ && !retire) {
137 *sync_point = 0;
138 LOG(ERROR) << "Untrusted contexts can't create future sync points";
139 current_status_.forwarded = false;
140 return;
141 }
142 *sync_point = sync_point_manager_->GenerateSyncPoint();
143 message_loop_->PostTask(
144 FROM_HERE,
145 base::Bind(&GpuChannelMessageFilter::InsertSyncPointOnMainThread,
146 gpu_channel_, sync_point_manager_,
147 current_status_.routing_id, retire, *sync_point));
148 }
149
101 bool OnMessageReceived(const IPC::Message& message) override { 150 bool OnMessageReceived(const IPC::Message& message) override {
102 DCHECK(sender_); 151 DCHECK(sender_);
103 152
104 bool handled = false; 153 current_status_.routing_id = message.routing_id();
105 if ((message.type() == GpuCommandBufferMsg_RetireSyncPoint::ID) && 154 current_status_.forwarded = true;
106 !future_sync_points_) { 155 current_status_.handled = true;
107 DLOG(ERROR) << "Untrusted client should not send " 156 IPC_BEGIN_MESSAGE_MAP(GpuChannelMessageFilter, message)
108 "GpuCommandBufferMsg_RetireSyncPoint message"; 157 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_RetireSyncPoint,
109 return true; 158 OnRetireSyncPoint)
159 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_AsyncFlush, OnAsyncFlush)
160 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_InsertSyncPoint,
161 OnInsertSyncPoint)
162 IPC_MESSAGE_UNHANDLED(current_status_.handled = false)
163 IPC_END_MESSAGE_MAP()
164
165 if (current_status_.forwarded) {
166 // All other messages get processed by the GpuChannel.
167 messages_forwarded_to_channel_++;
168 if (preempting_flag_.get())
169 pending_messages_.push(PendingMessage(messages_forwarded_to_channel_));
170 UpdatePreemptionState();
110 } 171 }
111 172
112 if (message.type() == GpuCommandBufferMsg_InsertSyncPoint::ID) { 173 return current_status_.handled;
113 Tuple1<bool> retire;
114 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message);
115 if (!GpuCommandBufferMsg_InsertSyncPoint::ReadSendParam(&message,
116 &retire)) {
117 reply->set_reply_error();
118 Send(reply);
119 return true;
120 }
121 if (!future_sync_points_ && !retire.a) {
122 LOG(ERROR) << "Untrusted contexts can't create future sync points";
123 reply->set_reply_error();
124 Send(reply);
125 return true;
126 }
127 uint32 sync_point = sync_point_manager_->GenerateSyncPoint();
128 GpuCommandBufferMsg_InsertSyncPoint::WriteReplyParams(reply, sync_point);
129 Send(reply);
130 message_loop_->PostTask(
131 FROM_HERE,
132 base::Bind(&GpuChannelMessageFilter::InsertSyncPointOnMainThread,
133 gpu_channel_,
134 sync_point_manager_,
135 message.routing_id(),
136 retire.a,
137 sync_point));
138 handled = true;
139 }
140
141 // All other messages get processed by the GpuChannel.
142 messages_forwarded_to_channel_++;
143 if (preempting_flag_.get())
144 pending_messages_.push(PendingMessage(messages_forwarded_to_channel_));
145 UpdatePreemptionState();
146
147 return handled;
148 } 174 }
149 175
150 void MessageProcessed(uint64 messages_processed) { 176 void MessageProcessed(uint64 messages_processed) {
151 while (!pending_messages_.empty() && 177 while (!pending_messages_.empty() &&
152 pending_messages_.front().message_number <= messages_processed) 178 pending_messages_.front().message_number <= messages_processed)
153 pending_messages_.pop(); 179 pending_messages_.pop();
154 UpdatePreemptionState(); 180 UpdatePreemptionState();
155 } 181 }
156 182
157 void SetPreemptingFlagAndSchedulingState( 183 void SetPreemptingFlagAndSchedulingState(
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 gpu_channel->MessageProcessed(); 401 gpu_channel->MessageProcessed();
376 } 402 }
377 } 403 }
378 manager->RetireSyncPoint(sync_point); 404 manager->RetireSyncPoint(sync_point);
379 } 405 }
380 406
381 // NOTE: this weak pointer is never dereferenced on the IO thread, it's only 407 // NOTE: this weak pointer is never dereferenced on the IO thread, it's only
382 // passed through - therefore the WeakPtr assumptions are respected. 408 // passed through - therefore the WeakPtr assumptions are respected.
383 base::WeakPtr<GpuChannel> gpu_channel_; 409 base::WeakPtr<GpuChannel> gpu_channel_;
384 IPC::Sender* sender_; 410 IPC::Sender* sender_;
411 MessageStatus current_status_;
385 scoped_refptr<gpu::SyncPointManager> sync_point_manager_; 412 scoped_refptr<gpu::SyncPointManager> sync_point_manager_;
386 scoped_refptr<base::MessageLoopProxy> message_loop_; 413 scoped_refptr<base::MessageLoopProxy> message_loop_;
387 scoped_refptr<gpu::PreemptionFlag> preempting_flag_; 414 scoped_refptr<gpu::PreemptionFlag> preempting_flag_;
388 415
389 std::queue<PendingMessage> pending_messages_; 416 std::queue<PendingMessage> pending_messages_;
390 417
391 // Count of the number of IPCs forwarded to the GpuChannel. 418 // Count of the number of IPCs forwarded to the GpuChannel.
392 uint64 messages_forwarded_to_channel_; 419 uint64 messages_forwarded_to_channel_;
393 420
394 base::OneShotTimer<GpuChannelMessageFilter> timer_; 421 base::OneShotTimer<GpuChannelMessageFilter> timer_;
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 } 882 }
856 } 883 }
857 } 884 }
858 885
859 void GpuChannel::HandleUpdateValueState( 886 void GpuChannel::HandleUpdateValueState(
860 unsigned int target, const gpu::ValueState& state) { 887 unsigned int target, const gpu::ValueState& state) {
861 pending_valuebuffer_state_->UpdateState(target, state); 888 pending_valuebuffer_state_->UpdateState(target, state);
862 } 889 }
863 890
864 } // namespace content 891 } // namespace content
OLDNEW
« no previous file with comments | « content/common/gpu/client/command_buffer_proxy_impl.cc ('k') | content/common/gpu/gpu_command_buffer_stub.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698