Chromium Code Reviews| Index: gpu/command_buffer/service/query_manager.cc |
| diff --git a/gpu/command_buffer/service/query_manager.cc b/gpu/command_buffer/service/query_manager.cc |
| index 3f81f64dccff8e1bc07fa28b571a30406a4c0f5e..69692fe69c5d2a64e417b690423b8843a963d203 100644 |
| --- a/gpu/command_buffer/service/query_manager.cc |
| +++ b/gpu/command_buffer/service/query_manager.cc |
| @@ -195,6 +195,8 @@ class AsyncPixelTransfersCompletedQuery |
| base::subtle::MemoryBarrier(); |
| sync->process_count = submit_count; |
| } |
| + void MarkAsCompletedStage1( |
| + uint32 submit_count, const AsyncMemoryParams& mem_params); |
| }; |
| AsyncPixelTransfersCompletedQuery::AsyncPixelTransfersCompletedQuery( |
| @@ -218,6 +220,17 @@ bool AsyncPixelTransfersCompletedQuery::End(uint32 submit_count) { |
| mem_params.shm_data_offset = shm_offset(); |
| mem_params.shm_data_size = sizeof(QuerySync); |
| + manager()->decoder()->WaitForReadPixels( |
| + base::Bind(&AsyncPixelTransfersCompletedQuery::MarkAsCompletedStage1, |
| + this, submit_count, mem_params)); |
|
piman
2013/06/17 19:55:06
The problem here is that for async texture upload,
hubbe
2013/06/25 20:02:51
I changed this so that WaitForReadPixels doesn't a
piman
2013/06/26 22:17:08
So as I read it, and please explain to me if I mis
hubbe
2013/06/28 22:17:49
Fixed by implementing a new query type.
|
| + |
| + return AddToPendingTransferQueue(submit_count); |
| +} |
| + |
| +void AsyncPixelTransfersCompletedQuery::MarkAsCompletedStage1( |
| + uint32 submit_count, |
| + const AsyncMemoryParams& mem_params) { |
| + |
| // Ask AsyncPixelTransferDelegate to run completion callback after all |
| // previous async transfers are done. No guarantee that callback is run |
| // on the current thread. |
| @@ -226,7 +239,7 @@ bool AsyncPixelTransfersCompletedQuery::End(uint32 submit_count) { |
| base::Bind(AsyncPixelTransfersCompletedQuery::MarkAsCompletedThreadSafe, |
| submit_count)); |
| - return AddToPendingTransferQueue(submit_count); |
| + |
| } |
| bool AsyncPixelTransfersCompletedQuery::Process() { |
| @@ -432,7 +445,21 @@ QueryManager::Query::Query( |
| manager_->StartTracking(this); |
| } |
| +void QueryManager::Query::RunCallbacks() { |
| + for (size_t i = 0; i < callbacks_.size(); i++) { |
| + callbacks_[i].Run(); |
| + } |
| + callbacks_.clear(); |
| +} |
| + |
| +void QueryManager::Query::AddCallback(base::Closure callback) { |
| + callbacks_.push_back(callback); |
|
piman
2013/06/17 19:55:06
This should call the callback if the query is not
hubbe
2013/06/25 20:02:51
Done. (In other CL)
|
| +} |
| + |
| QueryManager::Query::~Query() { |
| + // Seems like this channel is shutting down with some callbacks |
|
piman
2013/06/17 19:55:06
note: this could also happen if the query is destr
hubbe
2013/06/25 20:02:51
Handled in other CL.
|
| + // still active. Call the queries now to avoid leaks. |
| + RunCallbacks(); |
| if (manager_) { |
| manager_->StopTracking(this); |
| manager_ = NULL; |
| @@ -466,6 +493,7 @@ bool QueryManager::ProcessPendingQueries() { |
| if (query->pending()) { |
| break; |
| } |
| + query->RunCallbacks(); |
| pending_queries_.pop_front(); |
| } |
| @@ -485,6 +513,7 @@ bool QueryManager::ProcessPendingTransferQueries() { |
| if (query->pending()) { |
| break; |
| } |
| + query->RunCallbacks(); |
| pending_transfer_queries_.pop_front(); |
| } |
| @@ -562,5 +591,3 @@ bool QueryManager::EndQuery(Query* query, uint32 submit_count) { |
| } // namespace gles2 |
| } // namespace gpu |
| - |
| - |