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