Index: gpu/command_buffer/client/gles2_implementation.h |
diff --git a/gpu/command_buffer/client/gles2_implementation.h b/gpu/command_buffer/client/gles2_implementation.h |
index 225a43a0951f6a88a36c92451f2b1af0c3e4b772..56a462db32e7a25d068bcf193b458649aa8ac66d 100644 |
--- a/gpu/command_buffer/client/gles2_implementation.h |
+++ b/gpu/command_buffer/client/gles2_implementation.h |
@@ -596,6 +596,38 @@ class GLES2_IMPL_EXPORT GLES2Implementation |
void OnSwapBuffersComplete(); |
+ // Remove the transfer buffer from the buffer tracker. For buffers used |
+ // asynchronously the memory is free:ed if the upload has completed. For |
+ // other buffers, the memory is either free:ed immediately or free:ed pending |
+ // a token. |
+ void RemoveTransferBuffer(BufferTracker::Buffer* buffer); |
+ |
+ // Returns true if the async upload token has passed. |
+ // |
+ // NOTE: This will detect wrapped async tokens by checking if the most |
+ // significant bit of async token to check is 1 but the last read is 0, i.e. |
+ // the uint32 wrapped. |
+ bool HasAsyncUploadTokenPassed(uint32 token) const { |
+ return async_upload_sync_->HasAsyncUploadTokenPassed(token); |
+ } |
+ |
+ // Get the next async upload token. |
+ uint32 NextAsyncUploadToken(); |
+ |
+ // Ensure that the shared memory used for synchronizing async upload tokens |
+ // has been mapped. |
+ // |
+ // Returns false on error, true on success. |
+ bool EnsureAsyncUploadSync(); |
+ |
+ // Checks the last read asynchronously upload token and frees any unmanaged |
+ // transfer buffer that has its async token passed. |
+ void PollAsyncUploads(); |
+ |
+ // Free every async upload buffer. If some async upload buffer is still in use |
+ // wait for them to finish before freeing. |
+ void FreeAllAsyncUploadBuffers(); |
+ |
bool GetBoundPixelTransferBuffer( |
GLenum target, const char* function_name, GLuint* buffer_id); |
BufferTracker::Buffer* GetBoundPixelUnpackTransferBufferIfValid( |
@@ -668,6 +700,18 @@ class GLES2_IMPL_EXPORT GLES2Implementation |
GLuint bound_pixel_pack_transfer_buffer_id_; |
GLuint bound_pixel_unpack_transfer_buffer_id_; |
+ // The current asynchronous pixel buffer upload token. |
+ uint32 async_upload_token_; |
+ |
+ // The shared memory used for synchronizing asynchronous upload tokens. |
+ AsyncUploadSync* async_upload_sync_; |
+ int32 async_upload_sync_shm_id_; |
+ unsigned int async_upload_sync_shm_offset_; |
+ |
+ // Unmanaged pixel transfer buffer memory pending asynchronous upload token. |
+ typedef std::list<std::pair<void*, uint32> > DetachedAsyncUploadMemoryList; |
+ DetachedAsyncUploadMemoryList detached_async_upload_memory_; |
+ |
// Client side management for vertex array objects. Needed to correctly |
// track client side arrays. |
scoped_ptr<VertexArrayObjectManager> vertex_array_object_manager_; |