// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_DELEGATE_H_ #define GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_DELEGATE_H_ #include "base/basictypes.h" #include "base/callback.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/synchronization/lock.h" #include "base/time/time.h" #include "gpu/command_buffer/common/buffer.h" #include "gpu/gpu_export.h" #include "ui/gl/gl_bindings.h" namespace base { class SharedMemory; } namespace gpu { struct AsyncTexImage2DParams { GLenum target; GLint level; GLenum internal_format; GLsizei width; GLsizei height; GLint border; GLenum format; GLenum type; }; struct AsyncTexSubImage2DParams { GLenum target; GLint level; GLint xoffset; GLint yoffset; GLsizei width; GLsizei height; GLenum format; GLenum type; }; class AsyncMemoryParams { public: AsyncMemoryParams(scoped_refptr buffer, uint32 data_offset, uint32 data_size); ~AsyncMemoryParams(); scoped_refptr buffer() const { return buffer_; } uint32 data_size() const { return data_size_; } uint32 data_offset() const { return data_offset_; } void* GetDataAddress() const { return buffer_->GetDataAddress(data_offset_, data_size_); } private: scoped_refptr buffer_; uint32 data_offset_; uint32 data_size_; }; class AsyncPixelTransferUploadStats : public base::RefCountedThreadSafe { public: AsyncPixelTransferUploadStats(); void AddUpload(base::TimeDelta transfer_time); int GetStats(base::TimeDelta* total_texture_upload_time); private: friend class base::RefCountedThreadSafe; ~AsyncPixelTransferUploadStats(); int texture_upload_count_; base::TimeDelta total_texture_upload_time_; base::Lock lock_; DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferUploadStats); }; class GPU_EXPORT AsyncPixelTransferDelegate { public: virtual ~AsyncPixelTransferDelegate(); // The callback occurs on the caller thread, once the texture is // safe/ready to be used. virtual void AsyncTexImage2D( const AsyncTexImage2DParams& tex_params, const AsyncMemoryParams& mem_params, const base::Closure& bind_callback) = 0; virtual void AsyncTexSubImage2D( const AsyncTexSubImage2DParams& tex_params, const AsyncMemoryParams& mem_params) = 0; // Returns true if there is a transfer in progress. virtual bool TransferIsInProgress() = 0; // Block until the specified transfer completes. virtual void WaitForTransferCompletion() = 0; protected: AsyncPixelTransferDelegate(); private: DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferDelegate); }; } // namespace gpu #endif // GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_DELEGATE_H_