| 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" |
| 11 #include "base/synchronization/lock.h" | 11 #include "base/synchronization/lock.h" |
| 12 #include "base/time/time.h" | 12 #include "base/time/time.h" |
| 13 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 13 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
| 14 #include "gpu/command_buffer/service/async_pixel_transfer_manager.h" | 14 #include "gpu/command_buffer/service/async_pixel_transfer_manager.h" |
| 15 #include "gpu/command_buffer/service/cmd_buffer_engine.h" |
| 15 #include "gpu/command_buffer/service/error_state.h" | 16 #include "gpu/command_buffer/service/error_state.h" |
| 16 #include "gpu/command_buffer/service/feature_info.h" | 17 #include "gpu/command_buffer/service/feature_info.h" |
| 17 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 18 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 18 | 19 |
| 19 namespace gpu { | 20 namespace gpu { |
| 20 namespace gles2 { | 21 namespace gles2 { |
| 21 | 22 |
| 22 namespace { | 23 namespace { |
| 23 | 24 |
| 24 class AsyncPixelTransferCompletionObserverImpl | 25 class AsyncPixelTransferCompletionObserverImpl |
| 25 : public AsyncPixelTransferCompletionObserver { | 26 : public AsyncPixelTransferCompletionObserver { |
| 26 public: | 27 public: |
| 27 AsyncPixelTransferCompletionObserverImpl(uint32 submit_count) | 28 AsyncPixelTransferCompletionObserverImpl( |
| 28 : submit_count_(submit_count), | 29 base::WeakPtr<QueryManager> manager, |
| 30 scoped_refptr<base::MessageLoopProxy> proxy, |
| 31 uint32 submit_count, |
| 32 uint32 serial) |
| 33 : manager_(manager), |
| 34 proxy_(proxy), |
| 35 submit_count_(submit_count), |
| 36 serial_(serial), |
| 29 cancelled_(false) {} | 37 cancelled_(false) {} |
| 30 | 38 |
| 31 void Cancel() { | 39 void Cancel() { |
| 32 base::AutoLock locked(lock_); | 40 base::AutoLock locked(lock_); |
| 33 cancelled_ = true; | 41 cancelled_ = true; |
| 34 } | 42 } |
| 35 | 43 |
| 36 virtual void DidComplete(const AsyncMemoryParams& mem_params) OVERRIDE { | 44 virtual void DidComplete(const AsyncMemoryParams& mem_params) OVERRIDE { |
| 37 base::AutoLock locked(lock_); | 45 base::AutoLock locked(lock_); |
| 38 if (!cancelled_) { | 46 if (!cancelled_) { |
| 39 DCHECK(mem_params.shared_memory); | 47 DCHECK(mem_params.shared_memory); |
| 40 DCHECK(mem_params.shared_memory->memory()); | 48 DCHECK(mem_params.shared_memory->memory()); |
| 41 void* data = static_cast<int8*>(mem_params.shared_memory->memory()) + | 49 void* data = static_cast<int8*>(mem_params.shared_memory->memory()) + |
| 42 mem_params.shm_data_offset; | 50 mem_params.shm_data_offset; |
| 43 QuerySync* sync = static_cast<QuerySync*>(data); | 51 QuerySync* sync = static_cast<QuerySync*>(data); |
| 44 | 52 |
| 45 // Need a MemoryBarrier here to ensure that upload completed before | 53 // Need a MemoryBarrier here to ensure that upload completed before |
| 46 // submit_count was written to sync->process_count. | 54 // submit_count was written to sync->process_count. |
| 47 base::subtle::MemoryBarrier(); | 55 base::subtle::MemoryBarrier(); |
| 48 sync->process_count = submit_count_; | 56 sync->process_count = submit_count_; |
| 57 |
| 58 if (serial_) { |
| 59 proxy_->PostTask( |
| 60 FROM_HERE, |
| 61 base::Bind(&AsyncPixelTransferCompletionObserverImpl::SetSerial, |
| 62 this)); |
| 63 } |
| 49 } | 64 } |
| 50 } | 65 } |
| 51 | 66 |
| 52 private: | 67 private: |
| 53 virtual ~AsyncPixelTransferCompletionObserverImpl() {} | 68 virtual ~AsyncPixelTransferCompletionObserverImpl() {} |
| 54 | 69 |
| 70 void SetSerial() { |
| 71 if (!manager_.get()) |
| 72 return; |
| 73 |
| 74 manager_->decoder()->engine()->set_serial(serial_); |
| 75 } |
| 76 |
| 77 base::WeakPtr<QueryManager> manager_; |
| 78 scoped_refptr<base::MessageLoopProxy> proxy_; |
| 79 |
| 55 uint32 submit_count_; | 80 uint32 submit_count_; |
| 81 uint32 serial_; |
| 56 | 82 |
| 57 base::Lock lock_; | 83 base::Lock lock_; |
| 58 bool cancelled_; | 84 bool cancelled_; |
| 59 | 85 |
| 60 DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferCompletionObserverImpl); | 86 DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferCompletionObserverImpl); |
| 61 }; | 87 }; |
| 62 | 88 |
| 63 class AsyncPixelTransfersCompletedQuery | 89 class AsyncPixelTransfersCompletedQuery |
| 64 : public QueryManager::Query, | 90 : public QueryManager::Query, |
| 65 public base::SupportsWeakPtr<AsyncPixelTransfersCompletedQuery> { | 91 public base::SupportsWeakPtr<AsyncPixelTransfersCompletedQuery> { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 92 // Get the real shared memory since it might need to be duped to prevent | 118 // Get the real shared memory since it might need to be duped to prevent |
| 93 // use-after-free of the memory. | 119 // use-after-free of the memory. |
| 94 Buffer buffer = manager()->decoder()->GetSharedMemoryBuffer(shm_id()); | 120 Buffer buffer = manager()->decoder()->GetSharedMemoryBuffer(shm_id()); |
| 95 if (!buffer.shared_memory) | 121 if (!buffer.shared_memory) |
| 96 return false; | 122 return false; |
| 97 mem_params.shared_memory = buffer.shared_memory; | 123 mem_params.shared_memory = buffer.shared_memory; |
| 98 mem_params.shm_size = buffer.size; | 124 mem_params.shm_size = buffer.size; |
| 99 mem_params.shm_data_offset = shm_offset(); | 125 mem_params.shm_data_offset = shm_offset(); |
| 100 mem_params.shm_data_size = sizeof(QuerySync); | 126 mem_params.shm_data_size = sizeof(QuerySync); |
| 101 | 127 |
| 102 observer_ = new AsyncPixelTransferCompletionObserverImpl(submit_count); | 128 scoped_refptr<base::MessageLoopProxy> proxy = |
| 129 base::MessageLoop::current()->message_loop_proxy(); |
| 130 observer_ = new AsyncPixelTransferCompletionObserverImpl( |
| 131 manager()->AsWeakPtr(), proxy, submit_count, serial()); |
| 103 | 132 |
| 104 // Ask AsyncPixelTransferDelegate to run completion callback after all | 133 // Ask AsyncPixelTransferDelegate to run completion callback after all |
| 105 // previous async transfers are done. No guarantee that callback is run | 134 // previous async transfers are done. No guarantee that callback is run |
| 106 // on the current thread. | 135 // on the current thread. |
| 107 manager()->decoder()->GetAsyncPixelTransferManager() | 136 manager()->decoder()->GetAsyncPixelTransferManager() |
| 108 ->AsyncNotifyCompletion(mem_params, observer_); | 137 ->AsyncNotifyCompletion(mem_params, observer_); |
| 109 | 138 |
| 110 return AddToPendingTransferQueue(submit_count); | 139 return AddToPendingTransferQueue(submit_count); |
| 111 } | 140 } |
| 112 | 141 |
| (...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 bool QueryManager::EndQuery(Query* query, uint32 submit_count) { | 700 bool QueryManager::EndQuery(Query* query, uint32 submit_count) { |
| 672 DCHECK(query); | 701 DCHECK(query); |
| 673 if (!RemovePendingQuery(query)) { | 702 if (!RemovePendingQuery(query)) { |
| 674 return false; | 703 return false; |
| 675 } | 704 } |
| 676 return query->End(submit_count); | 705 return query->End(submit_count); |
| 677 } | 706 } |
| 678 | 707 |
| 679 } // namespace gles2 | 708 } // namespace gles2 |
| 680 } // namespace gpu | 709 } // namespace gpu |
| OLD | NEW |