15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GL_GLEXT_PROTOTYPES
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GL_GLEXT_PROTOTYPES 1
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <map>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/atomicops.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h"
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/lazy_instance.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
229ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/field_trial.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/gpu_channel_host.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_cmd_helper.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_implementation.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_lib.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/client/gles2_trace_implementation.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/transfer_buffer.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/constants.h"
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "gpu/command_buffer/common/gpu_memory_allocation.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/common/mailbox.h"
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkTypes.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static base::LazyInstance<base::Lock>::Leaky
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    g_all_shared_contexts_lock = LAZY_INSTANCE_INITIALIZER;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef std::multimap<GpuChannelHost*, WebGraphicsContext3DCommandBufferImpl*>
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ContextMap;
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static base::LazyInstance<ContextMap> g_all_shared_contexts =
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)uint32_t GenFlushID() {
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  static base::subtle::Atomic32 flush_id = 0;
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::subtle::Atomic32 my_id = base::subtle::Barrier_AtomicIncrement(
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      &flush_id, 1);
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return static_cast<uint32_t>(my_id);
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Singleton used to initialize and terminate the gles2 library.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2Initializer {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2Initializer() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gles2::Initialize();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~GLES2Initializer() {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gles2::Terminate();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GLES2Initializer);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::LazyInstance<GLES2Initializer> g_gles2_initializer =
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace anonymous
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Helper macros to reduce the amount of code.
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL(name, glname)                                    \
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name() {                    \
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname();                                                        \
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_R(name, glname, rt)                              \
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)rt WebGraphicsContext3DCommandBufferImpl::name() {                      \
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return gl_->glname();                                                 \
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_1(name, glname, t1)                              \
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1) {               \
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1);                                                      \
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_1R(name, glname, t1, rt)                         \
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)rt WebGraphicsContext3DCommandBufferImpl::name(t1 a1) {                 \
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return gl_->glname(a1);                                               \
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_1RB(name, glname, t1, rt)                        \
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)rt WebGraphicsContext3DCommandBufferImpl::name(t1 a1) {                 \
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return gl_->glname(a1) ? true : false;                                \
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_2(name, glname, t1, t2)                          \
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2) {        \
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2);                                                  \
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_2R(name, glname, t1, t2, rt)                     \
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)rt WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2) {          \
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return gl_->glname(a1, a2);                                           \
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_3(name, glname, t1, t2, t3)                      \
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3) { \
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3);                                              \
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define DELEGATE_TO_GL_3R(name, glname, t1, t2, t3, rt)                 \
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)rt WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3) {   \
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return gl_->glname(a1, a2, a3);                                       \
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_4(name, glname, t1, t2, t3, t4)                  \
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,   \
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t4 a4) {               \
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3, a4);                                          \
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_4R(name, glname, t1, t2, t3, t4, rt)             \
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)rt WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,     \
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                               t4 a4) {                 \
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return gl_->glname(a1, a2, a3, a4);                                   \
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_5(name, glname, t1, t2, t3, t4, t5)              \
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,   \
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t4 a4, t5 a5) {        \
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3, a4, a5);                                      \
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_6(name, glname, t1, t2, t3, t4, t5, t6)          \
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,   \
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t4 a4, t5 a5, t6 a6) { \
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3, a4, a5, a6);                                  \
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_7(name, glname, t1, t2, t3, t4, t5, t6, t7)      \
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,   \
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t4 a4, t5 a5, t6 a6,   \
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t7 a7) {               \
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3, a4, a5, a6, a7);                              \
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_8(name, glname, t1, t2, t3, t4, t5, t6, t7, t8)  \
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,   \
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t4 a4, t5 a5, t6 a6,   \
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t7 a7, t8 a8) {        \
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8);                          \
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_9(name, glname, t1, t2, t3, t4, t5, t6, t7, t8, t9) \
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,   \
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t4 a4, t5 a5, t6 a6,   \
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t7 a7, t8 a8, t9 a9) { \
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8, a9);                      \
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebGraphicsContext3DErrorMessageCallback
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public gpu::gles2::GLES2Implementation::ErrorMessageCallback {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGraphicsContext3DErrorMessageCallback(
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebGraphicsContext3DCommandBufferImpl* context)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : graphics_context_(context) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnErrorMessage(const char* msg, int id) OVERRIDE;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGraphicsContext3DCommandBufferImpl* graphics_context_;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebGraphicsContext3DErrorMessageCallback);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DErrorMessageCallback::OnErrorMessage(
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* msg, int id) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  graphics_context_->OnErrorMessage(msg, id);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebGraphicsContext3DCommandBufferImpl::SharedMemoryLimits::SharedMemoryLimits()
1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : command_buffer_size(kDefaultCommandBufferSize),
2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      start_transfer_buffer_size(kDefaultStartTransferBufferSize),
2011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      min_transfer_buffer_size(kDefaultMinTransferBufferSize),
2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      max_transfer_buffer_size(kDefaultMaxTransferBufferSize),
2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      mapped_memory_reclaim_limit(gpu::gles2::GLES2Implementation::kNoLimit) {}
2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGraphicsContext3DCommandBufferImpl::WebGraphicsContext3DCommandBufferImpl(
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int surface_id,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& active_url,
2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GpuChannelHost* host,
2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const Attributes& attributes,
2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    bool bind_generates_resources,
2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const SharedMemoryLimits& limits)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : initialize_failed_(false),
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visible_(false),
2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      host_(host),
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      surface_id_(surface_id),
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      active_url_(active_url),
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_lost_callback_(0),
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_lost_reason_(GL_NO_ERROR),
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_message_callback_(0),
2201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      attributes_(attributes),
2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      gpu_preference_(attributes.preferDiscreteGPU ? gfx::PreferDiscreteGpu
2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                   : gfx::PreferIntegratedGpu),
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_ptr_factory_(this),
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      initialized_(false),
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_(NULL),
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      bind_generates_resources_(bind_generates_resources),
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      mem_limits_(limits),
228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      flush_id_(0) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGraphicsContext3DCommandBufferImpl::
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~WebGraphicsContext3DCommandBufferImpl() {
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (real_gl_) {
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    real_gl_->SetErrorMessageCallback(NULL);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Destroy();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::MaybeInitializeGL() {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (initialized_)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (initialize_failed_)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRACE_EVENT0("gpu", "WebGfxCtx3DCmdBfrImpl::MaybeInitializeGL");
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!CreateContext(surface_id_ != 0)) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Destroy();
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    initialize_failed_ = true;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(twiz):  This code is too fragile in that it assumes that only WebGL
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // contexts will request noExtensions.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gl_ && attributes_.noExtensions)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_->EnableFeatureCHROMIUM("webgl_enable_glsl_webgl_validation");
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_buffer_->SetChannelErrorCallback(
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&WebGraphicsContext3DCommandBufferImpl::OnGpuChannelLost,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_buffer_->SetOnConsoleMessageCallback(
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&WebGraphicsContext3DCommandBufferImpl::OnErrorMessage,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_error_message_callback_.reset(
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new WebGraphicsContext3DErrorMessageCallback(this));
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  real_gl_->SetErrorMessageCallback(client_error_message_callback_.get());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set attributes_ from created offscreen context.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
274a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    static const int pcount = 4;
275a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    static const GLenum pnames[pcount] = {
276a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GL_ALPHA_BITS,
277a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GL_DEPTH_BITS,
278a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GL_STENCIL_BITS,
279a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GL_SAMPLE_BUFFERS,
280a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    };
281a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GLint pvalues[pcount] = { 0, 0, 0, 0 };
282a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
283a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    gl_->GetMultipleIntegervCHROMIUM(pnames, pcount,
284a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                     pvalues, sizeof(pvalues));
285a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
286a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    attributes_.alpha = pvalues[0] > 0;
287a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    attributes_.depth = pvalues[1] > 0;
288a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    attributes_.stencil = pvalues[2] > 0;
289a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    attributes_.antialias = pvalues[3] > 0;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  visible_ = true;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initialized_ = true;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::InitializeCommandBuffer(
29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool onscreen) {
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!host_.get())
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to lock g_all_shared_contexts to ensure that the context we picked
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for our share group isn't deleted.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (There's also a lock in our destructor.)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock lock(g_all_shared_contexts_lock.Get());
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBufferProxyImpl* share_group = NULL;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (attributes_.shareResources) {
307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ContextMap& all_contexts = g_all_shared_contexts.Get();
308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ContextMap::const_iterator it = all_contexts.find(host_.get());
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (it != all_contexts.end())
310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      share_group = it->second->command_buffer_.get();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int32> attribs;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(ALPHA_SIZE);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(attributes_.alpha ? 8 : 0);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(DEPTH_SIZE);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(attributes_.depth ? 24 : 0);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(STENCIL_SIZE);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(attributes_.stencil ? 8 : 0);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(SAMPLES);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(attributes_.antialias ? 4 : 0);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(SAMPLE_BUFFERS);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(attributes_.antialias ? 1 : 0);
324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  attribs.push_back(FAIL_IF_MAJOR_PERF_CAVEAT);
325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  attribs.push_back(attributes_.failIfMajorPerformanceCaveat ? 1 : 0);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(NONE);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a proxy to a command buffer in the GPU process.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (onscreen) {
3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    command_buffer_.reset(host_->CreateViewCommandBuffer(
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        surface_id_,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        share_group,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        attribs,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        active_url_,
3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        gpu_preference_));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    command_buffer_.reset(host_->CreateOffscreenCommandBuffer(
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gfx::Size(1, 1),
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        share_group,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        attribs,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        active_url_,
3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        gpu_preference_));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!command_buffer_)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the command buffer.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return command_buffer_->Initialize();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::CreateContext(
35358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool onscreen) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure the gles2 library is initialized first in a thread safe way.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_gles2_initializer.Get();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!command_buffer_ &&
35858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      !InitializeCommandBuffer(onscreen)) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the GLES2 helper, which writes the command buffer protocol.
3637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gles2_helper_.reset(new gpu::gles2::GLES2CmdHelper(command_buffer_.get()));
3641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!gles2_helper_->Initialize(mem_limits_.command_buffer_size))
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (attributes_.noAutomaticFlushes)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gles2_helper_->SetAutomaticFlushes(false);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a transfer buffer used to copy resources between the renderer
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // process and the GPU process.
3727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  transfer_buffer_ .reset(new gpu::TransferBuffer(gles2_helper_.get()));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(host_.get());
375558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_ptr<base::AutoLock> lock;
376558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_refptr<gpu::gles2::ShareGroup> share_group;
377558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (attributes_.shareResources) {
378558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    // Make sure two clients don't try to create a new ShareGroup
379558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    // simultaneously.
380558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    lock.reset(new base::AutoLock(g_all_shared_contexts_lock.Get()));
381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ContextMap& all_contexts = g_all_shared_contexts.Get();
382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ContextMap::const_iterator it = all_contexts.find(host_.get());
383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (it != all_contexts.end()) {
384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      share_group = it->second->GetImplementation()->share_group();
385558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      DCHECK(share_group);
386558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    }
387558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool free_command_buffer_when_invisible =
391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      command_line.HasSwitch(switches::kEnablePruneGpuCommandBuffers);
392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the object exposing the OpenGL API.
3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  real_gl_.reset(new gpu::gles2::GLES2Implementation(
3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gles2_helper_.get(),
396558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      share_group,
3977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      transfer_buffer_.get(),
39890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bind_generates_resources_,
399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      free_command_buffer_when_invisible,
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      command_buffer_.get()));
4017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gl_ = real_gl_.get();
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
403558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (attributes_.shareResources) {
404558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    // Don't add ourselves to the list before others can get to our ShareGroup.
405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    g_all_shared_contexts.Get().insert(std::make_pair(host_.get(), this));
406558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    lock.reset();
407558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
408558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!real_gl_->Initialize(
4101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      mem_limits_.start_transfer_buffer_size,
4111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      mem_limits_.min_transfer_buffer_size,
4121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      mem_limits_.max_transfer_buffer_size,
4131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      mem_limits_.mapped_memory_reclaim_limit)) {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switches::kEnableGpuClientTracing)) {
4197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    trace_gl_.reset(new gpu::gles2::GLES2TraceImplementation(gl_));
4207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    gl_ = trace_gl_.get();
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::makeContextCurrent() {
42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!MaybeInitializeGL())
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gles2::SetGLContext(gl_);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_buffer_->GetLastError() != gpu::error::kNoError)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
436d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)uint32_t WebGraphicsContext3DCommandBufferImpl::lastFlushID() {
437d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return flush_id_;
438d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
439d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_R(insertSyncPoint, InsertSyncPointCHROMIUM, unsigned int)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::Destroy() {
443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (host_.get()) {
444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::AutoLock lock(g_all_shared_contexts_lock.Get());
445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ContextMap& all_contexts = g_all_shared_contexts.Get();
446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ContextMap::iterator it = std::find(
447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        all_contexts.begin(),
448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        all_contexts.end(),
449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        std::pair<GpuChannelHost* const,
450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                  WebGraphicsContext3DCommandBufferImpl*>(host_.get(), this));
451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (it != all_contexts.end())
452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      all_contexts.erase(it);
453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gl_) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // First flush the context to ensure that any pending frees of resources
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // are completed. Otherwise, if this context is part of a share group,
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // those resources might leak. Also, any remaining side effects of commands
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // issued on this context might not be visible to other contexts in the
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // share group.
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_->Flush();
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_ = NULL;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  trace_gl_.reset();
4667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  real_gl_.reset();
4677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  transfer_buffer_.reset();
4687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gles2_helper_.reset();
4697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  real_gl_.reset();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_buffer_) {
472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (host_.get())
4737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      host_->DestroyCommandBuffer(command_buffer_.release());
4747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    command_buffer_.reset();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_ = NULL;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(apatrick,piman): This should be renamed to something clearer.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebGraphicsContext3DCommandBufferImpl::GetGPUProcessID() {
482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return host_.get() ? host_->gpu_host_id() : 0;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)gpu::ContextSupport*
4868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)WebGraphicsContext3DCommandBufferImpl::GetContextSupport() {
4878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return real_gl_.get();
4888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
4898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::prepareTexture() {
491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NOTREACHED();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::postSubBufferCHROMIUM(
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int x, int y, int width, int height) {
496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NOTREACHED();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)DELEGATE_TO_GL_3(reshapeWithScaleFactor, ResizeCHROMIUM, int, int, float)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::synthesizeGLError(
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum error) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (std::find(synthetic_errors_.begin(), synthetic_errors_.end(), error) ==
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      synthetic_errors_.end()) {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    synthetic_errors_.push_back(error);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_4R(mapBufferSubDataCHROMIUM, MapBufferSubDataCHROMIUM, WGC3Denum,
510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  WGC3Dintptr, WGC3Dsizeiptr, WGC3Denum, void*)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1(unmapBufferSubDataCHROMIUM, UnmapBufferSubDataCHROMIUM,
513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 const void*)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* WebGraphicsContext3DCommandBufferImpl::mapTexSubImage2DCHROMIUM(
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum target,
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dint level,
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dint xoffset,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dint yoffset,
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dsizei width,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dsizei height,
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum format,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum type,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum access) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gl_->MapTexSubImage2DCHROMIUM(
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, level, xoffset, yoffset, width, height, format, type, access);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1(unmapTexSubImage2DCHROMIUM, UnmapTexSubImage2DCHROMIUM,
530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 const void*)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::setVisibilityCHROMIUM(
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool visible) {
534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NOTREACHED();
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_3(discardFramebufferEXT, DiscardFramebufferEXT, WGC3Denum,
538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Dsizei, const WGC3Denum*)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::copyTextureToParentTextureCHROMIUM(
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId texture, WebGLId parentTexture) {
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL(rateLimitOffscreenContextCHROMIUM,
546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               RateLimitOffscreenContextCHROMIUM)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebString WebGraphicsContext3DCommandBufferImpl::
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getRequestableExtensionsCHROMIUM() {
550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return blink::WebString::fromUTF8(
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_->GetRequestableExtensionsCHROMIUM());
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1(requestExtensionCHROMIUM, RequestExtensionCHROMIUM,
555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 const char*)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::blitFramebufferCHROMIUM(
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dint srcX0, WGC3Dint srcY0, WGC3Dint srcX1, WGC3Dint srcY1,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dint dstX0, WGC3Dint dstY0, WGC3Dint dstX1, WGC3Dint dstY1,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dbitfield mask, WGC3Denum filter) {
561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gl_->BlitFramebufferCHROMIUM(
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      srcX0, srcY0, srcX1, srcY1,
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dstX0, dstY0, dstX1, dstY1,
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mask, filter);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_5(renderbufferStorageMultisampleCHROMIUM,
568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 RenderbufferStorageMultisampleCHROMIUM, WGC3Denum, WGC3Dsizei,
569868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Denum, WGC3Dsizei, WGC3Dsizei)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
571868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1R(createStreamTextureCHROMIUM, CreateStreamTextureCHROMIUM,
572868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  WebGLId, WebGLId)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
574868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1(destroyStreamTextureCHROMIUM, DestroyStreamTextureCHROMIUM,
575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WebGLId)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(activeTexture, ActiveTexture, WGC3Denum)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(attachShader, AttachShader, WebGLId, WebGLId)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(bindAttribLocation, BindAttribLocation, WebGLId,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Duint, const WGC3Dchar*)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(bindBuffer, BindBuffer, WGC3Denum, WebGLId)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5867dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDELEGATE_TO_GL_2(bindFramebuffer, BindFramebuffer, WGC3Denum, WebGLId)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(bindRenderbuffer, BindRenderbuffer, WGC3Denum, WebGLId)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(bindTexture, BindTexture, WGC3Denum, WebGLId)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(blendColor, BlendColor,
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dclampf, WGC3Dclampf, WGC3Dclampf, WGC3Dclampf)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(blendEquation, BlendEquation, WGC3Denum)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(blendEquationSeparate, BlendEquationSeparate,
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(blendFunc, BlendFunc, WGC3Denum, WGC3Denum)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(blendFuncSeparate, BlendFuncSeparate,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Denum, WGC3Denum)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(bufferData, BufferData,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dsizeiptr, const void*, WGC3Denum)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(bufferSubData, BufferSubData,
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dintptr, WGC3Dsizeiptr, const void*)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1R(checkFramebufferStatus, CheckFramebufferStatus,
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  WGC3Denum, WGC3Denum)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(clear, Clear, WGC3Dbitfield)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(clearColor, ClearColor,
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dclampf, WGC3Dclampf, WGC3Dclampf, WGC3Dclampf)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(clearDepth, ClearDepthf, WGC3Dclampf)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(clearStencil, ClearStencil, WGC3Dint)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(colorMask, ColorMask,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dboolean, WGC3Dboolean, WGC3Dboolean, WGC3Dboolean)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(compileShader, CompileShader, WebGLId)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_8(compressedTexImage2D, CompressedTexImage2D,
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Denum, WGC3Dint, WGC3Dint,
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dsizei, WGC3Dsizei, const void*)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_9(compressedTexSubImage2D, CompressedTexSubImage2D,
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint,
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dsizei, const void*)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_8(copyTexImage2D, CopyTexImage2D,
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Denum, WGC3Dint, WGC3Dint,
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dsizei, WGC3Dsizei, WGC3Dint)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_8(copyTexSubImage2D, CopyTexSubImage2D,
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint,
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dsizei, WGC3Dsizei)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(cullFace, CullFace, WGC3Denum)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(depthFunc, DepthFunc, WGC3Denum)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(depthMask, DepthMask, WGC3Dboolean)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(depthRange, DepthRangef, WGC3Dclampf, WGC3Dclampf)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(detachShader, DetachShader, WebGLId, WebGLId)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(disable, Disable, WGC3Denum)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(disableVertexAttribArray, DisableVertexAttribArray,
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Duint)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(drawArrays, DrawArrays, WGC3Denum, WGC3Dint, WGC3Dsizei)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::drawElements(WGC3Denum mode,
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                         WGC3Dsizei count,
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                         WGC3Denum type,
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                         WGC3Dintptr offset) {
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DrawElements(
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode, count, type,
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<void*>(static_cast<intptr_t>(offset)));
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(enable, Enable, WGC3Denum)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(enableVertexAttribArray, EnableVertexAttribArray,
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Duint)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::finish() {
676d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  flush_id_ = GenFlushID();
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->Finish();
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::flush() {
681d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  flush_id_ = GenFlushID();
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->Flush();
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(framebufferRenderbuffer, FramebufferRenderbuffer,
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Denum, WebGLId)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_5(framebufferTexture2D, FramebufferTexture2D,
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Denum, WebGLId, WGC3Dint)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
691d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)DELEGATE_TO_GL_6(framebufferTexture2DMultisampleEXT,
692d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                 FramebufferTexture2DMultisampleEXT,
693d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Denum, WebGLId, WGC3Dint, WGC3Dsizei)
694d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(frontFace, FrontFace, WGC3Denum)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(generateMipmap, GenerateMipmap, WGC3Denum)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::getActiveAttrib(
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId program, WGC3Duint index, ActiveInfo& info) {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!program) {
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    synthesizeGLError(GL_INVALID_VALUE);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_name_length = -1;
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetProgramiv(
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_name_length);
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max_name_length < 0)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<GLchar[]> name(new GLchar[max_name_length]);
711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!name) {
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    synthesizeGLError(GL_OUT_OF_MEMORY);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei length = 0;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint size = -1;
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum type = 0;
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetActiveAttrib(
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      program, index, max_name_length, &length, &size, &type, name.get());
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size < 0) {
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  info.name = blink::WebString::fromUTF8(name.get(), length);
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.type = type;
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.size = size;
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::getActiveUniform(
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId program, WGC3Duint index, ActiveInfo& info) {
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_name_length = -1;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetProgramiv(
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max_name_length);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max_name_length < 0)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<GLchar[]> name(new GLchar[max_name_length]);
737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!name) {
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    synthesizeGLError(GL_OUT_OF_MEMORY);
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei length = 0;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint size = -1;
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum type = 0;
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetActiveUniform(
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      program, index, max_name_length, &length, &size, &type, name.get());
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size < 0) {
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  info.name = blink::WebString::fromUTF8(name.get(), length);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.type = type;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.size = size;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(getAttachedShaders, GetAttachedShaders,
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WebGLId, WGC3Dsizei, WGC3Dsizei*, WebGLId*)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2R(getAttribLocation, GetAttribLocation,
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  WebGLId, const WGC3Dchar*, WGC3Dint)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(getBooleanv, GetBooleanv, WGC3Denum, WGC3Dboolean*)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getBufferParameteriv, GetBufferParameteriv,
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dint*)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
766f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGraphicsContext3D::Attributes
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGraphicsContext3DCommandBufferImpl::getContextAttributes() {
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return attributes_;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WGC3Denum WebGraphicsContext3DCommandBufferImpl::getError() {
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!synthetic_errors_.empty()) {
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<WGC3Denum>::iterator iter = synthetic_errors_.begin();
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum err = *iter;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    synthetic_errors_.erase(iter);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gl_->GetError();
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::isContextLost() {
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return initialize_failed_ ||
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (command_buffer_ && IsCommandBufferContextLost()) ||
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_lost_reason_ != GL_NO_ERROR;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(getFloatv, GetFloatv, WGC3Denum, WGC3Dfloat*)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(getFramebufferAttachmentParameteriv,
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GetFramebufferAttachmentParameteriv,
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Denum, WGC3Dint*)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(getIntegerv, GetIntegerv, WGC3Denum, WGC3Dint*)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getProgramiv, GetProgramiv, WebGLId, WGC3Denum, WGC3Dint*)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebString WebGraphicsContext3DCommandBufferImpl::getProgramInfoLog(
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId program) {
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint logLength = 0;
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!logLength)
803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return blink::WebString();
804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<GLchar[]> log(new GLchar[logLength]);
805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!log)
806f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return blink::WebString();
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei returnedLogLength = 0;
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetProgramInfoLog(
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      program, logLength, &returnedLogLength, log.get());
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(logLength, returnedLogLength + 1);
811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebString res =
812f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebString::fromUTF8(log.get(), returnedLogLength);
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return res;
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getRenderbufferParameteriv, GetRenderbufferParameteriv,
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dint*)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getShaderiv, GetShaderiv, WebGLId, WGC3Denum, WGC3Dint*)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
821f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebString WebGraphicsContext3DCommandBufferImpl::getShaderInfoLog(
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId shader) {
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint logLength = 0;
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!logLength)
826f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return blink::WebString();
827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<GLchar[]> log(new GLchar[logLength]);
828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!log)
829f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return blink::WebString();
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei returnedLogLength = 0;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetShaderInfoLog(
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shader, logLength, &returnedLogLength, log.get());
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(logLength, returnedLogLength + 1);
834f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebString res =
835f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebString::fromUTF8(log.get(), returnedLogLength);
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return res;
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(getShaderPrecisionFormat, GetShaderPrecisionFormat,
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dint*, WGC3Dint*)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
842f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebString WebGraphicsContext3DCommandBufferImpl::getShaderSource(
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId shader) {
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint logLength = 0;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &logLength);
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!logLength)
847f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return blink::WebString();
848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<GLchar[]> log(new GLchar[logLength]);
849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!log)
850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return blink::WebString();
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei returnedLogLength = 0;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetShaderSource(
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shader, logLength, &returnedLogLength, log.get());
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!returnedLogLength)
855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return blink::WebString();
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(logLength, returnedLogLength + 1);
857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebString res =
858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebString::fromUTF8(log.get(), returnedLogLength);
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return res;
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
862f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebString WebGraphicsContext3DCommandBufferImpl::
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getTranslatedShaderSourceANGLE(WebGLId shader) {
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint logLength = 0;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetShaderiv(
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shader, GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, &logLength);
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!logLength)
868f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return blink::WebString();
869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<GLchar[]> log(new GLchar[logLength]);
870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!log)
871f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return blink::WebString();
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei returnedLogLength = 0;
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetTranslatedShaderSourceANGLE(
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shader, logLength, &returnedLogLength, log.get());
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!returnedLogLength)
876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return blink::WebString();
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(logLength, returnedLogLength + 1);
878f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebString res =
879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebString::fromUTF8(log.get(), returnedLogLength);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return res;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
883f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebString WebGraphicsContext3DCommandBufferImpl::getString(
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum name) {
885f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return blink::WebString::fromUTF8(
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<const char*>(gl_->GetString(name)));
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getTexParameterfv, GetTexParameterfv,
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dfloat*)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getTexParameteriv, GetTexParameteriv,
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dint*)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getUniformfv, GetUniformfv, WebGLId, WGC3Dint, WGC3Dfloat*)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getUniformiv, GetUniformiv, WebGLId, WGC3Dint, WGC3Dint*)
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2R(getUniformLocation, GetUniformLocation,
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  WebGLId, const WGC3Dchar*, WGC3Dint)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getVertexAttribfv, GetVertexAttribfv,
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Duint, WGC3Denum, WGC3Dfloat*)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getVertexAttribiv, GetVertexAttribiv,
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Duint, WGC3Denum, WGC3Dint*)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WGC3Dsizeiptr WebGraphicsContext3DCommandBufferImpl::getVertexAttribOffset(
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Duint index, WGC3Denum pname) {
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLvoid* value = NULL;
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: If pname is ever a value that returns more then 1 element
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this will corrupt memory.
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetVertexAttribPointerv(index, pname, &value);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<WGC3Dsizeiptr>(reinterpret_cast<intptr_t>(value));
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(hint, Hint, WGC3Denum, WGC3Denum)
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isBuffer, IsBuffer, WebGLId, WGC3Dboolean)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isEnabled, IsEnabled, WGC3Denum, WGC3Dboolean)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isFramebuffer, IsFramebuffer, WebGLId, WGC3Dboolean)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isProgram, IsProgram, WebGLId, WGC3Dboolean)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isRenderbuffer, IsRenderbuffer, WebGLId, WGC3Dboolean)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isShader, IsShader, WebGLId, WGC3Dboolean)
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isTexture, IsTexture, WebGLId, WGC3Dboolean)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(lineWidth, LineWidth, WGC3Dfloat)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(linkProgram, LinkProgram, WebGLId)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(pixelStorei, PixelStorei, WGC3Denum, WGC3Dint)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(polygonOffset, PolygonOffset, WGC3Dfloat, WGC3Dfloat)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_7(readPixels, ReadPixels,
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei, WGC3Denum,
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, void*)
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::releaseShaderCompiler() {
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(renderbufferStorage, RenderbufferStorage,
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dsizei, WGC3Dsizei)
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(sampleCoverage, SampleCoverage, WGC3Dfloat, WGC3Dboolean)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(scissor, Scissor, WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::shaderSource(
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId shader, const WGC3Dchar* string) {
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint length = strlen(string);
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->ShaderSource(shader, 1, &string, &length);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(stencilFunc, StencilFunc, WGC3Denum, WGC3Dint, WGC3Duint)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(stencilFuncSeparate, StencilFuncSeparate,
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dint, WGC3Duint)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(stencilMask, StencilMask, WGC3Duint)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(stencilMaskSeparate, StencilMaskSeparate,
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Duint)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(stencilOp, StencilOp,
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Denum)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(stencilOpSeparate, StencilOpSeparate,
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Denum, WGC3Denum)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_9(texImage2D, TexImage2D,
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Denum, WGC3Dsizei, WGC3Dsizei,
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Denum, WGC3Denum, const void*)
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(texParameterf, TexParameterf,
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dfloat);
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const unsigned int kTextureWrapR = 0x8072;
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::texParameteri(
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum target, WGC3Denum pname, WGC3Dint param) {
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(kbr): figure out whether the setting of TEXTURE_WRAP_R in
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GraphicsContext3D.cpp is strictly necessary to avoid seams at the
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // edge of cube maps, and, if it is, push it into the GLES2 service
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // side code.
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pname == kTextureWrapR) {
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->TexParameteri(target, pname, param);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_9(texSubImage2D, TexSubImage2D,
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dsizei,
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dsizei, WGC3Denum, WGC3Denum, const void*)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(uniform1f, Uniform1f, WGC3Dint, WGC3Dfloat)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform1fv, Uniform1fv, WGC3Dint, WGC3Dsizei,
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(uniform1i, Uniform1i, WGC3Dint, WGC3Dint)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform1iv, Uniform1iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform2f, Uniform2f, WGC3Dint, WGC3Dfloat, WGC3Dfloat)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform2fv, Uniform2fv, WGC3Dint, WGC3Dsizei,
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform2i, Uniform2i, WGC3Dint, WGC3Dint, WGC3Dint)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform2iv, Uniform2iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*)
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(uniform3f, Uniform3f, WGC3Dint,
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dfloat, WGC3Dfloat, WGC3Dfloat)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform3fv, Uniform3fv, WGC3Dint, WGC3Dsizei,
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(uniform3i, Uniform3i, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform3iv, Uniform3iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_5(uniform4f, Uniform4f, WGC3Dint,
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dfloat, WGC3Dfloat, WGC3Dfloat, WGC3Dfloat)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform4fv, Uniform4fv, WGC3Dint, WGC3Dsizei,
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_5(uniform4i, Uniform4i, WGC3Dint,
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform4iv, Uniform4iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(uniformMatrix2fv, UniformMatrix2fv,
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Dsizei, WGC3Dboolean, const WGC3Dfloat*)
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(uniformMatrix3fv, UniformMatrix3fv,
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Dsizei, WGC3Dboolean, const WGC3Dfloat*)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(uniformMatrix4fv, UniformMatrix4fv,
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Dsizei, WGC3Dboolean, const WGC3Dfloat*)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(useProgram, UseProgram, WebGLId)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(validateProgram, ValidateProgram, WebGLId)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(vertexAttrib1f, VertexAttrib1f, WGC3Duint, WGC3Dfloat)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(vertexAttrib1fv, VertexAttrib1fv, WGC3Duint,
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(vertexAttrib2f, VertexAttrib2f, WGC3Duint,
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dfloat, WGC3Dfloat)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(vertexAttrib2fv, VertexAttrib2fv, WGC3Duint,
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(vertexAttrib3f, VertexAttrib3f, WGC3Duint,
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dfloat, WGC3Dfloat, WGC3Dfloat)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(vertexAttrib3fv, VertexAttrib3fv, WGC3Duint,
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_5(vertexAttrib4f, VertexAttrib4f, WGC3Duint,
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dfloat, WGC3Dfloat, WGC3Dfloat, WGC3Dfloat)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(vertexAttrib4fv, VertexAttrib4fv, WGC3Duint,
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::vertexAttribPointer(
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Duint index, WGC3Dint size, WGC3Denum type, WGC3Dboolean normalized,
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dsizei stride, WGC3Dintptr offset) {
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      index, size, type, normalized, stride,
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<void*>(static_cast<intptr_t>(offset)));
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(viewport, Viewport,
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei)
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(genBuffers, GenBuffers, WGC3Dsizei, WebGLId*);
10891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(genFramebuffers, GenFramebuffers, WGC3Dsizei, WebGLId*);
10911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(genRenderbuffers, GenRenderbuffers, WGC3Dsizei, WebGLId*);
10931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(genTextures, GenTextures, WGC3Dsizei, WebGLId*);
10951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(deleteBuffers, DeleteBuffers, WGC3Dsizei, WebGLId*);
10971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(deleteFramebuffers, DeleteFramebuffers, WGC3Dsizei, WebGLId*);
10991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(deleteRenderbuffers, DeleteRenderbuffers, WGC3Dsizei,
11011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 WebGLId*);
11021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(deleteTextures, DeleteTextures, WGC3Dsizei, WebGLId*);
11041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGLId WebGraphicsContext3DCommandBufferImpl::createBuffer() {
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint o;
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenBuffers(1, &o);
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return o;
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGLId WebGraphicsContext3DCommandBufferImpl::createFramebuffer() {
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint o = 0;
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenFramebuffers(1, &o);
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return o;
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGLId WebGraphicsContext3DCommandBufferImpl::createRenderbuffer() {
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint o;
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenRenderbuffers(1, &o);
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return o;
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGLId WebGraphicsContext3DCommandBufferImpl::createTexture() {
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint o;
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenTextures(1, &o);
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return o;
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::deleteBuffer(WebGLId buffer) {
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DeleteBuffers(1, &buffer);
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::deleteFramebuffer(
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId framebuffer) {
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DeleteFramebuffers(1, &framebuffer);
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::deleteRenderbuffer(
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId renderbuffer) {
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DeleteRenderbuffers(1, &renderbuffer);
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::deleteTexture(WebGLId texture) {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DeleteTextures(1, &texture);
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_R(createProgram, CreateProgram, WebGLId)
11481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_1R(createShader, CreateShader, WGC3Denum, WebGLId)
11501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_1(deleteProgram, DeleteProgram, WebGLId)
11521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_1(deleteShader, DeleteShader, WebGLId)
11541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::setErrorMessageCallback(
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGraphicsContext3D::WebGraphicsErrorMessageCallback* cb) {
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_message_callback_ = cb;
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::setContextLostCallback(
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGraphicsContext3D::WebGraphicsContextLostCallback* cb) {
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context_lost_callback_ = cb;
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WGC3Denum WebGraphicsContext3DCommandBufferImpl::getGraphicsResetStatusARB() {
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsCommandBufferContextLost() &&
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_lost_reason_ == GL_NO_ERROR) {
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GL_UNKNOWN_CONTEXT_RESET_ARB;
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return context_lost_reason_;
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::IsCommandBufferContextLost() {
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the channel shut down unexpectedly, let that supersede the
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // command buffer's state.
11777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (host_.get() && host_->IsLost())
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::CommandBuffer::State state = command_buffer_->GetLastState();
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state.error == gpu::error::kLostContext;
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGraphicsContext3DCommandBufferImpl*
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGraphicsContext3DCommandBufferImpl::CreateOffscreenContext(
11861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GpuChannelHost* host,
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebGraphicsContext3D::Attributes& attributes,
1188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const GURL& active_url,
1189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const SharedMemoryLimits& limits) {
11901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!host)
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
11921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return new WebGraphicsContext3DCommandBufferImpl(0,
11931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                   active_url,
11941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                   host,
11951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                   attributes,
11961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                   false,
1197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                   limits);
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_5(texImageIOSurface2DCHROMIUM, TexImageIOSurface2DCHROMIUM,
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Duint, WGC3Duint)
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_5(texStorage2DEXT, TexStorage2DEXT,
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Duint, WGC3Dint, WGC3Dint)
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGLId WebGraphicsContext3DCommandBufferImpl::createQueryEXT() {
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint o;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenQueriesEXT(1, &o);
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return o;
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::deleteQueryEXT(
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId query) {
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DeleteQueriesEXT(1, &query);
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1R(isQueryEXT, IsQueryEXT, WebGLId, WGC3Dboolean)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(beginQueryEXT, BeginQueryEXT, WGC3Denum, WebGLId)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(endQueryEXT, EndQueryEXT, WGC3Denum)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getQueryivEXT, GetQueryivEXT, WGC3Denum, WGC3Denum, WGC3Dint*)
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getQueryObjectuivEXT, GetQueryObjectuivEXT,
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WebGLId, WGC3Denum, WGC3Duint*)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DELEGATE_TO_GL_6(copyTextureCHROMIUM, CopyTextureCHROMIUM,  WGC3Denum,
1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 WebGLId, WebGLId, WGC3Dint, WGC3Denum, WGC3Denum);
1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(bindUniformLocationCHROMIUM, BindUniformLocationCHROMIUM,
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WebGLId, WGC3Dint, const WGC3Dchar*)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::shallowFlushCHROMIUM() {
1231d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  flush_id_ = GenFlushID();
1232d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gl_->ShallowFlushCHROMIUM();
1233d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::shallowFinishCHROMIUM() {
1236d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  flush_id_ = GenFlushID();
1237d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gl_->ShallowFinishCHROMIUM();
1238d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DELEGATE_TO_GL_1(waitSyncPoint, WaitSyncPointCHROMIUM, GLuint)
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebGraphicsContext3DCommandBufferImpl::loseContextCHROMIUM(
1243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    WGC3Denum current, WGC3Denum other) {
1244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gl_->LoseContextCHROMIUM(current, other);
1245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gl_->Flush();
1246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
12484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)DELEGATE_TO_GL_1(genMailboxCHROMIUM, GenMailboxCHROMIUM, WGC3Dbyte*)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(produceTextureCHROMIUM, ProduceTextureCHROMIUM,
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, const WGC3Dbyte*)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(consumeTextureCHROMIUM, ConsumeTextureCHROMIUM,
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, const WGC3Dbyte*)
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::insertEventMarkerEXT(
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WGC3Dchar* marker) {
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->InsertEventMarkerEXT(0, marker);
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::pushGroupMarkerEXT(
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WGC3Dchar* marker) {
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->PushGroupMarkerEXT(0, marker);
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL(popGroupMarkerEXT, PopGroupMarkerEXT);
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGLId WebGraphicsContext3DCommandBufferImpl::createVertexArrayOES() {
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint array;
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenVertexArraysOES(1, &array);
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return array;
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::deleteVertexArrayOES(
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId array) {
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DeleteVertexArraysOES(1, &array);
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1R(isVertexArrayOES, IsVertexArrayOES, WebGLId, WGC3Dboolean)
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(bindVertexArrayOES, BindVertexArrayOES, WebGLId)
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(bindTexImage2DCHROMIUM, BindTexImage2DCHROMIUM,
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(releaseTexImage2DCHROMIUM, ReleaseTexImage2DCHROMIUM,
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint)
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_2R(mapBufferCHROMIUM, MapBufferCHROMIUM, WGC3Denum, WGC3Denum,
1286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  void*)
1287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1R(unmapBufferCHROMIUM, UnmapBufferCHROMIUM, WGC3Denum,
1288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  WGC3Dboolean)
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_9(asyncTexImage2DCHROMIUM, AsyncTexImage2DCHROMIUM, WGC3Denum,
1291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Dint, WGC3Denum, WGC3Dsizei, WGC3Dsizei, WGC3Dint,
1292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Denum, WGC3Denum, const void*)
1293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_9(asyncTexSubImage2DCHROMIUM, AsyncTexSubImage2DCHROMIUM,
1294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dsizei,
1295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Dsizei, WGC3Denum, WGC3Denum, const void*)
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1(waitAsyncTexImage2DCHROMIUM, WaitAsyncTexImage2DCHROMIUM,
1298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Denum)
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_2(drawBuffersEXT, DrawBuffersEXT, WGC3Dsizei, const WGC3Denum*)
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)DELEGATE_TO_GL_4(drawArraysInstancedANGLE, DrawArraysInstancedANGLE, WGC3Denum,
13037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 WGC3Dint, WGC3Dsizei, WGC3Dsizei)
13047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
13057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::drawElementsInstancedANGLE(
13067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WGC3Denum mode,
13077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WGC3Dsizei count,
13087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WGC3Denum type,
13097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WGC3Dintptr offset,
13107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WGC3Dsizei primcount) {
13117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gl_->DrawElementsInstancedANGLE(
13127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      mode, count, type,
13137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      reinterpret_cast<void*>(static_cast<intptr_t>(offset)), primcount);
13147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
13157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
13167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)DELEGATE_TO_GL_2(vertexAttribDivisorANGLE, VertexAttribDivisorANGLE, WGC3Duint,
13177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 WGC3Duint)
13187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
13191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_3R(createImageCHROMIUM, CreateImageCHROMIUM,
13201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                  WGC3Dsizei, WGC3Dsizei, WGC3Denum,
13211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                  WGC3Duint);
13221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
13231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_1(destroyImageCHROMIUM, DestroyImageCHROMIUM, WGC3Duint);
13241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
13251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_3(getImageParameterivCHROMIUM, GetImageParameterivCHROMIUM,
13261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 WGC3Duint, WGC3Denum, GLint*);
13271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
13281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2R(mapImageCHROMIUM, MapImageCHROMIUM,
13291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                  WGC3Duint, WGC3Denum, void*);
13301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
13311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_1(unmapImageCHROMIUM, UnmapImageCHROMIUM, WGC3Duint);
13321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
133368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)GrGLInterface* WebGraphicsContext3DCommandBufferImpl::createGrGLInterface() {
1334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return skia_bindings::CreateCommandBufferSkiaGLBinding();
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WGC3Denum convertReason(gpu::error::ContextLostReason reason) {
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (reason) {
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case gpu::error::kGuilty:
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GL_GUILTY_CONTEXT_RESET_ARB;
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case gpu::error::kInnocent:
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GL_INNOCENT_CONTEXT_RESET_ARB;
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case gpu::error::kUnknown:
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GL_UNKNOWN_CONTEXT_RESET_ARB;
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GL_UNKNOWN_CONTEXT_RESET_ARB;
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::OnGpuChannelLost() {
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context_lost_reason_ = convertReason(
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_buffer_->GetLastState().context_lost_reason);
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (context_lost_callback_) {
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context_lost_callback_->onContextLost();
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(host_.get());
1363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
1364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::AutoLock lock(g_all_shared_contexts_lock.Get());
1365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    g_all_shared_contexts.Get().erase(host_.get());
1366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::OnErrorMessage(
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& message, int id) {
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error_message_callback_) {
1372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebString str = blink::WebString::fromUTF8(message.c_str());
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_message_callback_->onErrorMessage(str, id);
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1378