test_web_graphics_context_3d.h revision f2477e01787aa58f445919b809d89e252beef54f
1// Copyright 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 CC_TEST_TEST_WEB_GRAPHICS_CONTEXT_3D_H_
6#define CC_TEST_TEST_WEB_GRAPHICS_CONTEXT_3D_H_
7
8#include <vector>
9
10#include "base/compiler_specific.h"
11#include "base/containers/hash_tables.h"
12#include "base/containers/scoped_ptr_hash_map.h"
13#include "base/memory/ref_counted.h"
14#include "base/memory/scoped_ptr.h"
15#include "base/memory/weak_ptr.h"
16#include "base/stl_util.h"
17#include "base/synchronization/lock.h"
18#include "cc/output/context_provider.h"
19#include "cc/test/fake_web_graphics_context_3d.h"
20#include "cc/test/ordered_texture_map.h"
21#include "cc/test/test_texture.h"
22#include "third_party/khronos/GLES2/gl2.h"
23#include "ui/gfx/rect.h"
24
25namespace cc {
26class TestContextSupport;
27
28class TestWebGraphicsContext3D : public FakeWebGraphicsContext3D {
29 public:
30  static scoped_ptr<TestWebGraphicsContext3D> Create();
31
32  virtual ~TestWebGraphicsContext3D();
33
34  virtual bool makeContextCurrent();
35
36  virtual void reshapeWithScaleFactor(
37      int width, int height, float scale_factor);
38
39  virtual bool isContextLost();
40
41  virtual void attachShader(blink::WebGLId program, blink::WebGLId shader);
42  virtual void bindFramebuffer(
43      blink::WGC3Denum target, blink::WebGLId framebuffer);
44  virtual void bindRenderbuffer(
45      blink::WGC3Denum target, blink::WebGLId renderbuffer);
46  virtual void bindTexture(
47      blink::WGC3Denum target,
48      blink::WebGLId texture_id);
49
50  virtual void texParameteri(blink::WGC3Denum target,
51                             blink::WGC3Denum pname,
52                             blink::WGC3Dint param);
53  virtual void getTexParameteriv(blink::WGC3Denum target,
54                                 blink::WGC3Denum pname,
55                                 blink::WGC3Dint* value);
56
57  virtual blink::WGC3Denum checkFramebufferStatus(blink::WGC3Denum target);
58
59  virtual Attributes getContextAttributes();
60
61  virtual blink::WebString getString(blink::WGC3Denum name);
62  virtual blink::WGC3Dint getUniformLocation(
63      blink::WebGLId program,
64      const blink::WGC3Dchar* name);
65  virtual blink::WGC3Dsizeiptr getVertexAttribOffset(
66      blink::WGC3Duint index,
67      blink::WGC3Denum pname);
68
69  virtual blink::WGC3Dboolean isBuffer(blink::WebGLId buffer);
70  virtual blink::WGC3Dboolean isEnabled(blink::WGC3Denum cap);
71  virtual blink::WGC3Dboolean isFramebuffer(blink::WebGLId framebuffer);
72  virtual blink::WGC3Dboolean isProgram(blink::WebGLId program);
73  virtual blink::WGC3Dboolean isRenderbuffer(blink::WebGLId renderbuffer);
74  virtual blink::WGC3Dboolean isShader(blink::WebGLId shader);
75  virtual blink::WGC3Dboolean isTexture(blink::WebGLId texture);
76
77  virtual void useProgram(blink::WebGLId program);
78
79  virtual void genBuffers(blink::WGC3Dsizei count, blink::WebGLId* ids);
80  virtual void genFramebuffers(blink::WGC3Dsizei count, blink::WebGLId* ids);
81  virtual void genRenderbuffers(blink::WGC3Dsizei count, blink::WebGLId* ids);
82  virtual void genTextures(blink::WGC3Dsizei count, blink::WebGLId* ids);
83
84  virtual void deleteBuffers(blink::WGC3Dsizei count, blink::WebGLId* ids);
85  virtual void deleteFramebuffers(
86      blink::WGC3Dsizei count, blink::WebGLId* ids);
87  virtual void deleteRenderbuffers(
88      blink::WGC3Dsizei count, blink::WebGLId* ids);
89  virtual void deleteTextures(blink::WGC3Dsizei count, blink::WebGLId* ids);
90
91  virtual blink::WebGLId createBuffer();
92  virtual blink::WebGLId createFramebuffer();
93  virtual blink::WebGLId createRenderbuffer();
94  virtual blink::WebGLId createTexture();
95
96  virtual void deleteBuffer(blink::WebGLId id);
97  virtual void deleteFramebuffer(blink::WebGLId id);
98  virtual void deleteRenderbuffer(blink::WebGLId id);
99  virtual void deleteTexture(blink::WebGLId id);
100
101  virtual blink::WebGLId createProgram();
102  virtual blink::WebGLId createShader(blink::WGC3Denum);
103  virtual blink::WebGLId createExternalTexture();
104
105  virtual void deleteProgram(blink::WebGLId id);
106  virtual void deleteShader(blink::WebGLId id);
107
108  virtual void endQueryEXT(blink::WGC3Denum target);
109  virtual void getQueryObjectuivEXT(
110      blink::WebGLId query,
111      blink::WGC3Denum pname,
112      blink::WGC3Duint* params);
113
114  virtual void getIntegerv(
115      blink::WGC3Denum pname,
116      blink::WGC3Dint* value);
117
118  virtual void genMailboxCHROMIUM(blink::WGC3Dbyte* mailbox);
119  virtual void produceTextureCHROMIUM(blink::WGC3Denum target,
120                                      const blink::WGC3Dbyte* mailbox) { }
121  virtual void consumeTextureCHROMIUM(blink::WGC3Denum target,
122                                      const blink::WGC3Dbyte* mailbox) { }
123
124  virtual void setContextLostCallback(
125      WebGraphicsContextLostCallback* callback);
126
127  virtual void loseContextCHROMIUM(blink::WGC3Denum current,
128                                   blink::WGC3Denum other);
129
130  virtual void setSwapBuffersCompleteCallbackCHROMIUM(
131      WebGraphicsSwapBuffersCompleteCallbackCHROMIUM* callback);
132
133  virtual void prepareTexture();
134  virtual void postSubBufferCHROMIUM(int x, int y, int width, int height);
135  virtual void finish();
136  virtual void flush();
137
138  virtual void bindBuffer(blink::WGC3Denum target, blink::WebGLId buffer);
139  virtual void bufferData(blink::WGC3Denum target,
140                          blink::WGC3Dsizeiptr size,
141                          const void* data,
142                          blink::WGC3Denum usage);
143  virtual void* mapBufferCHROMIUM(blink::WGC3Denum target,
144                                  blink::WGC3Denum access);
145  virtual blink::WGC3Dboolean unmapBufferCHROMIUM(blink::WGC3Denum target);
146
147  virtual blink::WGC3Duint createImageCHROMIUM(
148      blink::WGC3Dsizei width,
149      blink::WGC3Dsizei height,
150      blink::WGC3Denum internalformat);
151  virtual void destroyImageCHROMIUM(blink::WGC3Duint image_id);
152  virtual void getImageParameterivCHROMIUM(
153      blink::WGC3Duint image_id,
154      blink::WGC3Denum pname,
155      blink::WGC3Dint* params);
156  virtual void* mapImageCHROMIUM(
157      blink::WGC3Duint image_id,
158      blink::WGC3Denum access);
159  virtual void unmapImageCHROMIUM(blink::WGC3Duint image_id);
160
161  const ContextProvider::Capabilities& test_capabilities() const {
162    return test_capabilities_;
163  }
164
165  // When set, MakeCurrent() will fail after this many times.
166  void set_times_make_current_succeeds(int times) {
167    times_make_current_succeeds_ = times;
168  }
169  void set_times_bind_texture_succeeds(int times) {
170    times_bind_texture_succeeds_ = times;
171  }
172  void set_times_end_query_succeeds(int times) {
173    times_end_query_succeeds_ = times;
174  }
175  void set_times_gen_mailbox_succeeds(int times) {
176    times_gen_mailbox_succeeds_ = times;
177  }
178
179  // When set, mapImageCHROMIUM and mapBufferCHROMIUM will return NULL after
180  // this many times.
181  void set_times_map_image_chromium_succeeds(int times) {
182    times_map_image_chromium_succeeds_ = times;
183  }
184  void set_times_map_buffer_chromium_succeeds(int times) {
185    times_map_buffer_chromium_succeeds_ = times;
186  }
187
188  size_t NumTextures() const;
189  blink::WebGLId TextureAt(int i) const;
190
191  size_t NumUsedTextures() const { return used_textures_.size(); }
192  bool UsedTexture(int texture) const {
193    return ContainsKey(used_textures_, texture);
194  }
195  void ResetUsedTextures() { used_textures_.clear(); }
196
197  void set_support_swapbuffers_complete_callback(bool support) {
198    test_capabilities_.swapbuffers_complete_callback = support;
199  }
200  void set_have_extension_io_surface(bool have) {
201    test_capabilities_.iosurface = have;
202    test_capabilities_.texture_rectangle = have;
203  }
204  void set_have_extension_egl_image(bool have) {
205    test_capabilities_.egl_image_external = have;
206  }
207  void set_have_post_sub_buffer(bool have) {
208    test_capabilities_.post_sub_buffer = have;
209  }
210  void set_have_discard_framebuffer(bool have) {
211    test_capabilities_.discard_framebuffer = have;
212  }
213  void set_support_compressed_texture_etc1(bool support) {
214    test_capabilities_.texture_format_etc1 = support;
215  }
216  void set_support_texture_storage(bool support) {
217    test_capabilities_.texture_storage = support;
218  }
219
220  // When this context is lost, all contexts in its share group are also lost.
221  void add_share_group_context(blink::WebGraphicsContext3D* context3d) {
222    shared_contexts_.push_back(context3d);
223  }
224
225  void set_max_texture_size(int size) { max_texture_size_ = size; }
226
227  static const blink::WebGLId kExternalTextureId;
228  virtual blink::WebGLId NextTextureId();
229  virtual void RetireTextureId(blink::WebGLId id);
230
231  virtual blink::WebGLId NextBufferId();
232  virtual void RetireBufferId(blink::WebGLId id);
233
234  virtual blink::WebGLId NextImageId();
235  virtual void RetireImageId(blink::WebGLId id);
236
237  size_t GetTransferBufferMemoryUsedBytes() const;
238  void SetMaxTransferBufferUsageBytes(size_t max_transfer_buffer_usage_bytes);
239  size_t GetPeakTransferBufferMemoryUsedBytes() const {
240    return peak_transfer_buffer_memory_used_bytes_;
241  }
242
243  void set_test_support(TestContextSupport* test_support) {
244    test_support_ = test_support;
245  }
246
247  int width() const { return width_; }
248  int height() const { return height_; }
249  bool reshape_called() const { return reshape_called_; }
250  void clear_reshape_called() { reshape_called_ = false; }
251  float scale_factor() const { return scale_factor_; }
252
253  enum UpdateType {
254    NoUpdate = 0,
255    PrepareTexture,
256    PostSubBuffer
257  };
258
259  gfx::Rect update_rect() const { return update_rect_; }
260
261  UpdateType last_update_type() {
262    return last_update_type_;
263  }
264
265 protected:
266  struct TextureTargets {
267    TextureTargets();
268    ~TextureTargets();
269
270    void BindTexture(blink::WGC3Denum target, blink::WebGLId id);
271    void UnbindTexture(blink::WebGLId id);
272
273    blink::WebGLId BoundTexture(blink::WGC3Denum target);
274
275   private:
276    typedef base::hash_map<blink::WGC3Denum, blink::WebGLId> TargetTextureMap;
277    TargetTextureMap bound_textures_;
278  };
279
280  struct Buffer {
281    Buffer();
282    ~Buffer();
283
284    blink::WGC3Denum target;
285    scoped_ptr<uint8[]> pixels;
286    size_t size;
287
288   private:
289    DISALLOW_COPY_AND_ASSIGN(Buffer);
290  };
291
292  struct Image {
293    Image();
294    ~Image();
295
296    scoped_ptr<uint8[]> pixels;
297
298   private:
299    DISALLOW_COPY_AND_ASSIGN(Image);
300  };
301
302  struct Namespace : public base::RefCountedThreadSafe<Namespace> {
303    Namespace();
304
305    // Protects all fields.
306    base::Lock lock;
307    unsigned next_buffer_id;
308    unsigned next_image_id;
309    unsigned next_texture_id;
310    base::ScopedPtrHashMap<unsigned, Buffer> buffers;
311    base::ScopedPtrHashMap<unsigned, Image> images;
312    OrderedTextureMap textures;
313
314   private:
315    friend class base::RefCountedThreadSafe<Namespace>;
316    ~Namespace();
317    DISALLOW_COPY_AND_ASSIGN(Namespace);
318  };
319
320  TestWebGraphicsContext3D();
321
322  void CallAllSyncPointCallbacks();
323  void SwapBuffersComplete();
324  void CreateNamespace();
325  blink::WebGLId BoundTextureId(blink::WGC3Denum target);
326  scoped_refptr<TestTexture> BoundTexture(blink::WGC3Denum target);
327  void CheckTextureIsBound(blink::WGC3Denum target);
328
329  unsigned context_id_;
330  Attributes attributes_;
331  ContextProvider::Capabilities test_capabilities_;
332  int times_make_current_succeeds_;
333  int times_bind_texture_succeeds_;
334  int times_end_query_succeeds_;
335  int times_gen_mailbox_succeeds_;
336  bool context_lost_;
337  int times_map_image_chromium_succeeds_;
338  int times_map_buffer_chromium_succeeds_;
339  WebGraphicsContextLostCallback* context_lost_callback_;
340  WebGraphicsSwapBuffersCompleteCallbackCHROMIUM* swap_buffers_callback_;
341  base::hash_set<unsigned> used_textures_;
342  unsigned next_program_id_;
343  base::hash_set<unsigned> program_set_;
344  unsigned next_shader_id_;
345  base::hash_set<unsigned> shader_set_;
346  std::vector<blink::WebGraphicsContext3D*> shared_contexts_;
347  int max_texture_size_;
348  bool reshape_called_;
349  int width_;
350  int height_;
351  float scale_factor_;
352  TestContextSupport* test_support_;
353  gfx::Rect update_rect_;
354  UpdateType last_update_type_;
355
356  unsigned bound_buffer_;
357  TextureTargets texture_targets_;
358
359  size_t peak_transfer_buffer_memory_used_bytes_;
360
361  scoped_refptr<Namespace> namespace_;
362  static Namespace* shared_namespace_;
363
364  base::WeakPtrFactory<TestWebGraphicsContext3D> weak_ptr_factory_;
365};
366
367}  // namespace cc
368
369#endif  // CC_TEST_TEST_WEB_GRAPHICS_CONTEXT_3D_H_
370