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

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

Issue 238933003: Re-land: gpu: Add CHROMIUM_sync_query extension. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address review feedback Created 6 years, 8 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/memory/shared_memory.h" 10 #include "base/memory/shared_memory.h"
11 #include "base/numerics/safe_math.h" 11 #include "base/numerics/safe_math.h"
12 #include "base/synchronization/lock.h" 12 #include "base/synchronization/lock.h"
13 #include "base/time/time.h" 13 #include "base/time/time.h"
14 #include "gpu/command_buffer/common/gles2_cmd_format.h" 14 #include "gpu/command_buffer/common/gles2_cmd_format.h"
15 #include "gpu/command_buffer/service/async_pixel_transfer_manager.h" 15 #include "gpu/command_buffer/service/async_pixel_transfer_manager.h"
16 #include "gpu/command_buffer/service/error_state.h" 16 #include "gpu/command_buffer/service/error_state.h"
17 #include "gpu/command_buffer/service/feature_info.h" 17 #include "gpu/command_buffer/service/feature_info.h"
18 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 18 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
19 #include "ui/gl/gl_fence.h"
19 20
20 namespace gpu { 21 namespace gpu {
21 namespace gles2 { 22 namespace gles2 {
22 23
23 namespace { 24 namespace {
24 25
25 class AsyncPixelTransferCompletionObserverImpl 26 class AsyncPixelTransferCompletionObserverImpl
26 : public AsyncPixelTransferCompletionObserver { 27 : public AsyncPixelTransferCompletionObserver {
27 public: 28 public:
28 AsyncPixelTransferCompletionObserverImpl(base::subtle::Atomic32 submit_count) 29 AsyncPixelTransferCompletionObserverImpl(base::subtle::Atomic32 submit_count)
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 383
383 void GetErrorQuery::Destroy(bool /* have_context */) { 384 void GetErrorQuery::Destroy(bool /* have_context */) {
384 if (!IsDeleted()) { 385 if (!IsDeleted()) {
385 MarkAsDeleted(); 386 MarkAsDeleted();
386 } 387 }
387 } 388 }
388 389
389 GetErrorQuery::~GetErrorQuery() { 390 GetErrorQuery::~GetErrorQuery() {
390 } 391 }
391 392
393 class CommandsCompletedQuery : public QueryManager::Query {
394 public:
395 CommandsCompletedQuery(QueryManager* manager,
396 GLenum target,
397 int32 shm_id,
398 uint32 shm_offset);
399
400 // Overridden from QueryManager::Query:
401 virtual bool Begin() OVERRIDE;
402 virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE;
403 virtual bool Process() OVERRIDE;
404 virtual void Destroy(bool have_context) OVERRIDE;
405
406 protected:
407 virtual ~CommandsCompletedQuery();
408
409 private:
410 scoped_ptr<gfx::GLFence> fence_;
411 };
412
413 CommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager,
414 GLenum target,
415 int32 shm_id,
416 uint32 shm_offset)
417 : Query(manager, target, shm_id, shm_offset) {}
418
419 bool CommandsCompletedQuery::Begin() {
420 return true;
421 }
422
423 bool CommandsCompletedQuery::End(base::subtle::Atomic32 submit_count) {
424 fence_.reset(gfx::GLFence::CreateWithoutFlush());
no sievers 2014/04/15 23:53:37 Make sure piman@ is ok with this being used here :
piman 2014/04/16 00:32:03 The client only forces a shallow flush, because th
reveman 2014/04/16 01:28:47 Ah, looked like QueryTracker::Query::CheckResultsA
425 DCHECK(fence_);
piman 2014/04/16 00:32:03 gfx::GLFence::Create (with or without flush) will
reveman 2014/04/16 01:28:47 Got it.
426 return AddToPendingQueue(submit_count);
427 }
428
429 bool CommandsCompletedQuery::Process() {
430 if (fence_ && !fence_->HasCompleted())
431 return true;
432 return MarkAsCompleted(0);
433 }
434
435 void CommandsCompletedQuery::Destroy(bool have_context) {
436 if (have_context && !IsDeleted()) {
437 fence_.reset();
438 MarkAsDeleted();
439 }
440 }
441
442 CommandsCompletedQuery::~CommandsCompletedQuery() {}
443
392 QueryManager::QueryManager( 444 QueryManager::QueryManager(
393 GLES2Decoder* decoder, 445 GLES2Decoder* decoder,
394 FeatureInfo* feature_info) 446 FeatureInfo* feature_info)
395 : decoder_(decoder), 447 : decoder_(decoder),
396 use_arb_occlusion_query2_for_occlusion_query_boolean_( 448 use_arb_occlusion_query2_for_occlusion_query_boolean_(
397 feature_info->feature_flags( 449 feature_info->feature_flags(
398 ).use_arb_occlusion_query2_for_occlusion_query_boolean), 450 ).use_arb_occlusion_query2_for_occlusion_query_boolean),
399 use_arb_occlusion_query_for_occlusion_query_boolean_( 451 use_arb_occlusion_query_for_occlusion_query_boolean_(
400 feature_info->feature_flags( 452 feature_info->feature_flags(
401 ).use_arb_occlusion_query_for_occlusion_query_boolean), 453 ).use_arb_occlusion_query_for_occlusion_query_boolean),
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 query = new AsyncPixelTransfersCompletedQuery( 489 query = new AsyncPixelTransfersCompletedQuery(
438 this, target, shm_id, shm_offset); 490 this, target, shm_id, shm_offset);
439 break; 491 break;
440 case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM: 492 case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM:
441 query = new AsyncReadPixelsCompletedQuery( 493 query = new AsyncReadPixelsCompletedQuery(
442 this, target, shm_id, shm_offset); 494 this, target, shm_id, shm_offset);
443 break; 495 break;
444 case GL_GET_ERROR_QUERY_CHROMIUM: 496 case GL_GET_ERROR_QUERY_CHROMIUM:
445 query = new GetErrorQuery(this, target, shm_id, shm_offset); 497 query = new GetErrorQuery(this, target, shm_id, shm_offset);
446 break; 498 break;
499 case GL_COMMANDS_COMPLETED_CHROMIUM:
500 query = new CommandsCompletedQuery(this, target, shm_id, shm_offset);
501 break;
447 default: { 502 default: {
448 GLuint service_id = 0; 503 GLuint service_id = 0;
449 glGenQueriesARB(1, &service_id); 504 glGenQueriesARB(1, &service_id);
450 DCHECK_NE(0u, service_id); 505 DCHECK_NE(0u, service_id);
451 query = new AllSamplesPassedQuery( 506 query = new AllSamplesPassedQuery(
452 this, target, shm_id, shm_offset, service_id); 507 this, target, shm_id, shm_offset, service_id);
453 break; 508 break;
454 } 509 }
455 } 510 }
456 std::pair<QueryMap::iterator, bool> result = 511 std::pair<QueryMap::iterator, bool> result =
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 bool QueryManager::EndQuery(Query* query, base::subtle::Atomic32 submit_count) { 727 bool QueryManager::EndQuery(Query* query, base::subtle::Atomic32 submit_count) {
673 DCHECK(query); 728 DCHECK(query);
674 if (!RemovePendingQuery(query)) { 729 if (!RemovePendingQuery(query)) {
675 return false; 730 return false;
676 } 731 }
677 return query->End(submit_count); 732 return query->End(submit_count);
678 } 733 }
679 734
680 } // namespace gles2 735 } // namespace gles2
681 } // namespace gpu 736 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698