| Index: gpu/command_buffer/service/async_pixel_transfer_manager_egl.cc
|
| diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager_egl.cc b/gpu/command_buffer/service/async_pixel_transfer_manager_egl.cc
|
| index 7e0d515e49c172b1ede3739bdceeca60b1947758..620127b9a0526b2266fe53897beaa9fc4c848539 100644
|
| --- a/gpu/command_buffer/service/async_pixel_transfer_manager_egl.cc
|
| +++ b/gpu/command_buffer/service/async_pixel_transfer_manager_egl.cc
|
| @@ -9,6 +9,7 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/debug/trace_event.h"
|
| +#include "base/debug/trace_event_synthetic_delay.h"
|
| #include "base/lazy_instance.h"
|
| #include "base/logging.h"
|
| #include "base/memory/ref_counted.h"
|
| @@ -237,7 +238,9 @@ class TransferStateInternal
|
| transfer_completion_.Reset();
|
| }
|
|
|
| - void MarkAsCompleted() {
|
| + void MarkAsCompleted(base::AtomicRefCount* pending_uploads) {
|
| + if (!base::AtomicRefCountDec(pending_uploads))
|
| + TRACE_EVENT_SYNTHETIC_DELAY_APPLY("gpu.AsyncTexImage");
|
| transfer_completion_.Signal();
|
| }
|
|
|
| @@ -252,17 +255,19 @@ class TransferStateInternal
|
| AsyncTexImage2DParams tex_params,
|
| AsyncMemoryParams mem_params,
|
| ScopedSafeSharedMemory* safe_shared_memory,
|
| - scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats) {
|
| + scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats,
|
| + base::AtomicRefCount* pending_uploads) {
|
| TRACE_EVENT2("gpu",
|
| "PerformAsyncTexImage",
|
| "width",
|
| tex_params.width,
|
| "height",
|
| tex_params.height);
|
| + TRACE_EVENT_SYNTHETIC_DELAY_ACTIVATE("gpu.AsyncTexImage");
|
| DCHECK(!thread_texture_id_);
|
| DCHECK_EQ(0, tex_params.level);
|
| if (EGL_NO_IMAGE_KHR != egl_image_) {
|
| - MarkAsCompleted();
|
| + MarkAsCompleted(pending_uploads);
|
| return;
|
| }
|
|
|
| @@ -302,7 +307,7 @@ class TransferStateInternal
|
| }
|
|
|
| WaitForLastUpload();
|
| - MarkAsCompleted();
|
| + MarkAsCompleted(pending_uploads);
|
|
|
| DCHECK(CHECK_GL());
|
| if (texture_upload_stats.get()) {
|
| @@ -315,13 +320,15 @@ class TransferStateInternal
|
| AsyncTexSubImage2DParams tex_params,
|
| AsyncMemoryParams mem_params,
|
| ScopedSafeSharedMemory* safe_shared_memory,
|
| - scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats) {
|
| + scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats,
|
| + base::AtomicRefCount* pending_uploads ) {
|
| TRACE_EVENT2("gpu",
|
| "PerformAsyncTexSubImage2D",
|
| "width",
|
| tex_params.width,
|
| "height",
|
| tex_params.height);
|
| + TRACE_EVENT_SYNTHETIC_DELAY_ACTIVATE("gpu.AsyncTexImage");
|
|
|
| DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_);
|
| DCHECK_EQ(0, tex_params.level);
|
| @@ -348,7 +355,7 @@ class TransferStateInternal
|
| DoTexSubImage2D(tex_params, data);
|
| }
|
| WaitForLastUpload();
|
| - MarkAsCompleted();
|
| + MarkAsCompleted(pending_uploads);
|
|
|
| DCHECK(CHECK_GL());
|
| if (texture_upload_stats.get()) {
|
| @@ -520,6 +527,7 @@ void AsyncPixelTransferDelegateEGL::AsyncTexImage2D(
|
| state_->bind_callback_ = bind_callback;
|
|
|
| // Mark the transfer in progress.
|
| + base::AtomicRefCountInc(&shared_state_->pending_uploads);
|
| state_->MarkAsTransferIsInProgress();
|
|
|
| // Duplicate the shared memory so there is no way we can get
|
| @@ -533,7 +541,8 @@ void AsyncPixelTransferDelegateEGL::AsyncTexImage2D(
|
| base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(),
|
| mem_params.shared_memory,
|
| mem_params.shm_size)),
|
| - shared_state_->texture_upload_stats));
|
| + shared_state_->texture_upload_stats,
|
| + &shared_state_->pending_uploads));
|
|
|
| DCHECK(CHECK_GL());
|
| }
|
| @@ -554,6 +563,7 @@ void AsyncPixelTransferDelegateEGL::AsyncTexSubImage2D(
|
| DCHECK_EQ(tex_params.level, 0);
|
|
|
| // Mark the transfer in progress.
|
| + base::AtomicRefCountInc(&shared_state_->pending_uploads);
|
| state_->MarkAsTransferIsInProgress();
|
|
|
| // If this wasn't async allocated, we don't have an EGLImage yet.
|
| @@ -571,7 +581,8 @@ void AsyncPixelTransferDelegateEGL::AsyncTexSubImage2D(
|
| base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(),
|
| mem_params.shared_memory,
|
| mem_params.shm_size)),
|
| - shared_state_->texture_upload_stats));
|
| + shared_state_->texture_upload_stats,
|
| + &shared_state_->pending_uploads));
|
|
|
| DCHECK(CHECK_GL());
|
| }
|
| @@ -690,7 +701,8 @@ bool AsyncPixelTransferDelegateEGL::WorkAroundAsyncTexSubImage2D(
|
|
|
| AsyncPixelTransferManagerEGL::SharedState::SharedState()
|
| // TODO(reveman): Skip this if --enable-gpu-benchmarking is not present.
|
| - : texture_upload_stats(new AsyncPixelTransferUploadStats) {
|
| + : texture_upload_stats(new AsyncPixelTransferUploadStats),
|
| + pending_uploads(0) {
|
| std::string vendor;
|
| vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR));
|
| is_imagination = vendor.find("Imagination") != std::string::npos;
|
|
|