1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_DELEGATE_H_ 6#define GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_DELEGATE_H_ 7 8#include "base/basictypes.h" 9#include "base/callback.h" 10#include "base/memory/ref_counted.h" 11#include "base/memory/scoped_ptr.h" 12#include "base/synchronization/lock.h" 13#include "base/time/time.h" 14#include "gpu/gpu_export.h" 15#include "ui/gl/gl_bindings.h" 16 17namespace base { 18class SharedMemory; 19} 20 21namespace gpu { 22 23class ScopedSafeSharedMemory; 24 25struct AsyncTexImage2DParams { 26 GLenum target; 27 GLint level; 28 GLenum internal_format; 29 GLsizei width; 30 GLsizei height; 31 GLint border; 32 GLenum format; 33 GLenum type; 34}; 35 36struct AsyncTexSubImage2DParams { 37 GLenum target; 38 GLint level; 39 GLint xoffset; 40 GLint yoffset; 41 GLsizei width; 42 GLsizei height; 43 GLenum format; 44 GLenum type; 45}; 46 47struct AsyncMemoryParams { 48 base::SharedMemory* shared_memory; 49 uint32 shm_size; 50 uint32 shm_data_offset; 51 uint32 shm_data_size; 52}; 53 54class AsyncPixelTransferUploadStats 55 : public base::RefCountedThreadSafe<AsyncPixelTransferUploadStats> { 56 public: 57 AsyncPixelTransferUploadStats(); 58 59 void AddUpload(base::TimeDelta transfer_time); 60 int GetStats(base::TimeDelta* total_texture_upload_time); 61 62 private: 63 friend class base::RefCountedThreadSafe<AsyncPixelTransferUploadStats>; 64 65 ~AsyncPixelTransferUploadStats(); 66 67 int texture_upload_count_; 68 base::TimeDelta total_texture_upload_time_; 69 base::Lock lock_; 70 71 DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferUploadStats); 72}; 73 74class GPU_EXPORT AsyncPixelTransferDelegate { 75 public: 76 virtual ~AsyncPixelTransferDelegate(); 77 78 // The callback occurs on the caller thread, once the texture is 79 // safe/ready to be used. 80 virtual void AsyncTexImage2D( 81 const AsyncTexImage2DParams& tex_params, 82 const AsyncMemoryParams& mem_params, 83 const base::Closure& bind_callback) = 0; 84 85 virtual void AsyncTexSubImage2D( 86 const AsyncTexSubImage2DParams& tex_params, 87 const AsyncMemoryParams& mem_params) = 0; 88 89 // Returns true if there is a transfer in progress. 90 virtual bool TransferIsInProgress() = 0; 91 92 // Block until the specified transfer completes. 93 virtual void WaitForTransferCompletion() = 0; 94 95 // Gets the address of the data from shared memory. 96 static void* GetAddress(const AsyncMemoryParams& mem_params); 97 98 // Sometimes the |safe_shared_memory| is duplicate to prevent use after free. 99 static void* GetAddress(ScopedSafeSharedMemory* safe_shared_memory, 100 const AsyncMemoryParams& mem_params); 101 102 protected: 103 AsyncPixelTransferDelegate(); 104 105 private: 106 DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferDelegate); 107}; 108 109} // namespace gpu 110 111#endif // GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_DELEGATE_H_ 112 113