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/shared_memory.h" | 10 #include "base/shared_memory.h" |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 mem_params.shared_memory = buffer.shared_memory; | 216 mem_params.shared_memory = buffer.shared_memory; |
217 mem_params.shm_size = buffer.size; | 217 mem_params.shm_size = buffer.size; |
218 mem_params.shm_data_offset = shm_offset(); | 218 mem_params.shm_data_offset = shm_offset(); |
219 mem_params.shm_data_size = sizeof(QuerySync); | 219 mem_params.shm_data_size = sizeof(QuerySync); |
220 | 220 |
221 // Ask AsyncPixelTransferDelegate to run completion callback after all | 221 // Ask AsyncPixelTransferDelegate to run completion callback after all |
222 // previous async transfers are done. No guarantee that callback is run | 222 // previous async transfers are done. No guarantee that callback is run |
223 // on the current thread. | 223 // on the current thread. |
224 manager()->decoder()->GetAsyncPixelTransferManager()->AsyncNotifyCompletion( | 224 manager()->decoder()->GetAsyncPixelTransferManager()->AsyncNotifyCompletion( |
225 mem_params, | 225 mem_params, |
226 base::Bind(AsyncPixelTransfersCompletedQuery::MarkAsCompletedThreadSafe, | 226 base::Bind(&AsyncPixelTransfersCompletedQuery::MarkAsCompletedThreadSafe, |
227 submit_count)); | 227 submit_count)); |
228 | |
229 return AddToPendingTransferQueue(submit_count); | 228 return AddToPendingTransferQueue(submit_count); |
230 } | 229 } |
231 | 230 |
232 bool AsyncPixelTransfersCompletedQuery::Process() { | 231 bool AsyncPixelTransfersCompletedQuery::Process() { |
233 QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>( | 232 QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>( |
234 shm_id(), shm_offset(), sizeof(*sync)); | 233 shm_id(), shm_offset(), sizeof(*sync)); |
235 if (!sync) | 234 if (!sync) |
236 return false; | 235 return false; |
237 | 236 |
238 // Check if completion callback has been run. sync->process_count atomicity | 237 // 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 | 238 // is guaranteed as this is already used to notify client of a completed |
240 // query. | 239 // query. |
241 if (sync->process_count != submit_count()) | 240 if (sync->process_count != submit_count()) |
242 return true; | 241 return true; |
243 | 242 |
244 UnmarkAsPending(); | 243 UnmarkAsPending(); |
245 return true; | 244 return true; |
246 } | 245 } |
247 | 246 |
248 void AsyncPixelTransfersCompletedQuery::Destroy(bool /* have_context */) { | 247 void AsyncPixelTransfersCompletedQuery::Destroy(bool /* have_context */) { |
249 if (!IsDeleted()) { | 248 if (!IsDeleted()) { |
250 MarkAsDeleted(); | 249 MarkAsDeleted(); |
251 } | 250 } |
252 } | 251 } |
253 | 252 |
254 AsyncPixelTransfersCompletedQuery::~AsyncPixelTransfersCompletedQuery() { | 253 AsyncPixelTransfersCompletedQuery::~AsyncPixelTransfersCompletedQuery() { |
255 } | 254 } |
256 | 255 |
| 256 class AsyncReadPixelsCompletedQuery |
| 257 : public QueryManager::Query, |
| 258 public base::SupportsWeakPtr<AsyncReadPixelsCompletedQuery> { |
| 259 public: |
| 260 AsyncReadPixelsCompletedQuery( |
| 261 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); |
| 262 |
| 263 virtual bool Begin() OVERRIDE; |
| 264 virtual bool End(uint32 submit_count) OVERRIDE; |
| 265 virtual bool Process() OVERRIDE; |
| 266 virtual void Destroy(bool have_context) OVERRIDE; |
| 267 |
| 268 protected: |
| 269 void Complete(); |
| 270 virtual ~AsyncReadPixelsCompletedQuery(); |
| 271 }; |
| 272 |
| 273 AsyncReadPixelsCompletedQuery::AsyncReadPixelsCompletedQuery( |
| 274 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) |
| 275 : Query(manager, target, shm_id, shm_offset) { |
| 276 } |
| 277 |
| 278 bool AsyncReadPixelsCompletedQuery::Begin() { |
| 279 return true; |
| 280 } |
| 281 |
| 282 bool AsyncReadPixelsCompletedQuery::End(uint32 submit_count) { |
| 283 manager()->decoder()->WaitForReadPixels( |
| 284 base::Bind(&AsyncReadPixelsCompletedQuery::Complete, |
| 285 AsWeakPtr())); |
| 286 |
| 287 return AddToPendingTransferQueue(submit_count); |
| 288 } |
| 289 |
| 290 void AsyncReadPixelsCompletedQuery::Complete() { |
| 291 MarkAsCompleted(1); |
| 292 } |
| 293 |
| 294 bool AsyncReadPixelsCompletedQuery::Process() { |
| 295 return !pending(); |
| 296 } |
| 297 |
| 298 void AsyncReadPixelsCompletedQuery::Destroy(bool /* have_context */) { |
| 299 if (!IsDeleted()) { |
| 300 MarkAsDeleted(); |
| 301 } |
| 302 } |
| 303 |
| 304 AsyncReadPixelsCompletedQuery::~AsyncReadPixelsCompletedQuery() { |
| 305 } |
| 306 |
| 307 |
257 class GetErrorQuery : public QueryManager::Query { | 308 class GetErrorQuery : public QueryManager::Query { |
258 public: | 309 public: |
259 GetErrorQuery( | 310 GetErrorQuery( |
260 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); | 311 QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); |
261 | 312 |
262 virtual bool Begin() OVERRIDE; | 313 virtual bool Begin() OVERRIDE; |
263 virtual bool End(uint32 submit_count) OVERRIDE; | 314 virtual bool End(uint32 submit_count) OVERRIDE; |
264 virtual bool Process() OVERRIDE; | 315 virtual bool Process() OVERRIDE; |
265 virtual void Destroy(bool have_context) OVERRIDE; | 316 virtual void Destroy(bool have_context) OVERRIDE; |
266 | 317 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 case GL_COMMANDS_ISSUED_CHROMIUM: | 389 case GL_COMMANDS_ISSUED_CHROMIUM: |
339 query = new CommandsIssuedQuery(this, target, shm_id, shm_offset); | 390 query = new CommandsIssuedQuery(this, target, shm_id, shm_offset); |
340 break; | 391 break; |
341 case GL_LATENCY_QUERY_CHROMIUM: | 392 case GL_LATENCY_QUERY_CHROMIUM: |
342 query = new CommandLatencyQuery(this, target, shm_id, shm_offset); | 393 query = new CommandLatencyQuery(this, target, shm_id, shm_offset); |
343 break; | 394 break; |
344 case GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM: | 395 case GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM: |
345 query = new AsyncPixelTransfersCompletedQuery( | 396 query = new AsyncPixelTransfersCompletedQuery( |
346 this, target, shm_id, shm_offset); | 397 this, target, shm_id, shm_offset); |
347 break; | 398 break; |
| 399 case GL_ASYNC_READ_PIXELS_COMPLETED_CHROMIUM: |
| 400 query = new AsyncReadPixelsCompletedQuery( |
| 401 this, target, shm_id, shm_offset); |
| 402 break; |
348 case GL_GET_ERROR_QUERY_CHROMIUM: | 403 case GL_GET_ERROR_QUERY_CHROMIUM: |
349 query = new GetErrorQuery(this, target, shm_id, shm_offset); | 404 query = new GetErrorQuery(this, target, shm_id, shm_offset); |
350 break; | 405 break; |
351 default: { | 406 default: { |
352 GLuint service_id = 0; | 407 GLuint service_id = 0; |
353 glGenQueriesARB(1, &service_id); | 408 glGenQueriesARB(1, &service_id); |
354 DCHECK_NE(0u, service_id); | 409 DCHECK_NE(0u, service_id); |
355 query = new AllSamplesPassedQuery( | 410 query = new AllSamplesPassedQuery( |
356 this, target, shm_id, shm_offset, service_id); | 411 this, target, shm_id, shm_offset, service_id); |
357 break; | 412 break; |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 bool QueryManager::EndQuery(Query* query, uint32 submit_count) { | 631 bool QueryManager::EndQuery(Query* query, uint32 submit_count) { |
577 DCHECK(query); | 632 DCHECK(query); |
578 if (!RemovePendingQuery(query)) { | 633 if (!RemovePendingQuery(query)) { |
579 return false; | 634 return false; |
580 } | 635 } |
581 return query->End(submit_count); | 636 return query->End(submit_count); |
582 } | 637 } |
583 | 638 |
584 } // namespace gles2 | 639 } // namespace gles2 |
585 } // namespace gpu | 640 } // namespace gpu |
OLD | NEW |