summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/client/query_tracker.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gpu/command_buffer/client/query_tracker.cc')
-rw-r--r--gpu/command_buffer/client/query_tracker.cc41
1 files changed, 40 insertions, 1 deletions
diff --git a/gpu/command_buffer/client/query_tracker.cc b/gpu/command_buffer/client/query_tracker.cc
index c85c6bb..a258f93 100644
--- a/gpu/command_buffer/client/query_tracker.cc
+++ b/gpu/command_buffer/client/query_tracker.cc
@@ -214,7 +214,12 @@ uint64 QueryTracker::Query::GetResult() const {
}
QueryTracker::QueryTracker(MappedMemoryManager* manager)
- : query_sync_manager_(manager) {
+ : query_sync_manager_(manager),
+ mapped_memory_(manager),
+ disjoint_count_sync_shm_id_(-1),
+ disjoint_count_sync_shm_offset_(0),
+ disjoint_count_sync_(nullptr),
+ local_disjoint_count_(0) {
}
QueryTracker::~QueryTracker() {
@@ -226,6 +231,10 @@ QueryTracker::~QueryTracker() {
delete removed_queries_.front();
removed_queries_.pop_front();
}
+ if (disjoint_count_sync_) {
+ mapped_memory_->Free(disjoint_count_sync_);
+ disjoint_count_sync_ = nullptr;
+ }
}
QueryTracker::Query* QueryTracker::CreateQuery(GLuint id, GLenum target) {
@@ -354,5 +363,35 @@ bool QueryTracker::QueryCounter(GLuint id, GLenum target,
return true;
}
+bool QueryTracker::SetDisjointSync(GLES2Implementation* gl) {
+ if (!disjoint_count_sync_) {
+ // Allocate memory for disjoint value sync.
+ int32_t shm_id = -1;
+ uint32_t shm_offset;
+ void* mem = mapped_memory_->Alloc(sizeof(*disjoint_count_sync_),
+ &shm_id,
+ &shm_offset);
+ if (mem) {
+ disjoint_count_sync_shm_id_ = shm_id;
+ disjoint_count_sync_shm_offset_ = shm_offset;
+ disjoint_count_sync_ = static_cast<DisjointValueSync*>(mem);
+ disjoint_count_sync_->Reset();
+ gl->helper()->SetDisjointValueSyncCHROMIUM(shm_id, shm_offset);
+ }
+ }
+ return disjoint_count_sync_ != nullptr;
+}
+
+bool QueryTracker::CheckAndResetDisjoint() {
+ if (disjoint_count_sync_) {
+ const uint32_t disjoint_count = disjoint_count_sync_->GetDisjointCount();
+ if (local_disjoint_count_ != disjoint_count) {
+ local_disjoint_count_ = disjoint_count;
+ return true;
+ }
+ }
+ return false;
+}
+
} // namespace gles2
} // namespace gpu