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