13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
50f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (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"
140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_context_support.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static const GLuint kFramebufferId = 1;
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static const GLuint kRenderbufferId = 2;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static unsigned s_context_id = 1;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const GLuint TestWebGraphicsContext3D::kExternalTextureId = 1337;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic base::LazyInstance<base::Lock>::Leaky
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    g_shared_namespace_lock = LAZY_INSTANCE_INITIALIZER;
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestWebGraphicsContext3D::Namespace*
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    TestWebGraphicsContext3D::shared_namespace_ = NULL;
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestWebGraphicsContext3D::Namespace::Namespace()
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : next_buffer_id(1),
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      next_image_id(1),
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      next_texture_id(1) {
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestWebGraphicsContext3D::Namespace::~Namespace() {
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  g_shared_namespace_lock.Get().AssertAcquired();
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (shared_namespace_ == this)
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    shared_namespace_ = NULL;
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// static
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_ptr<TestWebGraphicsContext3D> TestWebGraphicsContext3D::Create() {
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return make_scoped_ptr(new TestWebGraphicsContext3D());
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TestWebGraphicsContext3D::TestWebGraphicsContext3D()
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : context_id_(s_context_id++),
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      times_bind_texture_succeeds_(-1),
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      times_end_query_succeeds_(-1),
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context_lost_(false),
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      times_map_image_chromium_succeeds_(-1),
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      times_map_buffer_chromium_succeeds_(-1),
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      current_used_transfer_buffer_usage_bytes_(0),
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      max_used_transfer_buffer_usage_bytes_(0),
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      next_program_id_(1000),
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      next_shader_id_(2000),
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      max_texture_size_(2048),
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      reshape_called_(false),
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      width_(0),
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      height_(0),
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scale_factor_(-1.f),
678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      test_support_(NULL),
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      last_update_type_(NoUpdate),
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      next_insert_sync_point_(1),
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      last_waited_sync_point_(0),
71b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      bound_buffer_(0),
72b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      weak_ptr_factory_(this) {
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CreateNamespace();
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TestWebGraphicsContext3D::~TestWebGraphicsContext3D() {
778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::AutoLock lock(g_shared_namespace_lock.Get());
788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  namespace_ = NULL;
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TestWebGraphicsContext3D::CreateNamespace() {
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::AutoLock lock(g_shared_namespace_lock.Get());
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (shared_namespace_) {
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    namespace_ = shared_namespace_;
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    namespace_ = new Namespace;
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    shared_namespace_ = namespace_.get();
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TestWebGraphicsContext3D::reshapeWithScaleFactor(
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int width, int height, float scale_factor) {
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  reshape_called_ = true;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  width_ = width;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  height_ = height;
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scale_factor_ = scale_factor;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TestWebGraphicsContext3D::isContextLost() {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return context_lost_;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLenum TestWebGraphicsContext3D::checkFramebufferStatus(
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum target) {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (context_lost_)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return GL_FRAMEBUFFER_UNDEFINED_OES;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GL_FRAMEBUFFER_COMPLETE;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLint TestWebGraphicsContext3D::getUniformLocation(
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint program,
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GLchar* name) {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 0;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLsizeiptr TestWebGraphicsContext3D::getVertexAttribOffset(
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint index,
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum pname) {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 0;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLboolean TestWebGraphicsContext3D::isBuffer(
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint buffer) {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLboolean TestWebGraphicsContext3D::isEnabled(
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum cap) {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLboolean TestWebGraphicsContext3D::isFramebuffer(
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint framebuffer) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLboolean TestWebGraphicsContext3D::isProgram(
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint program) {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLboolean TestWebGraphicsContext3D::isRenderbuffer(
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint renderbuffer) {
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLboolean TestWebGraphicsContext3D::isShader(
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint shader) {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLboolean TestWebGraphicsContext3D::isTexture(
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint texture) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::genBuffers(GLsizei count, GLuint* ids) {
1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (int i = 0; i < count; ++i)
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ids[i] = NextBufferId();
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void TestWebGraphicsContext3D::genFramebuffers(
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLsizei count, GLuint* ids) {
1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (int i = 0; i < count; ++i)
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ids[i] = kFramebufferId | context_id_ << 16;
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void TestWebGraphicsContext3D::genRenderbuffers(
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLsizei count, GLuint* ids) {
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (int i = 0; i < count; ++i)
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ids[i] = kRenderbufferId | context_id_ << 16;
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::genTextures(GLsizei count, GLuint* ids) {
1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (int i = 0; i < count; ++i) {
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ids[i] = NextTextureId();
1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK_NE(ids[i], kExternalTextureId);
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (int i = 0; i < count; ++i)
1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    namespace_->textures.Append(ids[i], new TestTexture());
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::deleteBuffers(GLsizei count, GLuint* ids) {
1850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  for (int i = 0; i < count; ++i)
1860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    RetireBufferId(ids[i]);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void TestWebGraphicsContext3D::deleteFramebuffers(
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLsizei count, GLuint* ids) {
1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (int i = 0; i < count; ++i)
1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK_EQ(kFramebufferId | context_id_ << 16, ids[i]);
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void TestWebGraphicsContext3D::deleteRenderbuffers(
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLsizei count, GLuint* ids) {
1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (int i = 0; i < count; ++i)
1981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK_EQ(kRenderbufferId | context_id_ << 16, ids[i]);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::deleteTextures(GLsizei count, GLuint* ids) {
2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  for (int i = 0; i < count; ++i)
2030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    RetireTextureId(ids[i]);
2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::AutoLock lock(namespace_->lock);
2051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (int i = 0; i < count; ++i) {
2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    namespace_->textures.Remove(ids[i]);
2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    texture_targets_.UnbindTexture(ids[i]);
2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint TestWebGraphicsContext3D::createBuffer() {
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLuint id;
2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  genBuffers(1, &id);
2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return id;
2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint TestWebGraphicsContext3D::createFramebuffer() {
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLuint id;
2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  genFramebuffers(1, &id);
2201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return id;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint TestWebGraphicsContext3D::createRenderbuffer() {
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLuint id;
2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  genRenderbuffers(1, &id);
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return id;
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint TestWebGraphicsContext3D::createTexture() {
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLuint id;
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  genTextures(1, &id);
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return id;
2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::deleteBuffer(GLuint id) {
2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  deleteBuffers(1, &id);
2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::deleteFramebuffer(GLuint id) {
2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  deleteFramebuffers(1, &id);
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::deleteRenderbuffer(GLuint id) {
2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  deleteRenderbuffers(1, &id);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::deleteTexture(GLuint id) {
2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  deleteTextures(1, &id);
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)unsigned TestWebGraphicsContext3D::createProgram() {
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  unsigned program = next_program_id_++ | context_id_ << 16;
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  program_set_.insert(program);
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return program;
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint TestWebGraphicsContext3D::createShader(GLenum) {
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  unsigned shader = next_shader_id_++ | context_id_ << 16;
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shader_set_.insert(shader);
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return shader;
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint TestWebGraphicsContext3D::createExternalTexture() {
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::AutoLock lock(namespace_->lock);
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  namespace_->textures.Append(kExternalTextureId, new TestTexture());
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return kExternalTextureId;
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::deleteProgram(GLuint id) {
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!program_set_.count(id))
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ADD_FAILURE() << "deleteProgram called on unknown program " << id;
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  program_set_.erase(id);
2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::deleteShader(GLuint id) {
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!shader_set_.count(id))
277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ADD_FAILURE() << "deleteShader called on unknown shader " << id;
278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shader_set_.erase(id);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::attachShader(GLuint program, GLuint shader) {
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!program_set_.count(program))
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ADD_FAILURE() << "attachShader called with unknown program " << program;
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!shader_set_.count(shader))
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ADD_FAILURE() << "attachShader called with unknown shader " << shader;
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::useProgram(GLuint program) {
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!program)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!program_set_.count(program))
292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ADD_FAILURE() << "useProgram called on unknown program " << program;
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::bindFramebuffer(
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum target, GLuint framebuffer) {
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!framebuffer)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK_EQ(kFramebufferId | context_id_ << 16, framebuffer);
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::bindRenderbuffer(
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GLenum target, GLuint renderbuffer) {
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!renderbuffer)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK_EQ(kRenderbufferId | context_id_ << 16, renderbuffer);
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::bindTexture(
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum target, GLuint texture_id) {
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (times_bind_texture_succeeds_ >= 0) {
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!times_bind_texture_succeeds_) {
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          GL_INNOCENT_CONTEXT_RESET_ARB);
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    --times_bind_texture_succeeds_;
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!texture_id)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(namespace_->textures.ContainsId(texture_id));
3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  texture_targets_.BindTexture(target, texture_id);
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  used_textures_.insert(texture_id);
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint TestWebGraphicsContext3D::BoundTextureId(
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum target) {
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return texture_targets_.BoundTexture(target);
3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_refptr<TestTexture> TestWebGraphicsContext3D::BoundTexture(
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum target) {
334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The caller is expected to lock the namespace for texture access.
335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  namespace_->lock.AssertAcquired();
336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return namespace_->textures.TextureForId(BoundTextureId(target));
337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::CheckTextureIsBound(GLenum target) {
340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(BoundTextureId(target));
341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint TestWebGraphicsContext3D::createQueryEXT() { return 1u; }
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::endQueryEXT(GLenum target) {
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (times_end_query_succeeds_ >= 0) {
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!times_end_query_succeeds_) {
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          GL_INNOCENT_CONTEXT_RESET_ARB);
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    --times_end_query_succeeds_;
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestWebGraphicsContext3D::getQueryObjectuivEXT(
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint query,
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum pname,
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint* params) {
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the context is lost, behave as if result is available.
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (pname == GL_QUERY_RESULT_AVAILABLE_EXT)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *params = 1;
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestWebGraphicsContext3D::getIntegerv(
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum pname,
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLint* value) {
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (pname == GL_MAX_TEXTURE_SIZE)
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *value = max_texture_size_;
369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  else if (pname == GL_ACTIVE_TEXTURE)
370a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    *value = GL_TEXTURE0;
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::getProgramiv(GLuint program,
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            GLenum pname,
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            GLint* value) {
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (pname == GL_LINK_STATUS)
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *value = 1;
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::getShaderiv(GLuint shader,
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           GLenum pname,
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           GLint* value) {
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (pname == GL_COMPILE_STATUS)
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *value = 1;
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::getShaderPrecisionFormat(GLenum shadertype,
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                        GLenum precisiontype,
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                        GLint* range,
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                        GLint* precision) {
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Return the minimum precision requirements of the GLES2
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // specification.
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  switch (precisiontype) {
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case GL_LOW_INT:
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      range[0] = 8;
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      range[1] = 8;
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      *precision = 0;
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case GL_MEDIUM_INT:
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      range[0] = 10;
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      range[1] = 10;
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      *precision = 0;
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case GL_HIGH_INT:
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      range[0] = 16;
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      range[1] = 16;
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      *precision = 0;
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case GL_LOW_FLOAT:
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      range[0] = 8;
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      range[1] = 8;
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      *precision = 8;
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case GL_MEDIUM_FLOAT:
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      range[0] = 14;
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      range[1] = 14;
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      *precision = 10;
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case GL_HIGH_FLOAT:
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      range[0] = 62;
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      range[1] = 62;
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      *precision = 16;
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    default:
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      NOTREACHED();
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::genMailboxCHROMIUM(GLbyte* mailbox) {
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static char mailbox_name1 = '1';
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static char mailbox_name2 = '1';
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mailbox[0] = mailbox_name1;
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mailbox[1] = mailbox_name2;
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mailbox[2] = '\0';
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (++mailbox_name1 == 0) {
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mailbox_name1 = '1';
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++mailbox_name2;
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GLuint TestWebGraphicsContext3D::createAndConsumeTextureCHROMIUM(
4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    GLenum target,
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const GLbyte* mailbox) {
4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return createTexture();
4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::loseContextCHROMIUM(GLenum current,
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   GLenum other) {
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (context_lost_)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_lost_ = true;
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!context_lost_callback_.is_null())
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    context_lost_callback_.Run();
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < shared_contexts_.size(); ++i)
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    shared_contexts_[i]->loseContextCHROMIUM(current, other);
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shared_contexts_.clear();
459a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
460a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestWebGraphicsContext3D::finish() {
4628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  test_support_->CallAllSyncPointCallbacks();
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestWebGraphicsContext3D::flush() {
4668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  test_support_->CallAllSyncPointCallbacks();
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLint TestWebGraphicsContext3D::getAttribLocation(GLuint program,
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  const GLchar* name) {
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return 0;
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLenum TestWebGraphicsContext3D::getError() { return GL_NO_ERROR; }
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::bindBuffer(GLenum target,
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                          GLuint buffer) {
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bound_buffer_ = buffer;
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!bound_buffer_)
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
4810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  unsigned context_id = buffer >> 16;
4820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  unsigned buffer_id = buffer & 0xffff;
4837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
4840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK(buffer_id);
4850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK_LT(buffer_id, namespace_->next_buffer_id);
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_EQ(context_id, context_id_);
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
488424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::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)
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::bufferData(GLenum target,
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                          GLsizeiptr size,
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          const void* data,
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                          GLenum usage) {
4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
500424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::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);
50358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Buffer* buffer = buffers.get(bound_buffer_);
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (context_lost_) {
50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    buffer->pixels.reset();
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
50858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  size_t old_size = buffer->size;
510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  buffer->pixels.reset(new uint8[size]);
51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  buffer->size = size;
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (data != NULL)
51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    memcpy(buffer->pixels.get(), data, size);
515f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (buffer->target == GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM)
516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    current_used_transfer_buffer_usage_bytes_ += buffer->size - old_size;
517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  max_used_transfer_buffer_usage_bytes_ =
518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      std::max(max_used_transfer_buffer_usage_bytes_,
519f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)               current_used_transfer_buffer_usage_bytes_);
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void* TestWebGraphicsContext3D::mapBufferCHROMIUM(GLenum target,
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  GLenum access) {
5247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
525424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::ScopedPtrHashMap<unsigned, Buffer>& buffers = namespace_->buffers;
5267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_GT(buffers.count(bound_buffer_), 0u);
5277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_EQ(target, buffers.get(bound_buffer_)->target);
5287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (times_map_buffer_chromium_succeeds_ >= 0) {
5297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!times_map_buffer_chromium_succeeds_) {
5307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return NULL;
5317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
5327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    --times_map_buffer_chromium_succeeds_;
5337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return buffers.get(bound_buffer_)->pixels.get();
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLboolean TestWebGraphicsContext3D::unmapBufferCHROMIUM(
5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum target) {
5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
541424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::ScopedPtrHashMap<unsigned, Buffer>& buffers = namespace_->buffers;
5427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_GT(buffers.count(bound_buffer_), 0u);
5437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_EQ(target, buffers.get(bound_buffer_)->target);
5447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  buffers.get(bound_buffer_)->pixels.reset();
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GLuint TestWebGraphicsContext3D::createImageCHROMIUM(GLsizei width,
549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                     GLsizei height,
550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                     GLenum internalformat,
551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                     GLenum usage) {
552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK_EQ(GL_RGBA8_OES, static_cast<int>(internalformat));
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLuint image_id = NextImageId();
5547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
555424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::ScopedPtrHashMap<unsigned, Image>& images = namespace_->images;
5567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  images.set(image_id, make_scoped_ptr(new Image).Pass());
5577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  images.get(image_id)->pixels.reset(new uint8[width * height * 4]);
558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return image_id;
559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TestWebGraphicsContext3D::destroyImageCHROMIUM(
5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint id) {
5630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RetireImageId(id);
564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TestWebGraphicsContext3D::getImageParameterivCHROMIUM(
5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint image_id,
5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum pname,
5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLint* params) {
5707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
5717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_GT(namespace_->images.count(image_id), 0u);
572868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK_EQ(GL_IMAGE_ROWBYTES_CHROMIUM, static_cast<int>(pname));
573868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  *params = 0;
574868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void* TestWebGraphicsContext3D::mapImageCHROMIUM(GLuint image_id) {
5777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
578424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::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(
5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint image_id) {
5917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
5927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_GT(namespace_->images.count(image_id), 0u);
5937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
5947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)unsigned TestWebGraphicsContext3D::insertSyncPoint() {
596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return next_insert_sync_point_++;
597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void TestWebGraphicsContext3D::waitSyncPoint(unsigned sync_point) {
600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (sync_point)
601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    last_waited_sync_point_ = sync_point;
602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
6047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochsize_t TestWebGraphicsContext3D::NumTextures() const {
6057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
6064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return namespace_->textures.Size();
6077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
6087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint TestWebGraphicsContext3D::TextureAt(int i) const {
6107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
6114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return namespace_->textures.IdAt(i);
612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint TestWebGraphicsContext3D::NextTextureId() {
6157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLuint texture_id = namespace_->next_texture_id++;
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(texture_id < (1 << 16));
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  texture_id |= context_id_ << 16;
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return texture_id;
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::RetireTextureId(GLuint id) {
6230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  base::AutoLock lock(namespace_->lock);
6240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  unsigned context_id = id >> 16;
6250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  unsigned texture_id = id & 0xffff;
6260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK(texture_id);
6270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK_LT(texture_id, namespace_->next_texture_id);
6280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK_EQ(context_id, context_id_);
6290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
6300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint TestWebGraphicsContext3D::NextBufferId() {
6327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLuint buffer_id = namespace_->next_buffer_id++;
6340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK(buffer_id < (1 << 16));
6350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  buffer_id |= context_id_ << 16;
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return buffer_id;
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::RetireBufferId(GLuint id) {
6400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  base::AutoLock lock(namespace_->lock);
6410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  unsigned context_id = id >> 16;
6420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  unsigned buffer_id = id & 0xffff;
6430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK(buffer_id);
6440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK_LT(buffer_id, namespace_->next_buffer_id);
6450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK_EQ(context_id, context_id_);
6460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
6470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint TestWebGraphicsContext3D::NextImageId() {
6497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(namespace_->lock);
6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLuint image_id = namespace_->next_image_id++;
6510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK(image_id < (1 << 16));
6520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  image_id |= context_id_ << 16;
653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return image_id;
654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::RetireImageId(GLuint id) {
6570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  base::AutoLock lock(namespace_->lock);
6580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  unsigned context_id = id >> 16;
6590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  unsigned image_id = id & 0xffff;
6600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK(image_id);
6610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK_LT(image_id, namespace_->next_image_id);
6620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK_EQ(context_id, context_id_);
6630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
6640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
66558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TestWebGraphicsContext3D::SetMaxTransferBufferUsageBytes(
66658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    size_t max_transfer_buffer_usage_bytes) {
66758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  test_capabilities_.max_transfer_buffer_usage_bytes =
66858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      max_transfer_buffer_usage_bytes;
66958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TestWebGraphicsContext3D::TextureTargets::TextureTargets() {
6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Initialize default bindings.
6734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bound_textures_[GL_TEXTURE_2D] = 0;
6744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bound_textures_[GL_TEXTURE_EXTERNAL_OES] = 0;
6754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bound_textures_[GL_TEXTURE_RECTANGLE_ARB] = 0;
6764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
6774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TestWebGraphicsContext3D::TextureTargets::~TextureTargets() {}
6794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TestWebGraphicsContext3D::TextureTargets::BindTexture(
6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum target,
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint id) {
6834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Make sure this is a supported target by seeing if it was bound to before.
6844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(bound_textures_.find(target) != bound_textures_.end());
6854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bound_textures_[target] = id;
6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
6874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::texParameteri(GLenum target,
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             GLenum pname,
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             GLint param) {
691f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CheckTextureIsBound(target);
692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::AutoLock lock_for_texture_access(namespace_->lock);
693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<TestTexture> texture = BoundTexture(target);
694f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(texture->IsValidParameter(pname));
695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  texture->params[pname] = param;
696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TestWebGraphicsContext3D::getTexParameteriv(GLenum target,
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 GLenum pname,
7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 GLint* value) {
701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CheckTextureIsBound(target);
702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::AutoLock lock_for_texture_access(namespace_->lock);
703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<TestTexture> texture = BoundTexture(target);
704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(texture->IsValidParameter(pname));
705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestTexture::TextureParametersMap::iterator it = texture->params.find(pname);
706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (it != texture->params.end())
707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    *value = it->second;
708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TestWebGraphicsContext3D::TextureTargets::UnbindTexture(
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLuint id) {
7124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Bind zero to any targets that the id is bound to.
7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (TargetTextureMap::iterator it = bound_textures_.begin();
7144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)       it != bound_textures_.end();
7154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)       it++) {
7164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (it->second == id)
7174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      it->second = 0;
7184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
7194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
7204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint TestWebGraphicsContext3D::TextureTargets::BoundTexture(
7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum target) {
7234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(bound_textures_.find(target) != bound_textures_.end());
7244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return bound_textures_[target];
7254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
7264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
72758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TestWebGraphicsContext3D::Buffer::Buffer() : target(0), size(0) {}
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TestWebGraphicsContext3D::Buffer::~Buffer() {}
730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TestWebGraphicsContext3D::Image::Image() {}
732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TestWebGraphicsContext3D::Image::~Image() {}
734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
736