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