1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_DELEGATE_H_ 6b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_DELEGATE_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/ref_counted.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/synchronization/lock.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 14b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "gpu/gpu_export.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_bindings.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SharedMemory; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)namespace gpu { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class ScopedSafeSharedMemory; 24a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct AsyncTexImage2DParams { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum target; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint level; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum internal_format; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLsizei width; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLsizei height; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint border; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum format; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum type; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct AsyncTexSubImage2DParams { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum target; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint level; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint xoffset; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint yoffset; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLsizei width; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLsizei height; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum format; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum type; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct AsyncMemoryParams { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SharedMemory* shared_memory; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 shm_size; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 shm_data_offset; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 shm_data_size; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class AsyncPixelTransferUploadStats 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : public base::RefCountedThreadSafe<AsyncPixelTransferUploadStats> { 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AsyncPixelTransferUploadStats(); 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void AddUpload(base::TimeDelta transfer_time); 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int GetStats(base::TimeDelta* total_texture_upload_time); 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) friend class base::RefCountedThreadSafe<AsyncPixelTransferUploadStats>; 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ~AsyncPixelTransferUploadStats(); 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int texture_upload_count_; 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::TimeDelta total_texture_upload_time_; 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Lock lock_; 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferUploadStats); 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 74b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class GPU_EXPORT AsyncPixelTransferDelegate { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~AsyncPixelTransferDelegate(); 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The callback occurs on the caller thread, once the texture is 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // safe/ready to be used. 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AsyncTexImage2D( 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AsyncTexImage2DParams& tex_params, 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AsyncMemoryParams& mem_params, 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& bind_callback) = 0; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AsyncTexSubImage2D( 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AsyncTexSubImage2DParams& tex_params, 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AsyncMemoryParams& mem_params) = 0; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Returns true if there is a transfer in progress. 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual bool TransferIsInProgress() = 0; 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Block until the specified transfer completes. 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void WaitForTransferCompletion() = 0; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Gets the address of the data from shared memory. 96a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) static void* GetAddress(const AsyncMemoryParams& mem_params); 97a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 98a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Sometimes the |safe_shared_memory| is duplicate to prevent use after free. 99a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) static void* GetAddress(ScopedSafeSharedMemory* safe_shared_memory, 100a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const AsyncMemoryParams& mem_params); 101a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsyncPixelTransferDelegate(); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferDelegate); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 109b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} // namespace gpu 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 111b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif // GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_DELEGATE_H_ 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 113