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)#include "cc/test/test_web_graphics_context_3d.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/lazy_instance.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WGC3Dboolean;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WGC3Dchar;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WGC3Denum;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WGC3Dint;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WGC3Dsizei;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WGC3Dsizeiptr;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WGC3Duint;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebGLId;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebGraphicsContext3D;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const WebGLId kFramebufferId = 1;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const WebGLId kProgramId = 2;
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const WebGLId kRenderbufferId = 3;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const WebGLId kShaderId = 4;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static unsigned s_context_id = 1;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const WebGLId TestWebGraphicsContext3D::kExternalTextureId = 1337;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic base::LazyInstance<base::Lock>::Leaky
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    g_shared_namespace_lock = LAZY_INSTANCE_INITIALIZER;
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestWebGraphicsContext3D::Namespace*
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    TestWebGraphicsContext3D::shared_namespace_ = NULL;
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestWebGraphicsContext3D::Namespace::Namespace()
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : next_buffer_id(1),
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      next_image_id(1),
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      next_texture_id(1) {
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestWebGraphicsContext3D::Namespace::~Namespace() {
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  g_shared_namespace_lock.Get().AssertAcquired();
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (shared_namespace_ == this)
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    shared_namespace_ = NULL;
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TestWebGraphicsContext3D::TestWebGraphicsContext3D()
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : FakeWebGraphicsContext3D(),
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context_id_(s_context_id++),
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      support_swapbuffers_complete_callback_(true),
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      have_extension_io_surface_(false),
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      have_extension_egl_image_(false),
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      times_make_current_succeeds_(-1),
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      times_bind_texture_succeeds_(-1),
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      times_end_query_succeeds_(-1),
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      times_gen_mailbox_succeeds_(-1),
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context_lost_(false),
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      times_map_image_chromium_succeeds_(-1),
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      times_map_buffer_chromium_succeeds_(-1),
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context_lost_callback_(NULL),
71b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      swap_buffers_callback_(NULL),
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      memory_allocation_changed_callback_(NULL),
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      max_texture_size_(1024),
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      width_(0),
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      height_(0),
76b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      bound_buffer_(0),
77b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      weak_ptr_factory_(this) {
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CreateNamespace();
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TestWebGraphicsContext3D::TestWebGraphicsContext3D(
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebGraphicsContext3D::Attributes& attributes)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : FakeWebGraphicsContext3D(),
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context_id_(s_context_id++),
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      attributes_(attributes),
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      support_swapbuffers_complete_callback_(true),
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      have_extension_io_surface_(false),
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      have_extension_egl_image_(false),
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      times_make_current_succeeds_(-1),
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      times_bind_texture_succeeds_(-1),
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      times_end_query_succeeds_(-1),
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      times_gen_mailbox_succeeds_(-1),
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context_lost_(false),
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      times_map_image_chromium_succeeds_(-1),
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      times_map_buffer_chromium_succeeds_(-1),
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context_lost_callback_(NULL),
97b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      swap_buffers_callback_(NULL),
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      memory_allocation_changed_callback_(NULL),
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      max_texture_size_(1024),
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      width_(0),
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      height_(0),
102b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      bound_buffer_(0),
103b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      weak_ptr_factory_(this) {
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CreateNamespace();
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TestWebGraphicsContext3D::CreateNamespace() {
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (attributes_.shareResources) {
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::AutoLock lock(g_shared_namespace_lock.Get());
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (shared_namespace_) {
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      namespace_ = shared_namespace_;
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    } else {
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      namespace_ = new Namespace;
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      shared_namespace_ = namespace_.get();
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    namespace_ = new Namespace;
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TestWebGraphicsContext3D::~TestWebGraphicsContext3D() {
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < sync_point_callbacks_.size(); ++i) {
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (sync_point_callbacks_[i] != NULL)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      delete sync_point_callbacks_[i];
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(g_shared_namespace_lock.Get());
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  namespace_ = NULL;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TestWebGraphicsContext3D::makeContextCurrent() {
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (times_make_current_succeeds_ >= 0) {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!times_make_current_succeeds_) {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          GL_INNOCENT_CONTEXT_RESET_ARB);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    --times_make_current_succeeds_;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !context_lost_;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int TestWebGraphicsContext3D::width() {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return width_;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int TestWebGraphicsContext3D::height() {
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return height_;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TestWebGraphicsContext3D::reshapeWithScaleFactor(
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int width, int height, float scale_factor) {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  width_ = width;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  height_ = height;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TestWebGraphicsContext3D::isContextLost() {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return context_lost_;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WGC3Denum TestWebGraphicsContext3D::getGraphicsResetStatusARB() {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return context_lost_ ? GL_UNKNOWN_CONTEXT_RESET_ARB : GL_NO_ERROR;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WGC3Denum TestWebGraphicsContext3D::checkFramebufferStatus(
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WGC3Denum target) {
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (context_lost_)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return GL_FRAMEBUFFER_UNDEFINED_OES;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GL_FRAMEBUFFER_COMPLETE;
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebGraphicsContext3D::Attributes
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestWebGraphicsContext3D::getContextAttributes() {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return attributes_;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKit::WebString TestWebGraphicsContext3D::getString(WGC3Denum name) {
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string string;
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (support_swapbuffers_complete_callback_)
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    string += "GL_CHROMIUM_swapbuffers_complete_callback";
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (name == GL_EXTENSIONS) {
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (have_extension_io_surface_)
183b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      string += " GL_CHROMIUM_iosurface GL_ARB_texture_rectangle";
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (have_extension_egl_image_)
185b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      string += " GL_OES_EGL_image_external";
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return WebKit::WebString::fromUTF8(string.c_str());
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WGC3Dint TestWebGraphicsContext3D::getUniformLocation(
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebGLId program,
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WGC3Dchar* name) {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 0;
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WGC3Dsizeiptr TestWebGraphicsContext3D::getVertexAttribOffset(
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WGC3Duint index,
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WGC3Denum pname) {
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 0;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WGC3Dboolean TestWebGraphicsContext3D::isBuffer(
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebGLId buffer) {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WGC3Dboolean TestWebGraphicsContext3D::isEnabled(
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WGC3Denum cap) {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WGC3Dboolean TestWebGraphicsContext3D::isFramebuffer(
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebGLId framebuffer) {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WGC3Dboolean TestWebGraphicsContext3D::isProgram(
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebGLId program) {
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WGC3Dboolean TestWebGraphicsContext3D::isRenderbuffer(
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebGLId renderbuffer) {
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WGC3Dboolean TestWebGraphicsContext3D::isShader(
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebGLId shader) {
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WGC3Dboolean TestWebGraphicsContext3D::isTexture(
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebGLId texture) {
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebGLId TestWebGraphicsContext3D::createBuffer() {
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NextBufferId();
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::deleteBuffer(WebGLId id) {
2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  unsigned context_id = id >> 17;
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  unsigned buffer_id = id & 0x1ffff;
2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(buffer_id && buffer_id < namespace_->next_buffer_id);
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_EQ(context_id, context_id_);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebGLId TestWebGraphicsContext3D::createFramebuffer() {
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return kFramebufferId | context_id_ << 16;
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::deleteFramebuffer(WebGLId id) {
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kFramebufferId | context_id_ << 16, id);
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebGLId TestWebGraphicsContext3D::createProgram() {
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return kProgramId | context_id_ << 16;
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::deleteProgram(WebGLId id) {
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kProgramId | context_id_ << 16, id);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebGLId TestWebGraphicsContext3D::createRenderbuffer() {
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return kRenderbufferId | context_id_ << 16;
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::deleteRenderbuffer(WebGLId id) {
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kRenderbufferId | context_id_ << 16, id);
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebGLId TestWebGraphicsContext3D::createShader(WGC3Denum) {
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return kShaderId | context_id_ << 16;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::deleteShader(WebGLId id) {
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kShaderId | context_id_ << 16, id);
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebGLId TestWebGraphicsContext3D::createTexture() {
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebGLId texture_id = NextTextureId();
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_NE(texture_id, kExternalTextureId);
2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  namespace_->textures.push_back(texture_id);
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return texture_id;
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::deleteTexture(WebGLId texture_id) {
2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::vector<WebKit::WebGLId>& textures = namespace_->textures;
2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(std::find(textures.begin(), textures.end(), texture_id) !=
2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch         textures.end());
2957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  textures.erase(std::find(textures.begin(), textures.end(), texture_id));
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::attachShader(WebGLId program, WebGLId shader) {
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kProgramId | context_id_ << 16, program);
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kShaderId | context_id_ << 16, shader);
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::useProgram(WebGLId program) {
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!program)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kProgramId | context_id_ << 16, program);
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::bindFramebuffer(
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WGC3Denum target, WebGLId framebuffer) {
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!framebuffer)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kFramebufferId | context_id_ << 16, framebuffer);
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::bindRenderbuffer(
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WGC3Denum target, WebGLId renderbuffer) {
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!renderbuffer)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kRenderbufferId | context_id_ << 16, renderbuffer);
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::bindTexture(
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WGC3Denum target, WebGLId texture_id) {
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (times_bind_texture_succeeds_ >= 0) {
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!times_bind_texture_succeeds_) {
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          GL_INNOCENT_CONTEXT_RESET_ARB);
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    --times_bind_texture_succeeds_;
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!texture_id)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (texture_id == kExternalTextureId)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::vector<WebKit::WebGLId>& textures = namespace_->textures;
3397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(std::find(textures.begin(), textures.end(), texture_id) !=
3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch         textures.end());
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  used_textures_.insert(texture_id);
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::endQueryEXT(WGC3Denum target) {
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (times_end_query_succeeds_ >= 0) {
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!times_end_query_succeeds_) {
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          GL_INNOCENT_CONTEXT_RESET_ARB);
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    --times_end_query_succeeds_;
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::getQueryObjectuivEXT(
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebGLId query,
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WGC3Denum pname,
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WGC3Duint* params) {
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the context is lost, behave as if result is available.
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (pname == GL_QUERY_RESULT_AVAILABLE_EXT)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *params = 1;
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestWebGraphicsContext3D::getIntegerv(
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WGC3Denum pname,
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WebKit::WGC3Dint* value) {
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (pname == GL_MAX_TEXTURE_SIZE)
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *value = max_texture_size_;
368a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  else if (pname == GL_ACTIVE_TEXTURE)
369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    *value = GL_TEXTURE0;
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestWebGraphicsContext3D::genMailboxCHROMIUM(WebKit::WGC3Dbyte* mailbox) {
3737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (times_gen_mailbox_succeeds_ >= 0) {
3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (!times_gen_mailbox_succeeds_) {
3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          GL_INNOCENT_CONTEXT_RESET_ARB);
3777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
3787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    --times_gen_mailbox_succeeds_;
3797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
3807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (context_lost_) {
3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    memset(mailbox, 0, 64);
3827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
3837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
3847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static char mailbox_name1 = '1';
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static char mailbox_name2 = '1';
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mailbox[0] = mailbox_name1;
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mailbox[1] = mailbox_name2;
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mailbox[2] = '\0';
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (++mailbox_name1 == 0) {
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mailbox_name1 = '1';
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++mailbox_name2;
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::setContextLostCallback(
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebGraphicsContextLostCallback* callback) {
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_lost_callback_ = callback;
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::loseContextCHROMIUM(WGC3Denum current,
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   WGC3Denum other) {
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (context_lost_)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_lost_ = true;
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (context_lost_callback_)
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context_lost_callback_->onContextLost();
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < shared_contexts_.size(); ++i)
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    shared_contexts_[i]->loseContextCHROMIUM(current, other);
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shared_contexts_.clear();
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestWebGraphicsContext3D::signalSyncPoint(
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    unsigned sync_point,
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WebGraphicsSyncPointCallback* callback) {
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_point_callbacks_.push_back(callback);
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
420a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid TestWebGraphicsContext3D::signalQuery(
421a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    WebKit::WebGLId query,
422a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    WebGraphicsSyncPointCallback* callback) {
423a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  sync_point_callbacks_.push_back(callback);
424a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
425a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
426b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void TestWebGraphicsContext3D::setSwapBuffersCompleteCallbackCHROMIUM(
427b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    WebGraphicsSwapBuffersCompleteCallbackCHROMIUM* callback) {
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (support_swapbuffers_complete_callback_)
429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    swap_buffers_callback_ = callback;
430b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
431b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestWebGraphicsContext3D::setMemoryAllocationChangedCallbackCHROMIUM(
433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    WebGraphicsMemoryAllocationChangedCallbackCHROMIUM* callback) {
434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  memory_allocation_changed_callback_ = callback;
435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestWebGraphicsContext3D::prepareTexture() {
438b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (swap_buffers_callback_) {
439b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
440b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        FROM_HERE, base::Bind(&TestWebGraphicsContext3D::SwapBuffersComplete,
441b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                              weak_ptr_factory_.GetWeakPtr()));
442b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallAllSyncPointCallbacks();
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestWebGraphicsContext3D::finish() {
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallAllSyncPointCallbacks();
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestWebGraphicsContext3D::flush() {
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallAllSyncPointCallbacks();
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void CallAndDestroy(
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WebKit::WebGraphicsContext3D::WebGraphicsSyncPointCallback* callback) {
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!callback)
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  callback->onSyncPointReached();
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  delete callback;
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestWebGraphicsContext3D::CallAllSyncPointCallbacks() {
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < sync_point_callbacks_.size(); ++i) {
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FROM_HERE,
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&CallAndDestroy,
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   sync_point_callbacks_[i]));
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sync_point_callbacks_.clear();
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
472b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void TestWebGraphicsContext3D::SwapBuffersComplete() {
473b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (swap_buffers_callback_)
474b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    swap_buffers_callback_->onSwapBuffersComplete();
475b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
476b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestWebGraphicsContext3D::bindBuffer(WebKit::WGC3Denum target,
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          WebKit::WebGLId buffer) {
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bound_buffer_ = buffer;
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!bound_buffer_)
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  unsigned context_id = buffer >> 17;
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  unsigned buffer_id = buffer & 0x1ffff;
4847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
4857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(buffer_id && buffer_id < namespace_->next_buffer_id);
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_EQ(context_id, context_id_);
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ScopedPtrHashMap<unsigned, Buffer>& buffers = namespace_->buffers;
4897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (buffers.count(bound_buffer_) == 0)
4907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    buffers.set(bound_buffer_, make_scoped_ptr(new Buffer).Pass());
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  buffers.get(bound_buffer_)->target = target;
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestWebGraphicsContext3D::bufferData(WebKit::WGC3Denum target,
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          WebKit::WGC3Dsizeiptr size,
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          const void* data,
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          WebKit::WGC3Denum usage) {
4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
5007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ScopedPtrHashMap<unsigned, Buffer>& buffers = namespace_->buffers;
5017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_GT(buffers.count(bound_buffer_), 0u);
5027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_EQ(target, buffers.get(bound_buffer_)->target);
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (context_lost_) {
5047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    buffers.get(bound_buffer_)->pixels.reset();
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
5077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  buffers.get(bound_buffer_)->pixels.reset(new uint8[size]);
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (data != NULL)
5097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    memcpy(buffers.get(bound_buffer_)->pixels.get(), data, size);
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void* TestWebGraphicsContext3D::mapBufferCHROMIUM(WebKit::WGC3Denum target,
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                  WebKit::WGC3Denum access) {
5147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
5157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ScopedPtrHashMap<unsigned, Buffer>& buffers = namespace_->buffers;
5167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_GT(buffers.count(bound_buffer_), 0u);
5177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_EQ(target, buffers.get(bound_buffer_)->target);
5187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (times_map_buffer_chromium_succeeds_ >= 0) {
5197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!times_map_buffer_chromium_succeeds_) {
5207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return NULL;
5217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
5227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    --times_map_buffer_chromium_succeeds_;
5237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
5247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return buffers.get(bound_buffer_)->pixels.get();
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WebKit::WGC3Dboolean TestWebGraphicsContext3D::unmapBufferCHROMIUM(
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WebKit::WGC3Denum target) {
5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
5307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ScopedPtrHashMap<unsigned, Buffer>& buffers = namespace_->buffers;
5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_GT(buffers.count(bound_buffer_), 0u);
5327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_EQ(target, buffers.get(bound_buffer_)->target);
5337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  buffers.get(bound_buffer_)->pixels.reset();
534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TestWebGraphicsContext3D::bindTexImage2DCHROMIUM(
538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    WebKit::WGC3Denum target,
539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    WebKit::WGC3Dint image_id) {
5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
5417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_GT(namespace_->images.count(image_id), 0u);
542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
543868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)WebKit::WGC3Duint TestWebGraphicsContext3D::createImageCHROMIUM(
545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebKit::WGC3Dsizei width, WebKit::WGC3Dsizei height,
546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebKit::WGC3Denum internalformat) {
547868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK_EQ(GL_RGBA8_OES, static_cast<int>(internalformat));
548868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebKit::WGC3Duint image_id = NextImageId();
5497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
5507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ScopedPtrHashMap<unsigned, Image>& images = namespace_->images;
5517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  images.set(image_id, make_scoped_ptr(new Image).Pass());
5527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  images.get(image_id)->pixels.reset(new uint8[width * height * 4]);
553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return image_id;
554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TestWebGraphicsContext3D::destroyImageCHROMIUM(
557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    WebKit::WGC3Duint id) {
5587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  unsigned context_id = id >> 17;
560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  unsigned image_id = id & 0x1ffff;
5617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(image_id && image_id < namespace_->next_image_id);
562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK_EQ(context_id, context_id_);
563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TestWebGraphicsContext3D::getImageParameterivCHROMIUM(
566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    WebKit::WGC3Duint image_id,
567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    WebKit::WGC3Denum pname,
568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    WebKit::WGC3Dint* params) {
5697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
5707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_GT(namespace_->images.count(image_id), 0u);
571868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK_EQ(GL_IMAGE_ROWBYTES_CHROMIUM, static_cast<int>(pname));
572868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  *params = 0;
573868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
574868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void* TestWebGraphicsContext3D::mapImageCHROMIUM(WebKit::WGC3Duint image_id,
576868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 WebKit::WGC3Denum access) {
5777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
5787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ScopedPtrHashMap<unsigned, Image>& images = namespace_->images;
5797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_GT(images.count(image_id), 0u);
5807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (times_map_image_chromium_succeeds_ >= 0) {
5817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!times_map_image_chromium_succeeds_) {
5827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return NULL;
5837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
5847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    --times_map_image_chromium_succeeds_;
5857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
5867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return images.get(image_id)->pixels.get();
587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TestWebGraphicsContext3D::unmapImageCHROMIUM(
590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    WebKit::WGC3Duint image_id) {
5917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
5927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_GT(namespace_->images.count(image_id), 0u);
5937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
5947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochsize_t TestWebGraphicsContext3D::NumTextures() const {
5967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
5977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return namespace_->textures.size();
5987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
5997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6007dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochWebKit::WebGLId TestWebGraphicsContext3D::TextureAt(int i) const {
6017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
6027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return namespace_->textures[i];
603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebGLId TestWebGraphicsContext3D::NextTextureId() {
6067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
6077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  WebGLId texture_id = namespace_->next_texture_id++;
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(texture_id < (1 << 16));
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  texture_id |= context_id_ << 16;
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return texture_id;
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WebGLId TestWebGraphicsContext3D::NextBufferId() {
6147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
6157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  WebGLId buffer_id = namespace_->next_buffer_id++;
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(buffer_id < (1 << 17));
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  buffer_id |= context_id_ << 17;
618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return buffer_id;
619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)WebKit::WGC3Duint TestWebGraphicsContext3D::NextImageId() {
6227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
6237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  WGC3Duint image_id = namespace_->next_image_id++;
624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(image_id < (1 << 17));
625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  image_id |= context_id_ << 17;
626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return image_id;
627868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TestWebGraphicsContext3D::SetMemoryAllocation(
630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    WebKit::WebGraphicsMemoryAllocation allocation) {
631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!memory_allocation_changed_callback_)
632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  memory_allocation_changed_callback_->onMemoryAllocationChanged(allocation);
634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TestWebGraphicsContext3D::Buffer::Buffer() : target(0) {}
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TestWebGraphicsContext3D::Buffer::~Buffer() {}
639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
640868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TestWebGraphicsContext3D::Image::Image() {}
641868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
642868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TestWebGraphicsContext3D::Image::~Image() {}
643868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
645