12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_TEST_TEST_WEB_GRAPHICS_CONTEXT_3D_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_TEST_TEST_WEB_GRAPHICS_CONTEXT_3D_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/ref_counted.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
14b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/memory/weak_ptr.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/synchronization/lock.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/base/scoped_ptr_hash_map.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/fake_web_graphics_context_3d.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace WebKit { struct WebGraphicsMemoryAllocation; }
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestWebGraphicsContext3D : public FakeWebGraphicsContext3D {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<TestWebGraphicsContext3D> Create() {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return make_scoped_ptr(new TestWebGraphicsContext3D());
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<TestWebGraphicsContext3D> Create(
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const WebKit::WebGraphicsContext3D::Attributes& attributes) {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return make_scoped_ptr(new TestWebGraphicsContext3D(attributes));
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestWebGraphicsContext3D();
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool makeContextCurrent();
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int width();
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int height();
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void reshapeWithScaleFactor(
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      int width, int height, float scale_factor);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool isContextLost();
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WGC3Denum getGraphicsResetStatusARB();
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void attachShader(WebKit::WebGLId program, WebKit::WebGLId shader);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void bindFramebuffer(
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WGC3Denum target, WebKit::WebGLId framebuffer);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void bindRenderbuffer(
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WGC3Denum target, WebKit::WebGLId renderbuffer);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void bindTexture(
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WGC3Denum target,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WebGLId texture_id);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WGC3Denum checkFramebufferStatus(WebKit::WGC3Denum target);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Attributes getContextAttributes();
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WebString getString(WebKit::WGC3Denum name);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WGC3Dint getUniformLocation(
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WebGLId program,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const WebKit::WGC3Dchar* name);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WGC3Dsizeiptr getVertexAttribOffset(
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WGC3Duint index,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WGC3Denum pname);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WGC3Dboolean isBuffer(WebKit::WebGLId buffer);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WGC3Dboolean isEnabled(WebKit::WGC3Denum cap);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WGC3Dboolean isFramebuffer(WebKit::WebGLId framebuffer);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WGC3Dboolean isProgram(WebKit::WebGLId program);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WGC3Dboolean isRenderbuffer(WebKit::WebGLId renderbuffer);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WGC3Dboolean isShader(WebKit::WebGLId shader);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WGC3Dboolean isTexture(WebKit::WebGLId texture);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void useProgram(WebKit::WebGLId program);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WebGLId createBuffer();
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WebGLId createFramebuffer();
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WebGLId createProgram();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WebGLId createRenderbuffer();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WebGLId createShader(WebKit::WGC3Denum);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WebGLId createTexture();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void deleteBuffer(WebKit::WebGLId id);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void deleteFramebuffer(WebKit::WebGLId id);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void deleteProgram(WebKit::WebGLId id);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void deleteRenderbuffer(WebKit::WebGLId id);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void deleteShader(WebKit::WebGLId id);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void deleteTexture(WebKit::WebGLId texture_id);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void endQueryEXT(WebKit::WGC3Denum target);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void getQueryObjectuivEXT(
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WebGLId query,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WGC3Denum pname,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WGC3Duint* params);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void getIntegerv(
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      WebKit::WGC3Denum pname,
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      WebKit::WGC3Dint* value);
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void genMailboxCHROMIUM(WebKit::WGC3Dbyte* mailbox);
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void produceTextureCHROMIUM(WebKit::WGC3Denum target,
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      const WebKit::WGC3Dbyte* mailbox) { }
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void consumeTextureCHROMIUM(WebKit::WGC3Denum target,
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      const WebKit::WGC3Dbyte* mailbox) { }
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void setContextLostCallback(
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebGraphicsContextLostCallback* callback);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void loseContextCHROMIUM(WebKit::WGC3Denum current,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   WebKit::WGC3Denum other);
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Takes ownership of the |callback|.
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void signalSyncPoint(unsigned sync_point,
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               WebGraphicsSyncPointCallback* callback);
117a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  virtual void signalQuery(WebKit::WebGLId query,
118a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                           WebGraphicsSyncPointCallback* callback);
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void setSwapBuffersCompleteCallbackCHROMIUM(
121b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      WebGraphicsSwapBuffersCompleteCallbackCHROMIUM* callback);
122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void setMemoryAllocationChangedCallbackCHROMIUM(
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      WebGraphicsMemoryAllocationChangedCallbackCHROMIUM* callback);
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void prepareTexture();
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void finish();
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void flush();
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void bindBuffer(WebKit::WGC3Denum target, WebKit::WebGLId buffer);
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void bufferData(WebKit::WGC3Denum target,
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          WebKit::WGC3Dsizeiptr size,
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          const void* data,
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          WebKit::WGC3Denum usage);
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void* mapBufferCHROMIUM(WebKit::WGC3Denum target,
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  WebKit::WGC3Denum access);
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual WebKit::WGC3Dboolean unmapBufferCHROMIUM(WebKit::WGC3Denum target);
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void bindTexImage2DCHROMIUM(WebKit::WGC3Denum target,
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      WebKit::WGC3Dint image_id);
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual WebKit::WGC3Duint createImageCHROMIUM(
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebKit::WGC3Dsizei width,
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebKit::WGC3Dsizei height,
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebKit::WGC3Denum internalformat);
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void destroyImageCHROMIUM(WebKit::WGC3Duint image_id);
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void getImageParameterivCHROMIUM(
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebKit::WGC3Duint image_id,
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebKit::WGC3Denum pname,
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebKit::WGC3Dint* params);
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void* mapImageCHROMIUM(
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebKit::WGC3Duint image_id,
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebKit::WGC3Denum access);
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void unmapImageCHROMIUM(WebKit::WGC3Duint image_id);
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When set, MakeCurrent() will fail after this many times.
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_times_make_current_succeeds(int times) {
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_make_current_succeeds_ = times;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_times_bind_texture_succeeds(int times) {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_bind_texture_succeeds_ = times;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_times_end_query_succeeds(int times) {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times_end_query_succeeds_ = times;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void set_times_gen_mailbox_succeeds(int times) {
1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    times_gen_mailbox_succeeds_ = times;
1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // When set, mapImageCHROMIUM and mapBufferCHROMIUM will return NULL after
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // this many times.
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void set_times_map_image_chromium_succeeds(int times) {
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    times_map_image_chromium_succeeds_ = times;
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void set_times_map_buffer_chromium_succeeds(int times) {
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    times_map_buffer_chromium_succeeds_ = times;
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t NumTextures() const;
1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  WebKit::WebGLId TextureAt(int i) const;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t NumUsedTextures() const { return used_textures_.size(); }
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool UsedTexture(int texture) const {
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ContainsKey(used_textures_, texture);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ResetUsedTextures() { used_textures_.clear(); }
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void set_support_swapbuffers_complete_callback(bool support) {
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    support_swapbuffers_complete_callback_ = support;
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_have_extension_io_surface(bool have) {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    have_extension_io_surface_ = have;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_have_extension_egl_image(bool have) {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    have_extension_egl_image_ = have;
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When this context is lost, all contexts in its share group are also lost.
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void add_share_group_context(WebKit::WebGraphicsContext3D* context3d) {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    shared_contexts_.push_back(context3d);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_max_texture_size(int size) { max_texture_size_ = size; }
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const WebKit::WebGLId kExternalTextureId;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WebGLId NextTextureId();
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual WebKit::WebGLId NextBufferId();
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual WebKit::WebGLId NextImageId();
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetMemoryAllocation(WebKit::WebGraphicsMemoryAllocation allocation);
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  struct Buffer {
2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Buffer();
2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ~Buffer();
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    WebKit::WGC3Denum target;
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scoped_ptr<uint8[]> pixels;
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   private:
2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DISALLOW_COPY_AND_ASSIGN(Buffer);
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  };
2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  struct Image {
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Image();
2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ~Image();
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scoped_ptr<uint8[]> pixels;
2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   private:
2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DISALLOW_COPY_AND_ASSIGN(Image);
2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  };
2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  struct Namespace : public base::RefCountedThreadSafe<Namespace> {
2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Namespace();
2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Protects all fields.
2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::Lock lock;
2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    unsigned next_buffer_id;
2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    unsigned next_image_id;
2427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    unsigned next_texture_id;
2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    std::vector<WebKit::WebGLId> textures;
2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ScopedPtrHashMap<unsigned, Buffer> buffers;
2457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ScopedPtrHashMap<unsigned, Image> images;
2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   private:
2487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    friend class base::RefCountedThreadSafe<Namespace>;
2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ~Namespace();
2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DISALLOW_COPY_AND_ASSIGN(Namespace);
2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  };
2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestWebGraphicsContext3D();
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestWebGraphicsContext3D(
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const WebKit::WebGraphicsContext3D::Attributes& attributes);
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CallAllSyncPointCallbacks();
258b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  void SwapBuffersComplete();
2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void CreateNamespace();
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned context_id_;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Attributes attributes_;
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool support_swapbuffers_complete_callback_;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool have_extension_io_surface_;
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool have_extension_egl_image_;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_make_current_succeeds_;
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_bind_texture_succeeds_;
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int times_end_query_succeeds_;
2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int times_gen_mailbox_succeeds_;
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool context_lost_;
2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int times_map_image_chromium_succeeds_;
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int times_map_buffer_chromium_succeeds_;
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebGraphicsContextLostCallback* context_lost_callback_;
274b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  WebGraphicsSwapBuffersCompleteCallbackCHROMIUM* swap_buffers_callback_;
275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  WebGraphicsMemoryAllocationChangedCallbackCHROMIUM*
276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      memory_allocation_changed_callback_;
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<WebGraphicsSyncPointCallback*> sync_point_callbacks_;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::hash_set<WebKit::WebGLId> used_textures_;
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<WebKit::WebGraphicsContext3D*> shared_contexts_;
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int max_texture_size_;
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int width_;
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int height_;
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  unsigned bound_buffer_;
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<Namespace> namespace_;
2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static Namespace* shared_namespace_;
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
289b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::WeakPtrFactory<TestWebGraphicsContext3D> weak_ptr_factory_;
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CC_TEST_TEST_WEB_GRAPHICS_CONTEXT_3D_H_
295