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 e6a127012b77764b94bdd4ce768adb34f8dba107..b0303e5b765a6ff95a9ee3c48af5879172c6af3b 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -15,10 +15,12 @@ |
#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" |
#include "base/memory/scoped_ptr.h" |
+#include "base/numerics/safe_math.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_split.h" |
#include "build/build_config.h" |
@@ -518,6 +520,29 @@ 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 { |
+ DCHECK(mem_params.buffer()); |
+ void* data = mem_params.GetDataAddress(); |
+ AsyncUploadSync* sync = static_cast<AsyncUploadSync*>(data); |
+ sync->SetAsyncUploadToken(async_upload_token_); |
+ } |
+ |
+ private: |
+ virtual ~AsyncUploadTokenCompletionObserver() { |
+ } |
+ |
+ uint32 async_upload_token_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AsyncUploadTokenCompletionObserver); |
+}; |
+ |
// } // anonymous namespace. |
bool GLES2Decoder::GetServiceTextureId(uint32 client_texture_id, |
@@ -713,6 +738,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; |
@@ -10329,6 +10361,29 @@ bool GLES2DecoderImpl::ValidateAsyncTransfer( |
return true; |
} |
+base::Closure GLES2DecoderImpl::AsyncUploadTokenCompletionClosure( |
+ uint32 async_upload_token, |
+ uint32 sync_data_shm_id, |
+ uint32 sync_data_shm_offset) { |
+ scoped_refptr<gpu::Buffer> buffer = GetSharedMemoryBuffer(sync_data_shm_id); |
+ if (!buffer || !buffer->GetDataAddress(sync_data_shm_offset, |
+ sizeof(AsyncUploadSync))) |
+ return base::Closure(); |
+ |
+ AsyncMemoryParams mem_params(buffer, |
+ sync_data_shm_offset, |
+ sizeof(AsyncUploadSync)); |
+ |
+ 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"); |
@@ -10345,6 +10400,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. |
@@ -10431,6 +10501,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. |
@@ -10533,6 +10618,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(); |