webgraphicscontext3d_command_buffer_impl.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
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"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkTypes.h"
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/common/gpu/gl_bindings_skia_cmd_buffer.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::LazyInstance<base::Lock>::Leaky
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_all_shared_contexts_lock = LAZY_INSTANCE_INITIALIZER;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::LazyInstance<std::set<WebGraphicsContext3DCommandBufferImpl*> >
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_all_shared_contexts = LAZY_INSTANCE_INITIALIZER;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearSharedContextsIfInShareSet(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGraphicsContext3DCommandBufferImpl* context) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the given context isn't in the share set, that means that it
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or another context it was previously sharing with already
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // provoked a lost context. Other contexts might have since been
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // successfully created and added to the share set, so do not clear
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // out the share set unless we know that all the contexts in there
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are supposed to be lost simultaneously.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock lock(g_all_shared_contexts_lock.Get());
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<WebGraphicsContext3DCommandBufferImpl*>* share_set =
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      g_all_shared_contexts.Pointer();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<WebGraphicsContext3DCommandBufferImpl*>::iterator iter =
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           share_set->begin(); iter != share_set->end(); ++iter) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (context == *iter) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      share_set->clear();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t ClampUint64ToSizeT(uint64 value) {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  value = std::min(value,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   static_cast<uint64>(std::numeric_limits<size_t>::max()));
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return static_cast<size_t>(value);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)uint32_t GenFlushID() {
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  static base::subtle::Atomic32 flush_id = 0;
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::subtle::Atomic32 my_id = base::subtle::Barrier_AtomicIncrement(
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      &flush_id, 1);
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return static_cast<uint32_t>(my_id);
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Singleton used to initialize and terminate the gles2 library.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2Initializer {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2Initializer() {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gles2::Initialize();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~GLES2Initializer() {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gles2::Terminate();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GLES2Initializer);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::LazyInstance<GLES2Initializer> g_gles2_initializer =
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace anonymous
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Helper macros to reduce the amount of code.
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL(name, glname)                                    \
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name() {                    \
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname();                                                        \
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_R(name, glname, rt)                              \
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)rt WebGraphicsContext3DCommandBufferImpl::name() {                      \
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return gl_->glname();                                                 \
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_1(name, glname, t1)                              \
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1) {               \
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1);                                                      \
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_1R(name, glname, t1, rt)                         \
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)rt WebGraphicsContext3DCommandBufferImpl::name(t1 a1) {                 \
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return gl_->glname(a1);                                               \
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_1RB(name, glname, t1, rt)                        \
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)rt WebGraphicsContext3DCommandBufferImpl::name(t1 a1) {                 \
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return gl_->glname(a1) ? true : false;                                \
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_2(name, glname, t1, t2)                          \
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2) {        \
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2);                                                  \
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_2R(name, glname, t1, t2, rt)                     \
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)rt WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2) {          \
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return gl_->glname(a1, a2);                                           \
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_3(name, glname, t1, t2, t3)                      \
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3) { \
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3);                                              \
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define DELEGATE_TO_GL_3R(name, glname, t1, t2, t3, rt)                 \
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)rt WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3) {   \
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return gl_->glname(a1, a2, a3);                                       \
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_4(name, glname, t1, t2, t3, t4)                  \
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,   \
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t4 a4) {               \
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3, a4);                                          \
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_4R(name, glname, t1, t2, t3, t4, rt)             \
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)rt WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,     \
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                               t4 a4) {                 \
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return gl_->glname(a1, a2, a3, a4);                                   \
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_5(name, glname, t1, t2, t3, t4, t5)              \
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,   \
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t4 a4, t5 a5) {        \
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3, a4, a5);                                      \
170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_6(name, glname, t1, t2, t3, t4, t5, t6)          \
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,   \
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t4 a4, t5 a5, t6 a6) { \
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3, a4, a5, a6);                                  \
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_7(name, glname, t1, t2, t3, t4, t5, t6, t7)      \
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,   \
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t4 a4, t5 a5, t6 a6,   \
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t7 a7) {               \
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3, a4, a5, a6, a7);                              \
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_8(name, glname, t1, t2, t3, t4, t5, t6, t7, t8)  \
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,   \
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t4 a4, t5 a5, t6 a6,   \
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t7 a7, t8 a8) {        \
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8);                          \
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define DELEGATE_TO_GL_9(name, glname, t1, t2, t3, t4, t5, t6, t7, t8, t9) \
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::name(t1 a1, t2 a2, t3 a3,   \
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t4 a4, t5 a5, t6 a6,   \
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 t7 a7, t8 a8, t9 a9) { \
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8, a9);                      \
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebGraphicsContext3DErrorMessageCallback
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public gpu::gles2::GLES2Implementation::ErrorMessageCallback {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGraphicsContext3DErrorMessageCallback(
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebGraphicsContext3DCommandBufferImpl* context)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : graphics_context_(context) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnErrorMessage(const char* msg, int id) OVERRIDE;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebGraphicsContext3DCommandBufferImpl* graphics_context_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebGraphicsContext3DErrorMessageCallback);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DErrorMessageCallback::OnErrorMessage(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* msg, int id) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  graphics_context_->OnErrorMessage(msg, id);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebGraphicsContext3DCommandBufferImpl::SharedMemoryLimits::SharedMemoryLimits()
2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : command_buffer_size(kDefaultCommandBufferSize),
2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      start_transfer_buffer_size(kDefaultStartTransferBufferSize),
2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      min_transfer_buffer_size(kDefaultMinTransferBufferSize),
2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      max_transfer_buffer_size(kDefaultMaxTransferBufferSize),
2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      mapped_memory_reclaim_limit(gpu::gles2::GLES2Implementation::kNoLimit) {}
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGraphicsContext3DCommandBufferImpl::WebGraphicsContext3DCommandBufferImpl(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int surface_id,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& active_url,
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GpuChannelHost* host,
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const base::WeakPtr<WebGraphicsContext3DSwapBuffersClient>& swap_client,
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const Attributes& attributes,
2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    bool bind_generates_resources,
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const SharedMemoryLimits& limits)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : initialize_failed_(false),
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visible_(false),
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      free_command_buffer_when_invisible_(false),
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      host_(host),
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      surface_id_(surface_id),
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      active_url_(active_url),
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      swap_client_(swap_client),
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_lost_callback_(0),
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_lost_reason_(GL_NO_ERROR),
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_message_callback_(0),
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      swapbuffers_complete_callback_(0),
2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      attributes_(attributes),
2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      gpu_preference_(attributes.preferDiscreteGPU ? gfx::PreferDiscreteGpu
2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                   : gfx::PreferIntegratedGpu),
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_ptr_factory_(this),
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      initialized_(false),
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_(NULL),
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame_number_(0),
2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      bind_generates_resources_(bind_generates_resources),
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      use_echo_for_swap_ack_(true),
2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      mem_limits_(limits),
256d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      flush_id_(0) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if (defined(OS_MACOSX) || defined(OS_WIN)) && !defined(USE_AURA)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get ViewMsg_SwapBuffers_ACK from browser for single-threaded path.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  use_echo_for_swap_ack_ =
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_line.HasSwitch(switches::kEnableThreadedCompositing);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGraphicsContext3DCommandBufferImpl::
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~WebGraphicsContext3DCommandBufferImpl() {
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (real_gl_) {
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    real_gl_->SetErrorMessageCallback(NULL);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::AutoLock lock(g_all_shared_contexts_lock.Get());
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_all_shared_contexts.Pointer()->erase(this);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Destroy();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::MaybeInitializeGL() {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (initialized_)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (initialize_failed_)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRACE_EVENT0("gpu", "WebGfxCtx3DCmdBfrImpl::MaybeInitializeGL");
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!CreateContext(surface_id_ != 0)) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Destroy();
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    initialize_failed_ = true;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(twiz):  This code is too fragile in that it assumes that only WebGL
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // contexts will request noExtensions.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gl_ && attributes_.noExtensions)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_->EnableFeatureCHROMIUM("webgl_enable_glsl_webgl_validation");
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_buffer_->SetChannelErrorCallback(
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&WebGraphicsContext3DCommandBufferImpl::OnContextLost,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_buffer_->SetOnConsoleMessageCallback(
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&WebGraphicsContext3DCommandBufferImpl::OnErrorMessage,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_error_message_callback_.reset(
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new WebGraphicsContext3DErrorMessageCallback(this));
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  real_gl_->SetErrorMessageCallback(client_error_message_callback_.get());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  free_command_buffer_when_invisible_ =
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_line.HasSwitch(switches::kEnablePruneGpuCommandBuffers);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set attributes_ from created offscreen context.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
316a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    static const int pcount = 4;
317a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    static const GLenum pnames[pcount] = {
318a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GL_ALPHA_BITS,
319a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GL_DEPTH_BITS,
320a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GL_STENCIL_BITS,
321a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GL_SAMPLE_BUFFERS,
322a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    };
323a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GLint pvalues[pcount] = { 0, 0, 0, 0 };
324a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
325a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    gl_->GetMultipleIntegervCHROMIUM(pnames, pcount,
326a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                     pvalues, sizeof(pvalues));
327a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
328a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    attributes_.alpha = pvalues[0] > 0;
329a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    attributes_.depth = pvalues[1] > 0;
330a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    attributes_.stencil = pvalues[2] > 0;
331a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    attributes_.antialias = pvalues[3] > 0;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  visible_ = true;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initialized_ = true;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::InitializeCommandBuffer(
34058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool onscreen) {
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!host_.get())
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to lock g_all_shared_contexts to ensure that the context we picked
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for our share group isn't deleted.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (There's also a lock in our destructor.)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock lock(g_all_shared_contexts_lock.Get());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBufferProxyImpl* share_group = NULL;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (attributes_.shareResources) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGraphicsContext3DCommandBufferImpl* share_group_context =
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        g_all_shared_contexts.Pointer()->empty() ?
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            NULL : *g_all_shared_contexts.Pointer()->begin();
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    share_group = share_group_context ?
3537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        share_group_context->command_buffer_.get() : NULL;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int32> attribs;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(ALPHA_SIZE);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(attributes_.alpha ? 8 : 0);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(DEPTH_SIZE);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(attributes_.depth ? 24 : 0);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(STENCIL_SIZE);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(attributes_.stencil ? 8 : 0);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(SAMPLES);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(attributes_.antialias ? 4 : 0);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(SAMPLE_BUFFERS);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(attributes_.antialias ? 1 : 0);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(NONE);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a proxy to a command buffer in the GPU process.
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (onscreen) {
3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    command_buffer_.reset(host_->CreateViewCommandBuffer(
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        surface_id_,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        share_group,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        attribs,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        active_url_,
3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        gpu_preference_));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    command_buffer_.reset(host_->CreateOffscreenCommandBuffer(
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gfx::Size(1, 1),
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        share_group,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        attribs,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        active_url_,
3837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        gpu_preference_));
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!command_buffer_)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the command buffer.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return command_buffer_->Initialize();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::CreateContext(
39458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool onscreen) {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure the gles2 library is initialized first in a thread safe way.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_gles2_initializer.Get();
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!command_buffer_ &&
39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      !InitializeCommandBuffer(onscreen)) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the GLES2 helper, which writes the command buffer protocol.
4047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gles2_helper_.reset(new gpu::gles2::GLES2CmdHelper(command_buffer_.get()));
4051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!gles2_helper_->Initialize(mem_limits_.command_buffer_size))
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (attributes_.noAutomaticFlushes)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gles2_helper_->SetAutomaticFlushes(false);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a transfer buffer used to copy resources between the renderer
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // process and the GPU process.
4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  transfer_buffer_ .reset(new gpu::TransferBuffer(gles2_helper_.get()));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_ptr<base::AutoLock> lock;
416558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_refptr<gpu::gles2::ShareGroup> share_group;
417558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (attributes_.shareResources) {
418558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    // Make sure two clients don't try to create a new ShareGroup
419558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    // simultaneously.
420558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    lock.reset(new base::AutoLock(g_all_shared_contexts_lock.Get()));
421558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    if (!g_all_shared_contexts.Pointer()->empty()) {
422558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      share_group = (*g_all_shared_contexts.Pointer()->begin())
423558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          ->GetImplementation()->share_group();
424558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      DCHECK(share_group);
425558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    }
426558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the object exposing the OpenGL API.
4297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  real_gl_.reset(new gpu::gles2::GLES2Implementation(
4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gles2_helper_.get(),
431558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      share_group,
4327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      transfer_buffer_.get(),
43390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bind_generates_resources_,
4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      command_buffer_.get()));
4357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gl_ = real_gl_.get();
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
437558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (attributes_.shareResources) {
438558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    // Don't add ourselves to the list before others can get to our ShareGroup.
439558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    g_all_shared_contexts.Pointer()->insert(this);
440558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    lock.reset();
441558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
442558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!real_gl_->Initialize(
4441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      mem_limits_.start_transfer_buffer_size,
4451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      mem_limits_.min_transfer_buffer_size,
4461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      mem_limits_.max_transfer_buffer_size,
4471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      mem_limits_.mapped_memory_reclaim_limit)) {
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switches::kEnableGpuClientTracing)) {
4537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    trace_gl_.reset(new gpu::gles2::GLES2TraceImplementation(gl_));
4547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    gl_ = trace_gl_.get();
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::makeContextCurrent() {
46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!MaybeInitializeGL())
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gles2::SetGLContext(gl_);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_buffer_->GetLastError() != gpu::error::kNoError)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
470d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)uint32_t WebGraphicsContext3DCommandBufferImpl::lastFlushID() {
471d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return flush_id_;
472d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
473d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_R(insertSyncPoint, InsertSyncPointCHROMIUM, unsigned int)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::Destroy() {
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gl_) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // First flush the context to ensure that any pending frees of resources
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // are completed. Otherwise, if this context is part of a share group,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // those resources might leak. Also, any remaining side effects of commands
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // issued on this context might not be visible to other contexts in the
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // share group.
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_->Flush();
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_ = NULL;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  trace_gl_.reset();
4887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  real_gl_.reset();
4897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  transfer_buffer_.reset();
4907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gles2_helper_.reset();
4917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  real_gl_.reset();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_buffer_) {
494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (host_.get())
4957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      host_->DestroyCommandBuffer(command_buffer_.release());
4967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    command_buffer_.reset();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_ = NULL;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(apatrick,piman): This should be renamed to something clearer.
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebGraphicsContext3DCommandBufferImpl::GetGPUProcessID() {
504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return host_.get() ? host_->gpu_host_id() : 0;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebGraphicsContext3DCommandBufferImpl::GetChannelID() {
508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return host_.get() ? host_->client_id() : 0;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebGraphicsContext3DCommandBufferImpl::GetContextID() {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return command_buffer_->GetRouteID();
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)gpu::ContextSupport*
5168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)WebGraphicsContext3DCommandBufferImpl::GetContextSupport() {
5178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return real_gl_.get();
5188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
5198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::prepareTexture() {
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRACE_EVENT1("gpu",
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "WebGraphicsContext3DCommandBufferImpl::SwapBuffers",
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "frame", frame_number_);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame_number_++;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies the contents of the off-screen render target into the texture
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used by the compositor.
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ShouldUseSwapClient())
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    swap_client_->OnViewContextSwapBuffersPosted();
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_buffer_->GetLastState().error == gpu::error::kNoError)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_->SwapBuffers();
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (use_echo_for_swap_ack_) {
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_buffer_->Echo(base::Bind(
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &WebGraphicsContext3DCommandBufferImpl::OnSwapBuffersComplete,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        weak_ptr_factory_.GetWeakPtr()));
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It appears that making the compositor's on-screen context current on
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // other platforms implies this flush. TODO(kbr): this means that the
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TOUCH build and, in the future, other platforms might need this.
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->Flush();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::postSubBufferCHROMIUM(
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int x, int y, int width, int height) {
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same flow control as WebGraphicsContext3DCommandBufferImpl::prepareTexture
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (see above).
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ShouldUseSwapClient())
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    swap_client_->OnViewContextSwapBuffersPosted();
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->PostSubBufferCHROMIUM(x, y, width, height);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_buffer_->Echo(base::Bind(
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &WebGraphicsContext3DCommandBufferImpl::OnSwapBuffersComplete,
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      weak_ptr_factory_.GetWeakPtr()));
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)DELEGATE_TO_GL_3(reshapeWithScaleFactor, ResizeCHROMIUM, int, int, float)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::synthesizeGLError(
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum error) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (std::find(synthetic_errors_.begin(), synthetic_errors_.end(), error) ==
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      synthetic_errors_.end()) {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    synthetic_errors_.push_back(error);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_4R(mapBufferSubDataCHROMIUM, MapBufferSubDataCHROMIUM, WGC3Denum,
569868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  WGC3Dintptr, WGC3Dsizeiptr, WGC3Denum, void*)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
571868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1(unmapBufferSubDataCHROMIUM, UnmapBufferSubDataCHROMIUM,
572868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 const void*)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* WebGraphicsContext3DCommandBufferImpl::mapTexSubImage2DCHROMIUM(
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum target,
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dint level,
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dint xoffset,
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dint yoffset,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dsizei width,
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dsizei height,
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum format,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum type,
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum access) {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gl_->MapTexSubImage2DCHROMIUM(
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, level, xoffset, yoffset, width, height, format, type, access);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1(unmapTexSubImage2DCHROMIUM, UnmapTexSubImage2DCHROMIUM,
589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 const void*)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::setVisibilityCHROMIUM(
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool visible) {
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->Flush();
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  visible_ = visible;
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_buffer_->SetSurfaceVisible(visible);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!visible)
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    real_gl_->FreeEverything();
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_3(discardFramebufferEXT, DiscardFramebufferEXT, WGC3Denum,
601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Dsizei, const WGC3Denum*)
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::discardBackbufferCHROMIUM() {
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->Flush();
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_buffer_->DiscardBackbuffer();
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::ensureBackbufferCHROMIUM() {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->Flush();
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_buffer_->EnsureBackbuffer();
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::copyTextureToParentTextureCHROMIUM(
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId texture, WebGLId parentTexture) {
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL(rateLimitOffscreenContextCHROMIUM,
619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               RateLimitOffscreenContextCHROMIUM)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebString WebGraphicsContext3DCommandBufferImpl::
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getRequestableExtensionsCHROMIUM() {
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WebKit::WebString::fromUTF8(
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_->GetRequestableExtensionsCHROMIUM());
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
627868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1(requestExtensionCHROMIUM, RequestExtensionCHROMIUM,
628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 const char*)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::blitFramebufferCHROMIUM(
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dint srcX0, WGC3Dint srcY0, WGC3Dint srcX1, WGC3Dint srcY1,
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dint dstX0, WGC3Dint dstY0, WGC3Dint dstX1, WGC3Dint dstY1,
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dbitfield mask, WGC3Denum filter) {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BlitFramebufferEXT(
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      srcX0, srcY0, srcX1, srcY1,
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dstX0, dstY0, dstX1, dstY1,
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mask, filter);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
640868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_5(renderbufferStorageMultisampleCHROMIUM,
641868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 RenderbufferStorageMultisampleEXT, WGC3Denum, WGC3Dsizei,
642868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Denum, WGC3Dsizei, WGC3Dsizei)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
644868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1R(createStreamTextureCHROMIUM, CreateStreamTextureCHROMIUM,
645868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  WebGLId, WebGLId)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1(destroyStreamTextureCHROMIUM, DestroyStreamTextureCHROMIUM,
648868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WebGLId)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(activeTexture, ActiveTexture, WGC3Denum)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(attachShader, AttachShader, WebGLId, WebGLId)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(bindAttribLocation, BindAttribLocation, WebGLId,
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Duint, const WGC3Dchar*)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(bindBuffer, BindBuffer, WGC3Denum, WebGLId)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6597dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDELEGATE_TO_GL_2(bindFramebuffer, BindFramebuffer, WGC3Denum, WebGLId)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(bindRenderbuffer, BindRenderbuffer, WGC3Denum, WebGLId)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(bindTexture, BindTexture, WGC3Denum, WebGLId)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(blendColor, BlendColor,
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dclampf, WGC3Dclampf, WGC3Dclampf, WGC3Dclampf)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(blendEquation, BlendEquation, WGC3Denum)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(blendEquationSeparate, BlendEquationSeparate,
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(blendFunc, BlendFunc, WGC3Denum, WGC3Denum)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(blendFuncSeparate, BlendFuncSeparate,
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Denum, WGC3Denum)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(bufferData, BufferData,
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dsizeiptr, const void*, WGC3Denum)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(bufferSubData, BufferSubData,
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dintptr, WGC3Dsizeiptr, const void*)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1R(checkFramebufferStatus, CheckFramebufferStatus,
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  WGC3Denum, WGC3Denum)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(clear, Clear, WGC3Dbitfield)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(clearColor, ClearColor,
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dclampf, WGC3Dclampf, WGC3Dclampf, WGC3Dclampf)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(clearDepth, ClearDepthf, WGC3Dclampf)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(clearStencil, ClearStencil, WGC3Dint)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(colorMask, ColorMask,
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dboolean, WGC3Dboolean, WGC3Dboolean, WGC3Dboolean)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(compileShader, CompileShader, WebGLId)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_8(compressedTexImage2D, CompressedTexImage2D,
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Denum, WGC3Dint, WGC3Dint,
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dsizei, WGC3Dsizei, const void*)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_9(compressedTexSubImage2D, CompressedTexSubImage2D,
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint,
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dsizei, const void*)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_8(copyTexImage2D, CopyTexImage2D,
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Denum, WGC3Dint, WGC3Dint,
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dsizei, WGC3Dsizei, WGC3Dint)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_8(copyTexSubImage2D, CopyTexSubImage2D,
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint,
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dsizei, WGC3Dsizei)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(cullFace, CullFace, WGC3Denum)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(depthFunc, DepthFunc, WGC3Denum)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(depthMask, DepthMask, WGC3Dboolean)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(depthRange, DepthRangef, WGC3Dclampf, WGC3Dclampf)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(detachShader, DetachShader, WebGLId, WebGLId)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(disable, Disable, WGC3Denum)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(disableVertexAttribArray, DisableVertexAttribArray,
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Duint)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(drawArrays, DrawArrays, WGC3Denum, WGC3Dint, WGC3Dsizei)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::drawElements(WGC3Denum mode,
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                         WGC3Dsizei count,
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                         WGC3Denum type,
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                         WGC3Dintptr offset) {
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DrawElements(
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode, count, type,
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<void*>(static_cast<intptr_t>(offset)));
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(enable, Enable, WGC3Denum)
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(enableVertexAttribArray, EnableVertexAttribArray,
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Duint)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::finish() {
749d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  flush_id_ = GenFlushID();
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->Finish();
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!visible_ && free_command_buffer_when_invisible_)
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    real_gl_->FreeEverything();
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::flush() {
756d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  flush_id_ = GenFlushID();
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->Flush();
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!visible_ && free_command_buffer_when_invisible_)
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    real_gl_->FreeEverything();
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(framebufferRenderbuffer, FramebufferRenderbuffer,
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Denum, WebGLId)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_5(framebufferTexture2D, FramebufferTexture2D,
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Denum, WebGLId, WGC3Dint)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(frontFace, FrontFace, WGC3Denum)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(generateMipmap, GenerateMipmap, WGC3Denum)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::getActiveAttrib(
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId program, WGC3Duint index, ActiveInfo& info) {
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!program) {
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    synthesizeGLError(GL_INVALID_VALUE);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_name_length = -1;
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetProgramiv(
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_name_length);
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max_name_length < 0)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<GLchar[]> name(new GLchar[max_name_length]);
784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!name) {
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    synthesizeGLError(GL_OUT_OF_MEMORY);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei length = 0;
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint size = -1;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum type = 0;
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetActiveAttrib(
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      program, index, max_name_length, &length, &size, &type, name.get());
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size < 0) {
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.name = WebKit::WebString::fromUTF8(name.get(), length);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.type = type;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.size = size;
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::getActiveUniform(
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId program, WGC3Duint index, ActiveInfo& info) {
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_name_length = -1;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetProgramiv(
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max_name_length);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max_name_length < 0)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<GLchar[]> name(new GLchar[max_name_length]);
810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!name) {
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    synthesizeGLError(GL_OUT_OF_MEMORY);
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei length = 0;
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint size = -1;
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum type = 0;
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetActiveUniform(
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      program, index, max_name_length, &length, &size, &type, name.get());
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size < 0) {
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.name = WebKit::WebString::fromUTF8(name.get(), length);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.type = type;
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.size = size;
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(getAttachedShaders, GetAttachedShaders,
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WebGLId, WGC3Dsizei, WGC3Dsizei*, WebGLId*)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2R(getAttribLocation, GetAttribLocation,
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  WebGLId, const WGC3Dchar*, WGC3Dint)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(getBooleanv, GetBooleanv, WGC3Denum, WGC3Dboolean*)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getBufferParameteriv, GetBufferParameteriv,
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dint*)
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebGraphicsContext3D::Attributes
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGraphicsContext3DCommandBufferImpl::getContextAttributes() {
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return attributes_;
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WGC3Denum WebGraphicsContext3DCommandBufferImpl::getError() {
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!synthetic_errors_.empty()) {
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<WGC3Denum>::iterator iter = synthetic_errors_.begin();
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum err = *iter;
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    synthetic_errors_.erase(iter);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gl_->GetError();
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::isContextLost() {
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return initialize_failed_ ||
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (command_buffer_ && IsCommandBufferContextLost()) ||
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_lost_reason_ != GL_NO_ERROR;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(getFloatv, GetFloatv, WGC3Denum, WGC3Dfloat*)
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(getFramebufferAttachmentParameteriv,
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GetFramebufferAttachmentParameteriv,
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Denum, WGC3Dint*)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(getIntegerv, GetIntegerv, WGC3Denum, WGC3Dint*)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getProgramiv, GetProgramiv, WebGLId, WGC3Denum, WGC3Dint*)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebString WebGraphicsContext3DCommandBufferImpl::getProgramInfoLog(
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId program) {
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint logLength = 0;
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!logLength)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebString();
877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<GLchar[]> log(new GLchar[logLength]);
878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!log)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebString();
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei returnedLogLength = 0;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetProgramInfoLog(
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      program, logLength, &returnedLogLength, log.get());
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(logLength, returnedLogLength + 1);
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebString res =
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebString::fromUTF8(log.get(), returnedLogLength);
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return res;
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getRenderbufferParameteriv, GetRenderbufferParameteriv,
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dint*)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getShaderiv, GetShaderiv, WebGLId, WGC3Denum, WGC3Dint*)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebString WebGraphicsContext3DCommandBufferImpl::getShaderInfoLog(
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId shader) {
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint logLength = 0;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!logLength)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebString();
900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<GLchar[]> log(new GLchar[logLength]);
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!log)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebString();
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei returnedLogLength = 0;
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetShaderInfoLog(
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shader, logLength, &returnedLogLength, log.get());
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(logLength, returnedLogLength + 1);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebString res =
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebString::fromUTF8(log.get(), returnedLogLength);
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return res;
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(getShaderPrecisionFormat, GetShaderPrecisionFormat,
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dint*, WGC3Dint*)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebString WebGraphicsContext3DCommandBufferImpl::getShaderSource(
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId shader) {
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint logLength = 0;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &logLength);
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!logLength)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebString();
921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<GLchar[]> log(new GLchar[logLength]);
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!log)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebString();
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei returnedLogLength = 0;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetShaderSource(
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shader, logLength, &returnedLogLength, log.get());
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!returnedLogLength)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebString();
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(logLength, returnedLogLength + 1);
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebString res =
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebString::fromUTF8(log.get(), returnedLogLength);
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return res;
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebString WebGraphicsContext3DCommandBufferImpl::
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getTranslatedShaderSourceANGLE(WebGLId shader) {
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint logLength = 0;
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetShaderiv(
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shader, GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, &logLength);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!logLength)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebString();
942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<GLchar[]> log(new GLchar[logLength]);
943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!log)
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebString();
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei returnedLogLength = 0;
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetTranslatedShaderSourceANGLE(
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shader, logLength, &returnedLogLength, log.get());
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!returnedLogLength)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebString();
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(logLength, returnedLogLength + 1);
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebString res =
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebString::fromUTF8(log.get(), returnedLogLength);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return res;
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebString WebGraphicsContext3DCommandBufferImpl::getString(
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum name) {
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WebKit::WebString::fromUTF8(
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<const char*>(gl_->GetString(name)));
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getTexParameterfv, GetTexParameterfv,
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dfloat*)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getTexParameteriv, GetTexParameteriv,
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dint*)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getUniformfv, GetUniformfv, WebGLId, WGC3Dint, WGC3Dfloat*)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getUniformiv, GetUniformiv, WebGLId, WGC3Dint, WGC3Dint*)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2R(getUniformLocation, GetUniformLocation,
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  WebGLId, const WGC3Dchar*, WGC3Dint)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getVertexAttribfv, GetVertexAttribfv,
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Duint, WGC3Denum, WGC3Dfloat*)
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getVertexAttribiv, GetVertexAttribiv,
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Duint, WGC3Denum, WGC3Dint*)
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WGC3Dsizeiptr WebGraphicsContext3DCommandBufferImpl::getVertexAttribOffset(
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Duint index, WGC3Denum pname) {
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLvoid* value = NULL;
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: If pname is ever a value that returns more then 1 element
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this will corrupt memory.
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetVertexAttribPointerv(index, pname, &value);
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<WGC3Dsizeiptr>(reinterpret_cast<intptr_t>(value));
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(hint, Hint, WGC3Denum, WGC3Denum)
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isBuffer, IsBuffer, WebGLId, WGC3Dboolean)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isEnabled, IsEnabled, WGC3Denum, WGC3Dboolean)
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isFramebuffer, IsFramebuffer, WebGLId, WGC3Dboolean)
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isProgram, IsProgram, WebGLId, WGC3Dboolean)
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isRenderbuffer, IsRenderbuffer, WebGLId, WGC3Dboolean)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isShader, IsShader, WebGLId, WGC3Dboolean)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1RB(isTexture, IsTexture, WebGLId, WGC3Dboolean)
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(lineWidth, LineWidth, WGC3Dfloat)
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(linkProgram, LinkProgram, WebGLId)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(pixelStorei, PixelStorei, WGC3Denum, WGC3Dint)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(polygonOffset, PolygonOffset, WGC3Dfloat, WGC3Dfloat)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_7(readPixels, ReadPixels,
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei, WGC3Denum,
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, void*)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::releaseShaderCompiler() {
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(renderbufferStorage, RenderbufferStorage,
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dsizei, WGC3Dsizei)
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(sampleCoverage, SampleCoverage, WGC3Dfloat, WGC3Dboolean)
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(scissor, Scissor, WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::shaderSource(
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId shader, const WGC3Dchar* string) {
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint length = strlen(string);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->ShaderSource(shader, 1, &string, &length);
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(stencilFunc, StencilFunc, WGC3Denum, WGC3Dint, WGC3Duint)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(stencilFuncSeparate, StencilFuncSeparate,
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dint, WGC3Duint)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(stencilMask, StencilMask, WGC3Duint)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(stencilMaskSeparate, StencilMaskSeparate,
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Duint)
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(stencilOp, StencilOp,
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Denum)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(stencilOpSeparate, StencilOpSeparate,
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Denum, WGC3Denum)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_9(texImage2D, TexImage2D,
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Denum, WGC3Dsizei, WGC3Dsizei,
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Denum, WGC3Denum, const void*)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(texParameterf, TexParameterf,
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Denum, WGC3Dfloat);
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const unsigned int kTextureWrapR = 0x8072;
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::texParameteri(
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Denum target, WGC3Denum pname, WGC3Dint param) {
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(kbr): figure out whether the setting of TEXTURE_WRAP_R in
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GraphicsContext3D.cpp is strictly necessary to avoid seams at the
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // edge of cube maps, and, if it is, push it into the GLES2 service
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // side code.
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pname == kTextureWrapR) {
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->TexParameteri(target, pname, param);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_9(texSubImage2D, TexSubImage2D,
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dsizei,
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dsizei, WGC3Denum, WGC3Denum, const void*)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(uniform1f, Uniform1f, WGC3Dint, WGC3Dfloat)
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform1fv, Uniform1fv, WGC3Dint, WGC3Dsizei,
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(uniform1i, Uniform1i, WGC3Dint, WGC3Dint)
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform1iv, Uniform1iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*)
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform2f, Uniform2f, WGC3Dint, WGC3Dfloat, WGC3Dfloat)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform2fv, Uniform2fv, WGC3Dint, WGC3Dsizei,
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform2i, Uniform2i, WGC3Dint, WGC3Dint, WGC3Dint)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform2iv, Uniform2iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*)
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(uniform3f, Uniform3f, WGC3Dint,
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dfloat, WGC3Dfloat, WGC3Dfloat)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform3fv, Uniform3fv, WGC3Dint, WGC3Dsizei,
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(uniform3i, Uniform3i, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform3iv, Uniform3iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*)
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_5(uniform4f, Uniform4f, WGC3Dint,
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dfloat, WGC3Dfloat, WGC3Dfloat, WGC3Dfloat)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform4fv, Uniform4fv, WGC3Dint, WGC3Dsizei,
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_5(uniform4i, Uniform4i, WGC3Dint,
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(uniform4iv, Uniform4iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(uniformMatrix2fv, UniformMatrix2fv,
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Dsizei, WGC3Dboolean, const WGC3Dfloat*)
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(uniformMatrix3fv, UniformMatrix3fv,
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Dsizei, WGC3Dboolean, const WGC3Dfloat*)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(uniformMatrix4fv, UniformMatrix4fv,
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Dsizei, WGC3Dboolean, const WGC3Dfloat*)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(useProgram, UseProgram, WebGLId)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(validateProgram, ValidateProgram, WebGLId)
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(vertexAttrib1f, VertexAttrib1f, WGC3Duint, WGC3Dfloat)
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(vertexAttrib1fv, VertexAttrib1fv, WGC3Duint,
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(vertexAttrib2f, VertexAttrib2f, WGC3Duint,
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dfloat, WGC3Dfloat)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(vertexAttrib2fv, VertexAttrib2fv, WGC3Duint,
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(vertexAttrib3f, VertexAttrib3f, WGC3Duint,
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dfloat, WGC3Dfloat, WGC3Dfloat)
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(vertexAttrib3fv, VertexAttrib3fv, WGC3Duint,
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_5(vertexAttrib4f, VertexAttrib4f, WGC3Duint,
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dfloat, WGC3Dfloat, WGC3Dfloat, WGC3Dfloat)
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(vertexAttrib4fv, VertexAttrib4fv, WGC3Duint,
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const WGC3Dfloat*)
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::vertexAttribPointer(
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Duint index, WGC3Dint size, WGC3Denum type, WGC3Dboolean normalized,
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WGC3Dsizei stride, WGC3Dintptr offset) {
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      index, size, type, normalized, stride,
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<void*>(static_cast<intptr_t>(offset)));
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_4(viewport, Viewport,
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei)
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(genBuffers, GenBuffers, WGC3Dsizei, WebGLId*);
11621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(genFramebuffers, GenFramebuffers, WGC3Dsizei, WebGLId*);
11641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(genRenderbuffers, GenRenderbuffers, WGC3Dsizei, WebGLId*);
11661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(genTextures, GenTextures, WGC3Dsizei, WebGLId*);
11681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(deleteBuffers, DeleteBuffers, WGC3Dsizei, WebGLId*);
11701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(deleteFramebuffers, DeleteFramebuffers, WGC3Dsizei, WebGLId*);
11721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(deleteRenderbuffers, DeleteRenderbuffers, WGC3Dsizei,
11741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 WebGLId*);
11751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2(deleteTextures, DeleteTextures, WGC3Dsizei, WebGLId*);
11771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGLId WebGraphicsContext3DCommandBufferImpl::createBuffer() {
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint o;
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenBuffers(1, &o);
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return o;
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGLId WebGraphicsContext3DCommandBufferImpl::createFramebuffer() {
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint o = 0;
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenFramebuffers(1, &o);
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return o;
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGLId WebGraphicsContext3DCommandBufferImpl::createRenderbuffer() {
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint o;
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenRenderbuffers(1, &o);
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return o;
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGLId WebGraphicsContext3DCommandBufferImpl::createTexture() {
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint o;
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenTextures(1, &o);
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return o;
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::deleteBuffer(WebGLId buffer) {
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DeleteBuffers(1, &buffer);
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::deleteFramebuffer(
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId framebuffer) {
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DeleteFramebuffers(1, &framebuffer);
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::deleteRenderbuffer(
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId renderbuffer) {
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DeleteRenderbuffers(1, &renderbuffer);
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::deleteTexture(WebGLId texture) {
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DeleteTextures(1, &texture);
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_R(createProgram, CreateProgram, WebGLId)
12211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
12221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_1R(createShader, CreateShader, WGC3Denum, WebGLId)
12231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
12241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_1(deleteProgram, DeleteProgram, WebGLId)
12251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
12261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_1(deleteShader, DeleteShader, WebGLId)
12271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::ShouldUseSwapClient() {
12291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return !!swap_client_.get();
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::OnSwapBuffersComplete() {
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef WebGraphicsContext3DSwapBuffersClient WGC3DSwapClient;
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This may be called after tear-down of the RenderView.
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ShouldUseSwapClient()) {
1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FROM_HERE,
1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&WGC3DSwapClient::OnViewContextSwapBuffersComplete,
1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   swap_client_));
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (swapbuffers_complete_callback_)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    swapbuffers_complete_callback_->onSwapBuffersComplete();
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::setErrorMessageCallback(
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGraphicsContext3D::WebGraphicsErrorMessageCallback* cb) {
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_message_callback_ = cb;
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::setContextLostCallback(
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGraphicsContext3D::WebGraphicsContextLostCallback* cb) {
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context_lost_callback_ = cb;
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WGC3Denum WebGraphicsContext3DCommandBufferImpl::getGraphicsResetStatusARB() {
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsCommandBufferContextLost() &&
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_lost_reason_ == GL_NO_ERROR) {
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GL_UNKNOWN_CONTEXT_RESET_ARB;
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return context_lost_reason_;
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebGraphicsContext3DCommandBufferImpl::IsCommandBufferContextLost() {
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the channel shut down unexpectedly, let that supersede the
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // command buffer's state.
12687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (host_.get() && host_->IsLost())
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::CommandBuffer::State state = command_buffer_->GetLastState();
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state.error == gpu::error::kLostContext;
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGraphicsContext3DCommandBufferImpl*
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGraphicsContext3DCommandBufferImpl::CreateOffscreenContext(
12771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GpuChannelHost* host,
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebGraphicsContext3D::Attributes& attributes,
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& active_url) {
12801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!host)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<WebGraphicsContext3DSwapBuffersClient> null_client;
12831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return new WebGraphicsContext3DCommandBufferImpl(0,
12841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                   active_url,
12851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                   host,
12861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                   null_client,
12871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                   attributes,
12881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                   false,
12891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                   SharedMemoryLimits());
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setSwapBuffersCompleteCallbackCHROMIUM(
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGraphicsContext3D::WebGraphicsSwapBuffersCompleteCallbackCHROMIUM* cb) {
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  swapbuffers_complete_callback_ = cb;
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_5(texImageIOSurface2DCHROMIUM, TexImageIOSurface2DCHROMIUM,
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Duint, WGC3Duint)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_5(texStorage2DEXT, TexStorage2DEXT,
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Duint, WGC3Dint, WGC3Dint)
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGLId WebGraphicsContext3DCommandBufferImpl::createQueryEXT() {
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint o;
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenQueriesEXT(1, &o);
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return o;
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::deleteQueryEXT(
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId query) {
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DeleteQueriesEXT(1, &query);
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1R(isQueryEXT, IsQueryEXT, WebGLId, WGC3Dboolean)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(beginQueryEXT, BeginQueryEXT, WGC3Denum, WebGLId)
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(endQueryEXT, EndQueryEXT, WGC3Denum)
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getQueryivEXT, GetQueryivEXT, WGC3Denum, WGC3Denum, WGC3Dint*)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(getQueryObjectuivEXT, GetQueryObjectuivEXT,
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WebGLId, WGC3Denum, WGC3Duint*)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DELEGATE_TO_GL_6(copyTextureCHROMIUM, CopyTextureCHROMIUM,  WGC3Denum,
1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 WebGLId, WebGLId, WGC3Dint, WGC3Denum, WGC3Denum);
1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_3(bindUniformLocationCHROMIUM, BindUniformLocationCHROMIUM,
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WebGLId, WGC3Dint, const WGC3Dchar*)
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1328d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::shallowFlushCHROMIUM() {
1329d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  flush_id_ = GenFlushID();
1330d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gl_->ShallowFlushCHROMIUM();
1331d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1332d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1333d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::shallowFinishCHROMIUM() {
1334d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  flush_id_ = GenFlushID();
1335d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gl_->ShallowFinishCHROMIUM();
1336d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DELEGATE_TO_GL_1(waitSyncPoint, WaitSyncPointCHROMIUM, GLuint)
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebGraphicsContext3DCommandBufferImpl::loseContextCHROMIUM(
1341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    WGC3Denum current, WGC3Denum other) {
1342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gl_->LoseContextCHROMIUM(current, other);
1343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gl_->Flush();
1344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
13464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)DELEGATE_TO_GL_1(genMailboxCHROMIUM, GenMailboxCHROMIUM, WGC3Dbyte*)
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(produceTextureCHROMIUM, ProduceTextureCHROMIUM,
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, const WGC3Dbyte*)
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(consumeTextureCHROMIUM, ConsumeTextureCHROMIUM,
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, const WGC3Dbyte*)
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::insertEventMarkerEXT(
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WGC3Dchar* marker) {
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->InsertEventMarkerEXT(0, marker);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::pushGroupMarkerEXT(
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WGC3Dchar* marker) {
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->PushGroupMarkerEXT(0, marker);
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL(popGroupMarkerEXT, PopGroupMarkerEXT);
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebGLId WebGraphicsContext3DCommandBufferImpl::createVertexArrayOES() {
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint array;
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenVertexArraysOES(1, &array);
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return array;
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::deleteVertexArrayOES(
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebGLId array) {
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DeleteVertexArraysOES(1, &array);
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1R(isVertexArrayOES, IsVertexArrayOES, WebGLId, WGC3Dboolean)
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_1(bindVertexArrayOES, BindVertexArrayOES, WebGLId)
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(bindTexImage2DCHROMIUM, BindTexImage2DCHROMIUM,
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint)
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DELEGATE_TO_GL_2(releaseTexImage2DCHROMIUM, ReleaseTexImage2DCHROMIUM,
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 WGC3Denum, WGC3Dint)
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_2R(mapBufferCHROMIUM, MapBufferCHROMIUM, WGC3Denum, WGC3Denum,
1384868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  void*)
1385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1R(unmapBufferCHROMIUM, UnmapBufferCHROMIUM, WGC3Denum,
1386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  WGC3Dboolean)
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_9(asyncTexImage2DCHROMIUM, AsyncTexImage2DCHROMIUM, WGC3Denum,
1389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Dint, WGC3Denum, WGC3Dsizei, WGC3Dsizei, WGC3Dint,
1390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Denum, WGC3Denum, const void*)
1391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_9(asyncTexSubImage2DCHROMIUM, AsyncTexSubImage2DCHROMIUM,
1392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dsizei,
1393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Dsizei, WGC3Denum, WGC3Denum, const void*)
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_1(waitAsyncTexImage2DCHROMIUM, WaitAsyncTexImage2DCHROMIUM,
1396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 WGC3Denum)
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DELEGATE_TO_GL_2(drawBuffersEXT, DrawBuffersEXT, WGC3Dsizei, const WGC3Denum*)
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)DELEGATE_TO_GL_4(drawArraysInstancedANGLE, DrawArraysInstancedANGLE, WGC3Denum,
14017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 WGC3Dint, WGC3Dsizei, WGC3Dsizei)
14027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
14037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::drawElementsInstancedANGLE(
14047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WGC3Denum mode,
14057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WGC3Dsizei count,
14067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WGC3Denum type,
14077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WGC3Dintptr offset,
14087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WGC3Dsizei primcount) {
14097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gl_->DrawElementsInstancedANGLE(
14107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      mode, count, type,
14117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      reinterpret_cast<void*>(static_cast<intptr_t>(offset)), primcount);
14127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
14137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
14147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)DELEGATE_TO_GL_2(vertexAttribDivisorANGLE, VertexAttribDivisorANGLE, WGC3Duint,
14157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 WGC3Duint)
14167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
14171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_3R(createImageCHROMIUM, CreateImageCHROMIUM,
14181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                  WGC3Dsizei, WGC3Dsizei, WGC3Denum,
14191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                  WGC3Duint);
14201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
14211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_1(destroyImageCHROMIUM, DestroyImageCHROMIUM, WGC3Duint);
14221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
14231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_3(getImageParameterivCHROMIUM, GetImageParameterivCHROMIUM,
14241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 WGC3Duint, WGC3Denum, GLint*);
14251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
14261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_2R(mapImageCHROMIUM, MapImageCHROMIUM,
14271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                  WGC3Duint, WGC3Denum, void*);
14281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
14291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DELEGATE_TO_GL_1(unmapImageCHROMIUM, UnmapImageCHROMIUM, WGC3Duint);
14301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
143168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)GrGLInterface* WebGraphicsContext3DCommandBufferImpl::createGrGLInterface() {
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return webkit::gpu::CreateCommandBufferSkiaGLBinding();
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WGC3Denum convertReason(gpu::error::ContextLostReason reason) {
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (reason) {
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case gpu::error::kGuilty:
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GL_GUILTY_CONTEXT_RESET_ARB;
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case gpu::error::kInnocent:
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GL_INNOCENT_CONTEXT_RESET_ARB;
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case gpu::error::kUnknown:
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GL_UNKNOWN_CONTEXT_RESET_ARB;
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GL_UNKNOWN_CONTEXT_RESET_ARB;
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::OnContextLost() {
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context_lost_reason_ = convertReason(
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_buffer_->GetLastState().context_lost_reason);
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (context_lost_callback_) {
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context_lost_callback_->onContextLost();
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (attributes_.shareResources)
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClearSharedContextsIfInShareSet(this);
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ShouldUseSwapClient())
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    swap_client_->OnViewContextSwapBuffersAborted();
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebGraphicsContext3DCommandBufferImpl::OnErrorMessage(
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& message, int id) {
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error_message_callback_) {
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebKit::WebString str = WebKit::WebString::fromUTF8(message.c_str());
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_message_callback_->onErrorMessage(str, id);
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1474