Index: ui/gl/async_pixel_transfer_delegate_android.cc |
diff --git a/ui/gl/async_pixel_transfer_delegate_android.cc b/ui/gl/async_pixel_transfer_delegate_android.cc |
index 68c329f162ab4df9febe1f351f73ba2e492a8f55..7997926587a68c6d6cc160c07281c3b3798b4e2e 100644 |
--- a/ui/gl/async_pixel_transfer_delegate_android.cc |
+++ b/ui/gl/async_pixel_transfer_delegate_android.cc |
@@ -133,8 +133,7 @@ base::MessageLoopProxy* transfer_message_loop_proxy() { |
// Class which holds async pixel transfers state (EGLImage). |
// The EGLImage is accessed by either thread, but everything |
// else accessed only on the main thread. |
-class TransferStateInternal |
- : public base::RefCountedThreadSafe<TransferStateInternal> { |
+class TransferStateInternal : public base::RefCounted<TransferStateInternal> { |
public: |
explicit TransferStateInternal(GLuint texture_id, |
bool wait_for_uploads, |
@@ -234,7 +233,7 @@ class TransferStateInternal |
} |
protected: |
- friend class base::RefCountedThreadSafe<TransferStateInternal>; |
+ friend class base::RefCounted<TransferStateInternal>; |
friend class AsyncPixelTransferDelegateAndroid; |
static void DeleteTexture(GLuint id) { |
@@ -313,7 +312,8 @@ class AsyncPixelTransferDelegateAndroid |
// implement AsyncPixelTransferDelegate: |
virtual void AsyncNotifyCompletion( |
- const base::Closure& task) OVERRIDE; |
+ const AsyncMemoryParams& mem_params, |
+ const CompletionCallback& callback) OVERRIDE; |
virtual void AsyncTexImage2D( |
AsyncPixelTransferState* state, |
const AsyncTexImage2DParams& tex_params, |
@@ -343,6 +343,12 @@ class AsyncPixelTransferDelegateAndroid |
AsyncTexSubImage2DParams tex_params, |
base::SharedMemory* shared_memory, |
uint32 shared_memory_data_offset); |
+ static void PerformNotifyCompletion( |
+ base::SharedMemory* shared_memory, |
+ uint32 shared_memory_size, |
+ uint32 shared_memory_data_offset, |
+ uint32 shared_memory_data_size, |
+ const CompletionCallback& callback); |
// Returns true if a work-around was used. |
bool WorkAroundAsyncTexImage2D( |
@@ -422,19 +428,23 @@ AsyncPixelTransferState* |
wait_for_egl_images)); |
} |
-namespace { |
-// Dummy function to measure completion on |
-// the upload thread. |
-void NoOp() {} |
-} // namespace |
- |
void AsyncPixelTransferDelegateAndroid::AsyncNotifyCompletion( |
- const base::Closure& task) { |
- // Post a no-op task to the upload thread followed |
- // by a reply to the callback. The reply will then occur after |
- // all async transfers are complete. |
- transfer_message_loop_proxy()->PostTaskAndReply(FROM_HERE, |
- base::Bind(&NoOp), task); |
+ const AsyncMemoryParams& mem_params, |
+ const CompletionCallback& callback) { |
+ DCHECK(mem_params.shared_memory); |
+ DCHECK_LE(mem_params.shm_data_offset + mem_params.shm_data_size, |
+ mem_params.shm_size); |
+ // Post a PerformNotifyCompletion task to the upload thread. This task |
+ // will run after all async transfers are complete. |
+ transfer_message_loop_proxy()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&AsyncPixelTransferDelegateAndroid::PerformNotifyCompletion, |
+ base::Owned(DuplicateSharedMemory(mem_params.shared_memory, |
+ mem_params.shm_size)), |
+ mem_params.shm_size, |
+ mem_params.shm_data_offset, |
+ mem_params.shm_data_size, |
+ callback)); |
} |
void AsyncPixelTransferDelegateAndroid::AsyncTexImage2D( |
@@ -660,6 +670,20 @@ void AsyncPixelTransferDelegateAndroid::PerformAsyncTexSubImage2D( |
state->last_transfer_time_ = base::TimeTicks::HighResNow() - begin_time; |
} |
+void AsyncPixelTransferDelegateAndroid::PerformNotifyCompletion( |
+ base::SharedMemory* shared_memory, |
+ uint32 shared_memory_size, |
+ uint32 shared_memory_data_offset, |
+ uint32 shared_memory_data_size, |
+ const CompletionCallback& callback) { |
+ TRACE_EVENT0("gpu", "PerformNotifyCompletion"); |
+ gfx::AsyncMemoryParams mem_params; |
+ mem_params.shared_memory = shared_memory; |
+ mem_params.shm_size = shared_memory_size; |
+ mem_params.shm_data_offset = shared_memory_data_offset; |
+ mem_params.shm_data_size = shared_memory_data_size; |
+ callback.Run(mem_params); |
+} |
namespace { |
bool IsPowerOfTwo (unsigned int x) { |