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

Side by Side Diff: gpu/command_buffer/service/query_manager.cc

Issue 16831004: Perform glReadPixels with PBOs in the gpu, if PBOs are available. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: revert gl_in_process_context.cc, deal with out-of-order callbacks in gl_helper.cc Created 7 years, 5 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
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 "gpu/command_buffer/service/query_manager.h" 5 #include "gpu/command_buffer/service/query_manager.h"
6 6
7 #include "base/atomicops.h" 7 #include "base/atomicops.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/shared_memory.h" 10 #include "base/shared_memory.h"
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 , public base::SupportsWeakPtr<AsyncPixelTransfersCompletedQuery> { 172 , public base::SupportsWeakPtr<AsyncPixelTransfersCompletedQuery> {
173 public: 173 public:
174 AsyncPixelTransfersCompletedQuery( 174 AsyncPixelTransfersCompletedQuery(
175 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); 175 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset);
176 176
177 virtual bool Begin() OVERRIDE; 177 virtual bool Begin() OVERRIDE;
178 virtual bool End(uint32 submit_count) OVERRIDE; 178 virtual bool End(uint32 submit_count) OVERRIDE;
179 virtual bool Process() OVERRIDE; 179 virtual bool Process() OVERRIDE;
180 virtual void Destroy(bool have_context) OVERRIDE; 180 virtual void Destroy(bool have_context) OVERRIDE;
181 181
182 protected:
183 virtual ~AsyncPixelTransfersCompletedQuery();
184
185 static void MarkAsCompletedThreadSafe( 182 static void MarkAsCompletedThreadSafe(
186 uint32 submit_count, const AsyncMemoryParams& mem_params) { 183 uint32 submit_count, const AsyncMemoryParams& mem_params) {
187 DCHECK(mem_params.shared_memory); 184 DCHECK(mem_params.shared_memory);
188 DCHECK(mem_params.shared_memory->memory()); 185 DCHECK(mem_params.shared_memory->memory());
189 void *data = static_cast<int8*>(mem_params.shared_memory->memory()) + 186 void *data = static_cast<int8*>(mem_params.shared_memory->memory()) +
190 mem_params.shm_data_offset; 187 mem_params.shm_data_offset;
191 QuerySync* sync = static_cast<QuerySync*>(data); 188 QuerySync* sync = static_cast<QuerySync*>(data);
192 189
193 // Need a MemoryBarrier here to ensure that upload completed before 190 // Need a MemoryBarrier here to ensure that upload completed before
194 // submit_count was written to sync->process_count. 191 // submit_count was written to sync->process_count.
195 base::subtle::MemoryBarrier(); 192 base::subtle::MemoryBarrier();
196 sync->process_count = submit_count; 193 sync->process_count = submit_count;
197 } 194 }
195
196 protected:
197 virtual ~AsyncPixelTransfersCompletedQuery();
piman 2013/07/01 22:24:08 nit: it looks like you didn't end up needing chang
hubbe 2013/07/01 22:34:41 Done.
198
198 }; 199 };
199 200
200 AsyncPixelTransfersCompletedQuery::AsyncPixelTransfersCompletedQuery( 201 AsyncPixelTransfersCompletedQuery::AsyncPixelTransfersCompletedQuery(
201 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) 202 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset)
202 : Query(manager, target, shm_id, shm_offset) { 203 : Query(manager, target, shm_id, shm_offset) {
203 } 204 }
204 205
205 bool AsyncPixelTransfersCompletedQuery::Begin() { 206 bool AsyncPixelTransfersCompletedQuery::Begin() {
206 return true; 207 return true;
207 } 208 }
208 209
209 bool AsyncPixelTransfersCompletedQuery::End(uint32 submit_count) { 210 bool AsyncPixelTransfersCompletedQuery::End(uint32 submit_count) {
210 AsyncMemoryParams mem_params; 211 AsyncMemoryParams mem_params;
211 // Get the real shared memory since it might need to be duped to prevent 212 // Get the real shared memory since it might need to be duped to prevent
212 // use-after-free of the memory. 213 // use-after-free of the memory.
213 Buffer buffer = manager()->decoder()->GetSharedMemoryBuffer(shm_id()); 214 Buffer buffer = manager()->decoder()->GetSharedMemoryBuffer(shm_id());
214 if (!buffer.shared_memory) 215 if (!buffer.shared_memory)
215 return false; 216 return false;
216 mem_params.shared_memory = buffer.shared_memory; 217 mem_params.shared_memory = buffer.shared_memory;
217 mem_params.shm_size = buffer.size; 218 mem_params.shm_size = buffer.size;
218 mem_params.shm_data_offset = shm_offset(); 219 mem_params.shm_data_offset = shm_offset();
219 mem_params.shm_data_size = sizeof(QuerySync); 220 mem_params.shm_data_size = sizeof(QuerySync);
220 221
221 // Ask AsyncPixelTransferDelegate to run completion callback after all 222 // Ask AsyncPixelTransferDelegate to run completion callback after all
222 // previous async transfers are done. No guarantee that callback is run 223 // previous async transfers are done. No guarantee that callback is run
223 // on the current thread. 224 // on the current thread.
224 manager()->decoder()->GetAsyncPixelTransferManager()->AsyncNotifyCompletion( 225 manager()->decoder()->GetAsyncPixelTransferManager()->AsyncNotifyCompletion(
225 mem_params, 226 mem_params,
226 base::Bind(AsyncPixelTransfersCompletedQuery::MarkAsCompletedThreadSafe, 227 base::Bind(&AsyncPixelTransfersCompletedQuery::MarkAsCompletedThreadSafe,
227 submit_count)); 228 submit_count));
228
229 return AddToPendingTransferQueue(submit_count); 229 return AddToPendingTransferQueue(submit_count);
230 } 230 }
231 231
232 bool AsyncPixelTransfersCompletedQuery::Process() { 232 bool AsyncPixelTransfersCompletedQuery::Process() {
233 QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>( 233 QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>(
234 shm_id(), shm_offset(), sizeof(*sync)); 234 shm_id(), shm_offset(), sizeof(*sync));
235 if (!sync) 235 if (!sync)
236 return false; 236 return false;
237 237
238 // Check if completion callback has been run. sync->process_count atomicity 238 // Check if completion callback has been run. sync->process_count atomicity
239 // is guaranteed as this is already used to notify client of a completed 239 // is guaranteed as this is already used to notify client of a completed
240 // query. 240 // query.
241 if (sync->process_count != submit_count()) 241 if (sync->process_count != submit_count())
242 return true; 242 return true;
243 243
244 UnmarkAsPending(); 244 UnmarkAsPending();
245 return true; 245 return true;
246 } 246 }
247 247
248 void AsyncPixelTransfersCompletedQuery::Destroy(bool /* have_context */) { 248 void AsyncPixelTransfersCompletedQuery::Destroy(bool /* have_context */) {
249 if (!IsDeleted()) { 249 if (!IsDeleted()) {
250 MarkAsDeleted(); 250 MarkAsDeleted();
251 } 251 }
252 } 252 }
253 253
254 AsyncPixelTransfersCompletedQuery::~AsyncPixelTransfersCompletedQuery() { 254 AsyncPixelTransfersCompletedQuery::~AsyncPixelTransfersCompletedQuery() {
255 } 255 }
256 256
257 ///////////////////
258 class AsyncReadPixelsCompletedQuery
259 : public QueryManager::Query
260 , public base::SupportsWeakPtr<AsyncReadPixelsCompletedQuery> {
piman 2013/07/01 22:24:08 nit: , on previous line.
hubbe 2013/07/01 22:34:41 Done.
261 public:
262 AsyncReadPixelsCompletedQuery(
263 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset);
264
265 virtual bool Begin() OVERRIDE;
266 virtual bool End(uint32 submit_count) OVERRIDE;
267 virtual bool Process() OVERRIDE;
268 virtual void Destroy(bool have_context) OVERRIDE;
269
270 protected:
271 void Complete();
272 virtual ~AsyncReadPixelsCompletedQuery();
273 };
274
275 AsyncReadPixelsCompletedQuery::AsyncReadPixelsCompletedQuery(
276 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset)
277 : Query(manager, target, shm_id, shm_offset) {
278 }
279
280 bool AsyncReadPixelsCompletedQuery::Begin() {
281 return true;
282 }
283
284 bool AsyncReadPixelsCompletedQuery::End(uint32 submit_count) {
285 manager()->decoder()->WaitForReadPixels(
286 base::Bind(&AsyncReadPixelsCompletedQuery::Complete,
287 AsWeakPtr()));
288
289 return AddToPendingTransferQueue(submit_count);
290 }
291
292 void AsyncReadPixelsCompletedQuery::Complete() {
293 MarkAsCompleted(1);
294 }
295
296 bool AsyncReadPixelsCompletedQuery::Process() {
297 return !pending();
298 }
299
300 void AsyncReadPixelsCompletedQuery::Destroy(bool /* have_context */) {
301 if (!IsDeleted()) {
302 MarkAsDeleted();
303 }
304 }
305
306 AsyncReadPixelsCompletedQuery::~AsyncReadPixelsCompletedQuery() {
307 }
308
309
257 class GetErrorQuery : public QueryManager::Query { 310 class GetErrorQuery : public QueryManager::Query {
258 public: 311 public:
259 GetErrorQuery( 312 GetErrorQuery(
260 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); 313 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset);
261 314
262 virtual bool Begin() OVERRIDE; 315 virtual bool Begin() OVERRIDE;
263 virtual bool End(uint32 submit_count) OVERRIDE; 316 virtual bool End(uint32 submit_count) OVERRIDE;
264 virtual bool Process() OVERRIDE; 317 virtual bool Process() OVERRIDE;
265 virtual void Destroy(bool have_context) OVERRIDE; 318 virtual void Destroy(bool have_context) OVERRIDE;
266 319
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 case GL_COMMANDS_ISSUED_CHROMIUM: 391 case GL_COMMANDS_ISSUED_CHROMIUM:
339 query = new CommandsIssuedQuery(this, target, shm_id, shm_offset); 392 query = new CommandsIssuedQuery(this, target, shm_id, shm_offset);
340 break; 393 break;
341 case GL_LATENCY_QUERY_CHROMIUM: 394 case GL_LATENCY_QUERY_CHROMIUM:
342 query = new CommandLatencyQuery(this, target, shm_id, shm_offset); 395 query = new CommandLatencyQuery(this, target, shm_id, shm_offset);
343 break; 396 break;
344 case GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM: 397 case GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM:
345 query = new AsyncPixelTransfersCompletedQuery( 398 query = new AsyncPixelTransfersCompletedQuery(
346 this, target, shm_id, shm_offset); 399 this, target, shm_id, shm_offset);
347 break; 400 break;
401 case GL_ASYNC_READ_PIXELS_COMPLETED_CHROMIUM:
402 query = new AsyncReadPixelsCompletedQuery(
403 this, target, shm_id, shm_offset);
404 break;
348 case GL_GET_ERROR_QUERY_CHROMIUM: 405 case GL_GET_ERROR_QUERY_CHROMIUM:
349 query = new GetErrorQuery(this, target, shm_id, shm_offset); 406 query = new GetErrorQuery(this, target, shm_id, shm_offset);
350 break; 407 break;
351 default: { 408 default: {
352 GLuint service_id = 0; 409 GLuint service_id = 0;
353 glGenQueriesARB(1, &service_id); 410 glGenQueriesARB(1, &service_id);
354 DCHECK_NE(0u, service_id); 411 DCHECK_NE(0u, service_id);
355 query = new AllSamplesPassedQuery( 412 query = new AllSamplesPassedQuery(
356 this, target, shm_id, shm_offset, service_id); 413 this, target, shm_id, shm_offset, service_id);
357 break; 414 break;
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 bool QueryManager::EndQuery(Query* query, uint32 submit_count) { 633 bool QueryManager::EndQuery(Query* query, uint32 submit_count) {
577 DCHECK(query); 634 DCHECK(query);
578 if (!RemovePendingQuery(query)) { 635 if (!RemovePendingQuery(query)) {
579 return false; 636 return false;
580 } 637 }
581 return query->End(submit_count); 638 return query->End(submit_count);
582 } 639 }
583 640
584 } // namespace gles2 641 } // namespace gles2
585 } // namespace gpu 642 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698