OLD | NEW |
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" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 bool AsyncPixelTransfersCompletedQuery::Begin() { | 81 bool AsyncPixelTransfersCompletedQuery::Begin() { |
82 return true; | 82 return true; |
83 } | 83 } |
84 | 84 |
85 bool AsyncPixelTransfersCompletedQuery::End( | 85 bool AsyncPixelTransfersCompletedQuery::End( |
86 base::subtle::Atomic32 submit_count) { | 86 base::subtle::Atomic32 submit_count) { |
87 // Get the real shared memory since it might need to be duped to prevent | 87 // Get the real shared memory since it might need to be duped to prevent |
88 // use-after-free of the memory. | 88 // use-after-free of the memory. |
89 scoped_refptr<Buffer> buffer = | 89 scoped_refptr<Buffer> buffer = |
90 manager()->decoder()->GetSharedMemoryBuffer(shm_id()); | 90 manager()->decoder()->GetSharedMemoryBuffer(shm_id()); |
91 if (!buffer) | 91 if (!buffer.get()) |
92 return false; | 92 return false; |
93 AsyncMemoryParams mem_params(buffer, shm_offset(), sizeof(QuerySync)); | 93 AsyncMemoryParams mem_params(buffer, shm_offset(), sizeof(QuerySync)); |
94 if (!mem_params.GetDataAddress()) | 94 if (!mem_params.GetDataAddress()) |
95 return false; | 95 return false; |
96 | 96 |
97 observer_ = new AsyncPixelTransferCompletionObserverImpl(submit_count); | 97 observer_ = new AsyncPixelTransferCompletionObserverImpl(submit_count); |
98 | 98 |
99 // Ask AsyncPixelTransferDelegate to run completion callback after all | 99 // Ask AsyncPixelTransferDelegate to run completion callback after all |
100 // previous async transfers are done. No guarantee that callback is run | 100 // previous async transfers are done. No guarantee that callback is run |
101 // on the current thread. | 101 // on the current thread. |
102 manager()->decoder()->GetAsyncPixelTransferManager() | 102 manager()->decoder()->GetAsyncPixelTransferManager()->AsyncNotifyCompletion( |
103 ->AsyncNotifyCompletion(mem_params, observer_); | 103 mem_params, observer_.get()); |
104 | 104 |
105 return AddToPendingTransferQueue(submit_count); | 105 return AddToPendingTransferQueue(submit_count); |
106 } | 106 } |
107 | 107 |
108 bool AsyncPixelTransfersCompletedQuery::Process() { | 108 bool AsyncPixelTransfersCompletedQuery::Process() { |
109 QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>( | 109 QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>( |
110 shm_id(), shm_offset(), sizeof(*sync)); | 110 shm_id(), shm_offset(), sizeof(*sync)); |
111 if (!sync) | 111 if (!sync) |
112 return false; | 112 return false; |
113 | 113 |
114 // Check if completion callback has been run. sync->process_count atomicity | 114 // Check if completion callback has been run. sync->process_count atomicity |
115 // is guaranteed as this is already used to notify client of a completed | 115 // is guaranteed as this is already used to notify client of a completed |
116 // query. | 116 // query. |
117 if (base::subtle::Acquire_Load(&sync->process_count) != submit_count()) | 117 if (base::subtle::Acquire_Load(&sync->process_count) != submit_count()) |
118 return true; | 118 return true; |
119 | 119 |
120 UnmarkAsPending(); | 120 UnmarkAsPending(); |
121 return true; | 121 return true; |
122 } | 122 } |
123 | 123 |
124 void AsyncPixelTransfersCompletedQuery::Destroy(bool /* have_context */) { | 124 void AsyncPixelTransfersCompletedQuery::Destroy(bool /* have_context */) { |
125 if (!IsDeleted()) { | 125 if (!IsDeleted()) { |
126 MarkAsDeleted(); | 126 MarkAsDeleted(); |
127 } | 127 } |
128 } | 128 } |
129 | 129 |
130 AsyncPixelTransfersCompletedQuery::~AsyncPixelTransfersCompletedQuery() { | 130 AsyncPixelTransfersCompletedQuery::~AsyncPixelTransfersCompletedQuery() { |
131 if (observer_) | 131 if (observer_.get()) |
132 observer_->Cancel(); | 132 observer_->Cancel(); |
133 } | 133 } |
134 | 134 |
135 } // namespace | 135 } // namespace |
136 | 136 |
137 class AllSamplesPassedQuery : public QueryManager::Query { | 137 class AllSamplesPassedQuery : public QueryManager::Query { |
138 public: | 138 public: |
139 AllSamplesPassedQuery( | 139 AllSamplesPassedQuery( |
140 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset, | 140 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset, |
141 GLuint service_id); | 141 GLuint service_id); |
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 bool QueryManager::EndQuery(Query* query, base::subtle::Atomic32 submit_count) { | 738 bool QueryManager::EndQuery(Query* query, base::subtle::Atomic32 submit_count) { |
739 DCHECK(query); | 739 DCHECK(query); |
740 if (!RemovePendingQuery(query)) { | 740 if (!RemovePendingQuery(query)) { |
741 return false; | 741 return false; |
742 } | 742 } |
743 return query->End(submit_count); | 743 return query->End(submit_count); |
744 } | 744 } |
745 | 745 |
746 } // namespace gles2 | 746 } // namespace gles2 |
747 } // namespace gpu | 747 } // namespace gpu |
OLD | NEW |