| 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 85e273c6c3a02b570cc87b634823c577eaaf63a8..c8ccace5cab45dc08b8a41a78f4b02e6afd45c8d 100644
|
| --- a/gpu/command_buffer/service/query_manager.cc
|
| +++ b/gpu/command_buffer/service/query_manager.cc
|
| @@ -12,6 +12,7 @@
|
| #include "base/time/time.h"
|
| #include "gpu/command_buffer/common/gles2_cmd_format.h"
|
| #include "gpu/command_buffer/service/async_pixel_transfer_manager.h"
|
| +#include "gpu/command_buffer/service/cmd_buffer_engine.h"
|
| #include "gpu/command_buffer/service/error_state.h"
|
| #include "gpu/command_buffer/service/feature_info.h"
|
| #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
|
| @@ -24,8 +25,15 @@ namespace {
|
| class AsyncPixelTransferCompletionObserverImpl
|
| : public AsyncPixelTransferCompletionObserver {
|
| public:
|
| - AsyncPixelTransferCompletionObserverImpl(uint32 submit_count)
|
| - : submit_count_(submit_count),
|
| + AsyncPixelTransferCompletionObserverImpl(
|
| + base::WeakPtr<QueryManager> manager,
|
| + scoped_refptr<base::MessageLoopProxy> proxy,
|
| + uint32 submit_count,
|
| + uint32 serial)
|
| + : manager_(manager),
|
| + proxy_(proxy),
|
| + submit_count_(submit_count),
|
| + serial_(serial),
|
| cancelled_(false) {}
|
|
|
| void Cancel() {
|
| @@ -46,13 +54,31 @@ class AsyncPixelTransferCompletionObserverImpl
|
| // submit_count was written to sync->process_count.
|
| base::subtle::MemoryBarrier();
|
| sync->process_count = submit_count_;
|
| +
|
| + if (serial_) {
|
| + proxy_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&AsyncPixelTransferCompletionObserverImpl::SetSerial,
|
| + this));
|
| + }
|
| }
|
| }
|
|
|
| private:
|
| virtual ~AsyncPixelTransferCompletionObserverImpl() {}
|
|
|
| + void SetSerial() {
|
| + if (!manager_.get())
|
| + return;
|
| +
|
| + manager_->decoder()->engine()->set_serial(serial_);
|
| + }
|
| +
|
| + base::WeakPtr<QueryManager> manager_;
|
| + scoped_refptr<base::MessageLoopProxy> proxy_;
|
| +
|
| uint32 submit_count_;
|
| + uint32 serial_;
|
|
|
| base::Lock lock_;
|
| bool cancelled_;
|
| @@ -99,7 +125,10 @@ bool AsyncPixelTransfersCompletedQuery::End(uint32 submit_count) {
|
| mem_params.shm_data_offset = shm_offset();
|
| mem_params.shm_data_size = sizeof(QuerySync);
|
|
|
| - observer_ = new AsyncPixelTransferCompletionObserverImpl(submit_count);
|
| + scoped_refptr<base::MessageLoopProxy> proxy =
|
| + base::MessageLoop::current()->message_loop_proxy();
|
| + observer_ = new AsyncPixelTransferCompletionObserverImpl(
|
| + manager()->AsWeakPtr(), proxy, submit_count, serial());
|
|
|
| // Ask AsyncPixelTransferDelegate to run completion callback after all
|
| // previous async transfers are done. No guarantee that callback is run
|
|
|