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..e79a2a5a0dd9fa7731fd0e2525fc305169fd1841 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" |
@@ -479,6 +480,26 @@ struct FenceCallback { |
scoped_ptr<gfx::GLFence> fence; |
}; |
+class AsyncUploadTokenCompletionObserver |
+ : public AsyncPixelTransferCompletionObserver { |
+ public: |
+ explicit AsyncUploadTokenCompletionObserver(uint32 async_upload_token) |
+ : async_upload_token_(async_upload_token) { |
+ } |
+ |
+ virtual void DidComplete(const AsyncMemoryParams& mem_params) OVERRIDE { |
+ void* data = static_cast<int8*>(mem_params.shared_memory->memory()) + |
+ mem_params.shm_data_offset; |
+ AsyncUploadSync* sync = static_cast<AsyncUploadSync*>(data); |
+ sync->SetAsyncUploadToken(async_upload_token_); |
+ } |
+ |
+ private: |
+ uint32 async_upload_token_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AsyncUploadTokenCompletionObserver); |
+}; |
+ |
// } // anonymous namespace. |
bool GLES2Decoder::GetServiceTextureId(uint32 client_texture_id, |
@@ -673,6 +694,13 @@ class GLES2DecoderImpl : public GLES2Decoder, |
bool GenVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); |
void DeleteVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); |
+ // Helper for async upload token completion notification callback. |
+ base::Closure AsyncUploadTokenCompletionClosure(uint32 async_upload_token, |
+ uint32 sync_data_shm_id, |
+ uint32 sync_data_shm_offset); |
+ |
+ |
+ |
// Workarounds |
void OnFboChanged() const; |
void OnUseFramebuffer() const; |
@@ -10290,6 +10318,33 @@ bool GLES2DecoderImpl::ValidateAsyncTransfer( |
return true; |
} |
+base::Closure GLES2DecoderImpl::AsyncUploadTokenCompletionClosure( |
+ uint32 async_upload_token, |
+ uint32 sync_data_shm_id, |
+ uint32 sync_data_shm_offset) { |
+ AsyncMemoryParams mem_params; |
+ gpu::Buffer buffer = GetSharedMemoryBuffer(sync_data_shm_id); |
+ if (!buffer.shared_memory) |
+ return base::Closure(); |
+ mem_params.shared_memory = buffer.shared_memory; |
+ mem_params.shm_size = buffer.size; |
+ mem_params.shm_data_offset = sync_data_shm_offset; |
+ mem_params.shm_data_size = sizeof(AsyncUploadSync); |
+ |
+ if (mem_params.shm_data_offset + mem_params.shm_data_size > |
piman
2014/03/20 21:18:26
Beware of overflows. If shm_data_offset is UINT32_
|
+ mem_params.shm_size) |
+ return base::Closure(); |
+ |
+ scoped_refptr<AsyncUploadTokenCompletionObserver> observer( |
+ new AsyncUploadTokenCompletionObserver(async_upload_token)); |
+ |
+ return base::Bind( |
+ &AsyncPixelTransferManager::AsyncNotifyCompletion, |
+ base::Unretained(GetAsyncPixelTransferManager()), |
+ mem_params, |
+ observer); |
+} |
+ |
error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( |
uint32 immediate_data_size, const cmds::AsyncTexImage2DCHROMIUM& c) { |
TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM"); |
@@ -10306,6 +10361,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) { |
+ base::Closure completion_closure = |
+ AsyncUploadTokenCompletionClosure(async_upload_token, |
+ sync_data_shm_id, |
+ sync_data_shm_offset); |
+ if (completion_closure.is_null()) |
+ return error::kInvalidArguments; |
+ |
+ scoped_completion_callback.Reset(completion_closure); |
+ } |
// TODO(epenner): Move this and copies of this memory validation |
// into ValidateTexImage2D step. |
@@ -10400,6 +10470,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) { |
+ base::Closure completion_closure = |
+ AsyncUploadTokenCompletionClosure(async_upload_token, |
+ sync_data_shm_id, |
+ sync_data_shm_offset); |
+ if (completion_closure.is_null()) |
+ return error::kInvalidArguments; |
+ |
+ scoped_completion_callback.Reset(completion_closure); |
+ } |
// TODO(epenner): Move this and copies of this memory validation |
// into ValidateTexSubImage2D step. |
@@ -10510,6 +10595,15 @@ error::Error GLES2DecoderImpl::HandleWaitAsyncTexImage2DCHROMIUM( |
return error::kNoError; |
} |
+error::Error GLES2DecoderImpl::HandleWaitAllAsyncTexImage2DCHROMIUM( |
+ uint32 immediate_data_size, const cmds::WaitAllAsyncTexImage2DCHROMIUM& c) { |
+ TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleWaitAsyncTexImage2DCHROMIUM"); |
+ |
+ GetAsyncPixelTransferManager()->WaitAllAsyncTexImage2D(); |
+ ProcessFinishedAsyncTransfers(); |
+ return error::kNoError; |
+} |
+ |
void GLES2DecoderImpl::OnTextureRefDetachedFromFramebuffer( |
TextureRef* texture_ref) { |
Texture* texture = texture_ref->texture(); |