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; |