Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
index f913c4883d5ebdb892dd908c2d97842b026ba4fc..aeaad45ca608785ef6bcebd631aa07b0b56d20b1 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -15,6 +15,7 @@ |
#include "base/at_exit.h" |
#include "base/bind.h" |
+#include "base/callback_helpers.h" |
#include "base/command_line.h" |
#include "base/debug/trace_event.h" |
#include "base/debug/trace_event_synthetic_delay.h" |
@@ -10290,6 +10291,13 @@ bool GLES2DecoderImpl::ValidateAsyncTransfer( |
return true; |
} |
+namespace { |
+void UpdateAsyncUploadToken(AsyncUploadSync* sync, uint32 async_upload_token) { |
+ base::subtle::MemoryBarrier(); |
epennerAtGoogle
2014/02/07 20:43:58
See my other comment on MemoryBarriers. Wouldn't h
|
+ sync->async_token = async_upload_token; |
+} |
+} |
+ |
error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( |
uint32 immediate_data_size, const cmds::AsyncTexImage2DCHROMIUM& c) { |
TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM"); |
@@ -10306,6 +10314,21 @@ error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( |
uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id); |
uint32 pixels_shm_offset = static_cast<uint32>(c.pixels_shm_offset); |
uint32 pixels_size; |
+ uint32 async_upload_token = static_cast<uint32>(c.async_upload_token); |
+ uint32 sync_data_shm_id = static_cast<uint32>(c.sync_data_shm_id); |
+ uint32 sync_data_shm_offset = static_cast<uint32>(c.sync_data_shm_offset); |
+ |
+ base::ScopedClosureRunner scoped_completion_callback; |
+ if (async_upload_token) { |
+ AsyncUploadSync* sync = GetSharedMemoryAs<AsyncUploadSync*>( |
+ sync_data_shm_id, sync_data_shm_offset, sizeof(*sync)); |
piman
2014/02/07 22:58:20
The shared memory backing the AsyncUploadSync coul
jadahl
2014/02/08 09:18:25
As epenner replied elsewhere, SafeSharedMemoryPool
epennerAtGoogle
2014/02/10 23:12:06
Bug for reference counting SharedMemory:
https://c
|
+ scoped_completion_callback.Reset(base::Bind( |
+ &AsyncPixelTransferManager::AsyncRun, |
+ base::Unretained(GetAsyncPixelTransferManager()), |
+ base::Bind(&UpdateAsyncUploadToken, |
+ sync, |
+ async_upload_token))); |
+ } |
// TODO(epenner): Move this and copies of this memory validation |
// into ValidateTexImage2D step. |
@@ -10400,6 +10423,21 @@ error::Error GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM( |
GLsizei height = static_cast<GLsizei>(c.height); |
GLenum format = static_cast<GLenum>(c.format); |
GLenum type = static_cast<GLenum>(c.type); |
+ uint32 async_upload_token = static_cast<uint32>(c.async_upload_token); |
+ uint32 sync_data_shm_id = static_cast<uint32>(c.sync_data_shm_id); |
+ uint32 sync_data_shm_offset = static_cast<uint32>(c.sync_data_shm_offset); |
+ |
+ base::ScopedClosureRunner scoped_completion_callback; |
+ if (async_upload_token) { |
+ AsyncUploadSync* sync = GetSharedMemoryAs<AsyncUploadSync*>( |
+ sync_data_shm_id, sync_data_shm_offset, sizeof(*sync)); |
+ scoped_completion_callback.Reset(base::Bind( |
+ &AsyncPixelTransferManager::AsyncRun, |
+ base::Unretained(GetAsyncPixelTransferManager()), |
+ base::Bind(&UpdateAsyncUploadToken, |
+ sync, |
+ async_upload_token))); |
+ } |
// TODO(epenner): Move this and copies of this memory validation |
// into ValidateTexSubImage2D step. |