1d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/*
2d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * Copyright (C) 2009 Apple Inc. All rights reserved.
3d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) *
4d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * modification, are permitted provided that the following conditions
6d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * are met:
7d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
8d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
9d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
10d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
11d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
12d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) *
13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */
25d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
26d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "config.h"
27d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLRenderingContextBase.h"
28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionMessages.h"
30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
31d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/dom/ExceptionCode.h"
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/fetch/ImageResource.h"
33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/Settings.h"
35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/HTMLCanvasElement.h"
36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/HTMLImageElement.h"
37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/HTMLVideoElement.h"
38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/ImageData.h"
39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/ANGLEInstancedArrays.h"
40d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/html/canvas/EXTBlendMinMax.h"
41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/EXTFragDepth.h"
426f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "core/html/canvas/EXTShaderTextureLOD.h"
43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/EXTTextureFilterAnisotropic.h"
44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/OESElementIndexUint.h"
45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/OESStandardDerivatives.h"
46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/OESTextureFloat.h"
47d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/OESTextureFloatLinear.h"
48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/OESTextureHalfFloat.h"
49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/OESTextureHalfFloatLinear.h"
50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/OESVertexArrayObject.h"
51d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLActiveInfo.h"
52d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLBuffer.h"
53d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLCompressedTextureATC.h"
5410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "core/html/canvas/WebGLCompressedTextureETC1.h"
55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLCompressedTexturePVRTC.h"
56d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLCompressedTextureS3TC.h"
57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLContextAttributes.h"
58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLContextEvent.h"
59d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLContextGroup.h"
60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLDebugRendererInfo.h"
61d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLDebugShaders.h"
62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLDepthTexture.h"
63d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLDrawBuffers.h"
64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLFramebuffer.h"
65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLLoseContext.h"
66d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLProgram.h"
67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLRenderbuffer.h"
68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLShader.h"
69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLShaderPrecisionFormat.h"
70c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/html/canvas/WebGLSharedWebGraphicsContext3D.h"
71d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLTexture.h"
72d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/canvas/WebGLUniformLocation.h"
73e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/inspector/ConsoleMessage.h"
74d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h"
75d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/loader/FrameLoader.h"
76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/loader/FrameLoaderClient.h"
77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/RenderBox.h"
78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/CheckedInt.h"
79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/NotImplemented.h"
805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/geometry/IntSize.h"
825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h"
83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/graphics/UnacceleratedImageBufferSurface.h"
847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/graphics/gpu/AcceleratedImageBufferSurface.h"
85d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/graphics/gpu/DrawingBuffer.h"
86d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "public/platform/Platform.h"
87d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
88d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "wtf/PassOwnPtr.h"
89d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "wtf/Uint32Array.h"
90d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "wtf/text/StringBuilder.h"
91d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
92c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
94d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)const double secondsBetweenRestoreAttempts = 1.0;
95d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)const int maxGLErrorsAllowedToConsole = 256;
96d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)const unsigned maxGLActiveContexts = 16;
97d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
98c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// FIXME: Oilpan: static vectors to heap allocated WebGLRenderingContextBase objects
99c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// are kept here. This relies on the WebGLRenderingContextBase finalization to
100c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// explicitly retire themselves from these vectors, but it'd be preferable if
101c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// the references were traced as per usual.
102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)Vector<WebGLRenderingContextBase*>& WebGLRenderingContextBase::activeContexts()
103d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
104d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DEFINE_STATIC_LOCAL(Vector<WebGLRenderingContextBase*>, activeContexts, ());
105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return activeContexts;
106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)Vector<WebGLRenderingContextBase*>& WebGLRenderingContextBase::forciblyEvictedContexts()
109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DEFINE_STATIC_LOCAL(Vector<WebGLRenderingContextBase*>, forciblyEvictedContexts, ());
111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return forciblyEvictedContexts;
112d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
113d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::forciblyLoseOldestContext(const String& reason)
115d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
116d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    size_t candidateID = oldestContextIndex();
117d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (candidateID >= activeContexts().size())
118d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLRenderingContextBase* candidate = activeContexts()[candidateID];
121d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
122197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // This context could belong to a dead page and the last JavaScript reference has already
123197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // been lost. Garbage collection might be triggered in the middle of this function, for
124197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // example, printWarningToConsole() causes an upcall to JavaScript.
125197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // Must make sure that the context is not deleted until the call stack unwinds.
126197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    RefPtrWillBeRawPtr<WebGLRenderingContextBase> protect(candidate);
127197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    candidate->printWarningToConsole(reason);
129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    InspectorInstrumentation::didFireWebGLWarning(candidate->canvas());
130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // This will call deactivateContext once the context has actually been lost.
1327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    candidate->forceLostContext(WebGLRenderingContextBase::SyntheticLostContext, WebGLRenderingContextBase::WhenAvailable);
133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)size_t WebGLRenderingContextBase::oldestContextIndex()
136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!activeContexts().size())
138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return maxGLActiveContexts;
139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLRenderingContextBase* candidate = activeContexts().first();
1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(!candidate->isContextLost());
142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    size_t candidateID = 0;
143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (size_t ii = 1; ii < activeContexts().size(); ++ii) {
144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        WebGLRenderingContextBase* context = activeContexts()[ii];
1457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(!context->isContextLost());
1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (context->webContext()->lastFlushID() < candidate->webContext()->lastFlushID()) {
147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            candidate = context;
148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            candidateID = ii;
149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return candidateID;
153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)IntSize WebGLRenderingContextBase::oldestContextSize()
156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    IntSize size;
158d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    size_t candidateID = oldestContextIndex();
160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (candidateID < activeContexts().size()) {
161d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        WebGLRenderingContextBase* candidate = activeContexts()[candidateID];
162d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        size.setWidth(candidate->drawingBufferWidth());
163d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        size.setHeight(candidate->drawingBufferHeight());
164d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
165d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
166d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return size;
167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
168d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::activateContext(WebGLRenderingContextBase* context)
170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
171d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned removedContexts = 0;
172d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    while (activeContexts().size() >= maxGLActiveContexts && removedContexts < maxGLActiveContexts) {
173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        forciblyLoseOldestContext("WARNING: Too many active WebGL contexts. Oldest context will be lost.");
174d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        removedContexts++;
175d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
176d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(!context->isContextLost());
178d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!activeContexts().contains(context))
179d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        activeContexts().append(context);
180d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
181d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebGLRenderingContextBase::deactivateContext(WebGLRenderingContextBase* context)
183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
184d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    size_t position = activeContexts().find(context);
185d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (position != WTF::kNotFound)
186d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        activeContexts().remove(position);
1877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
188d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebGLRenderingContextBase::addToEvictedList(WebGLRenderingContextBase* context)
1907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!forciblyEvictedContexts().contains(context))
192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        forciblyEvictedContexts().append(context);
193d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
194d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebGLRenderingContextBase::removeFromEvictedList(WebGLRenderingContextBase* context)
196d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
197d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    size_t position = forciblyEvictedContexts().find(context);
198d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (position != WTF::kNotFound)
199d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        forciblyEvictedContexts().remove(position);
2007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
201d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebGLRenderingContextBase::willDestroyContext(WebGLRenderingContextBase* context)
2037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
2047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    removeFromEvictedList(context);
2057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    deactivateContext(context);
206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
207d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Try to re-enable the oldest inactive contexts.
208d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    while(activeContexts().size() < maxGLActiveContexts && forciblyEvictedContexts().size()) {
209d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        WebGLRenderingContextBase* evictedContext = forciblyEvictedContexts().first();
210d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!evictedContext->m_restoreAllowed) {
211d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            forciblyEvictedContexts().remove(0);
212d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            continue;
213d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
214d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
215f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        IntSize desiredSize = DrawingBuffer::adjustSize(evictedContext->clampedCanvasSize(), IntSize(), evictedContext->m_maxTextureSize);
216d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // If there's room in the pixel budget for this context, restore it.
218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!desiredSize.isEmpty()) {
219d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            forciblyEvictedContexts().remove(0);
220d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            evictedContext->forceRestoreContext();
221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
222d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
223d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
224d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
225d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class WebGLRenderingContextEvictionManager : public ContextEvictionManager {
227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)public:
228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void forciblyLoseOldestContext(const String& reason) {
229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        WebGLRenderingContextBase::forciblyLoseOldestContext(reason);
230d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    };
231d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    IntSize oldestContextSize() {
232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLRenderingContextBase::oldestContextSize();
233d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    };
234d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)};
235d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
236d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)namespace {
237d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
238d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    class ScopedDrawingBufferBinder {
239c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        STACK_ALLOCATED();
240d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    public:
241d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ScopedDrawingBufferBinder(DrawingBuffer* drawingBuffer, WebGLFramebuffer* framebufferBinding)
242d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            : m_drawingBuffer(drawingBuffer)
243d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            , m_framebufferBinding(framebufferBinding)
244d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
245d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // Commit DrawingBuffer if needed (e.g., for multisampling)
246d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (!m_framebufferBinding && m_drawingBuffer)
247d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_drawingBuffer->commit();
248d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
249d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
250d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ~ScopedDrawingBufferBinder()
251d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
252d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // Restore DrawingBuffer if needed
253d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (!m_framebufferBinding && m_drawingBuffer)
254d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_drawingBuffer->bind();
255d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
256d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
257d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    private:
258d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        DrawingBuffer* m_drawingBuffer;
259c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        RawPtrWillBeMember<WebGLFramebuffer> m_framebufferBinding;
260d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    };
261d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
262d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Platform3DObject objectOrZero(WebGLObject* object)
263d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
264d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return object ? object->object() : 0;
265d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
266d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
267d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint clamp(GLint value, GLint min, GLint max)
268d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
269d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (value < min)
270d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            value = min;
271d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (value > max)
272d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            value = max;
273d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return value;
274d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
275d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
276d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Return true if a character belongs to the ASCII subset as defined in
277d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // GLSL ES 1.0 spec section 3.1.
278d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool validateCharacter(unsigned char c)
279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
280d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // Printing characters are valid except " $ ` @ \ ' DEL.
281d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (c >= 32 && c <= 126
282d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && c != '"' && c != '$' && c != '`' && c != '@' && c != '\\' && c != '\'')
283d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return true;
284d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // Horizontal tab, line feed, vertical tab, form feed, carriage return
285d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // are also valid.
286d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (c >= 9 && c <= 13)
287d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return true;
288d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
289d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
290d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
291d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool isPrefixReserved(const String& name)
292d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
293d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (name.startsWith("gl_") || name.startsWith("webgl_") || name.startsWith("_webgl_"))
294d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return true;
295d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
296d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
297d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
298d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Strips comments from shader text. This allows non-ASCII characters
299d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // to be used in comments without potentially breaking OpenGL
300d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // implementations not expecting characters outside the GLSL ES set.
301d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    class StripComments {
302d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    public:
303d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        StripComments(const String& str)
304d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            : m_parseState(BeginningOfLine)
305d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            , m_sourceString(str)
306d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            , m_length(str.length())
307d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            , m_position(0)
308d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
309d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            parse();
310d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
311d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
312d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        String result()
313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
314d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return m_builder.toString();
315d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
316d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
317d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    private:
318d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        bool hasMoreCharacters() const
319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
320d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return (m_position < m_length);
321d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
322d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        void parse()
324d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
325d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            while (hasMoreCharacters()) {
326d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                process(current());
327d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                // process() might advance the position.
328d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                if (hasMoreCharacters())
329d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    advance();
330d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
331d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
332d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
333d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        void process(UChar);
334d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
335d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        bool peek(UChar& character) const
336d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
337d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (m_position + 1 >= m_length)
338d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return false;
339d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            character = m_sourceString[m_position + 1];
340d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return true;
341d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
342d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
343d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        UChar current()
344d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
345d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            ASSERT_WITH_SECURITY_IMPLICATION(m_position < m_length);
346d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return m_sourceString[m_position];
347d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
348d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
349d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        void advance()
350d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
351d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            ++m_position;
352d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
353d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
354d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        static bool isNewline(UChar character)
355d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
356d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // Don't attempt to canonicalize newline related characters.
357d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return (character == '\n' || character == '\r');
358d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
359d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
360d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        void emit(UChar character)
361d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
362d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_builder.append(character);
363d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
364d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
365d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        enum ParseState {
366d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // Have not seen an ASCII non-whitespace character yet on
367d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // this line. Possible that we might see a preprocessor
368d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // directive.
369d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            BeginningOfLine,
370d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
371d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // Have seen at least one ASCII non-whitespace character
372d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // on this line.
373d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            MiddleOfLine,
374d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
375d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // Handling a preprocessor directive. Passes through all
376d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // characters up to the end of the line. Disables comment
377d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // processing.
378d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            InPreprocessorDirective,
379d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
380d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // Handling a single-line comment. The comment text is
381d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // replaced with a single space.
382d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            InSingleLineComment,
383d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
384d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // Handling a multi-line comment. Newlines are passed
385d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // through to preserve line numbers.
386d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            InMultiLineComment
387d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        };
388d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
389d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ParseState m_parseState;
390d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        String m_sourceString;
391d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        unsigned m_length;
392d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        unsigned m_position;
393d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        StringBuilder m_builder;
394d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    };
395d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
396d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void StripComments::process(UChar c)
397d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
398d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (isNewline(c)) {
399d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // No matter what state we are in, pass through newlines
400d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // so we preserve line numbers.
401d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            emit(c);
402d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
403d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (m_parseState != InMultiLineComment)
404d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_parseState = BeginningOfLine;
405d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
406d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
407d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
408d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
409d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        UChar temp = 0;
410d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        switch (m_parseState) {
411d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case BeginningOfLine:
412d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (WTF::isASCIISpace(c)) {
413d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                emit(c);
414d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                break;
415d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
416d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
417d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (c == '#') {
418d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_parseState = InPreprocessorDirective;
419d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                emit(c);
420d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                break;
421d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
422d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
423d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // Transition to normal state and re-handle character.
424d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_parseState = MiddleOfLine;
425d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            process(c);
426d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
427d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
428d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case MiddleOfLine:
429d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (c == '/' && peek(temp)) {
430d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                if (temp == '/') {
431d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    m_parseState = InSingleLineComment;
432d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    emit(' ');
433d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    advance();
434d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
435d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                }
436d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
437d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                if (temp == '*') {
438d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    m_parseState = InMultiLineComment;
439d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    // Emit the comment start in case the user has
440d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    // an unclosed comment and we want to later
441d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    // signal an error.
442d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    emit('/');
443d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    emit('*');
444d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    advance();
445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
446d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                }
447d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
448d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
449d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            emit(c);
450d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
451d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
452d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case InPreprocessorDirective:
453d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // No matter what the character is, just pass it
454d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // through. Do not parse comments in this state. This
455d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // might not be the right thing to do long term, but it
456d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // should handle the #error preprocessor directive.
457d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            emit(c);
458d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
459d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
460d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case InSingleLineComment:
461d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // The newline code at the top of this function takes care
462d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // of resetting our state when we get out of the
463d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // single-line comment. Swallow all other characters.
464d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
465d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
466d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case InMultiLineComment:
467d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (c == '*' && peek(temp) && temp == '/') {
468d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                emit('*');
469d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                emit('/');
470d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_parseState = MiddleOfLine;
471d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                advance();
472d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                break;
473d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
474d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
475d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // Swallow all other characters. Unclear whether we may
476d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // want or need to just emit a space per character to try
477d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // to preserve column numbers for debugging purposes.
478d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
479d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
480d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
481d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} // namespace anonymous
482d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
48343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)class ScopedTexture2DRestorer {
484c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    STACK_ALLOCATED();
48543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)public:
486c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    explicit ScopedTexture2DRestorer(WebGLRenderingContextBase* context)
48743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        : m_context(context)
48843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    {
48943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    }
49043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
49143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    ~ScopedTexture2DRestorer()
49243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    {
49343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        m_context->restoreCurrentTexture2D();
49443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    }
49543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
49643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)private:
497c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<WebGLRenderingContextBase> m_context;
49843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)};
49943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
500c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class WebGLRenderingContextLostCallback FINAL : public NoBaseWillBeGarbageCollectedFinalized<WebGLRenderingContextLostCallback>, public blink::WebGraphicsContext3D::WebGraphicsContextLostCallback {
501c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
502d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)public:
503c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static PassOwnPtrWillBeRawPtr<WebGLRenderingContextLostCallback> create(WebGLRenderingContextBase* context)
504c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
505c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return adoptPtrWillBeNoop(new WebGLRenderingContextLostCallback(context));
506c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
507c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
508c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual ~WebGLRenderingContextLostCallback() { }
509c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void onContextLost() { m_context->forceLostContext(WebGLRenderingContextBase::RealLostContext, WebGLRenderingContextBase::Auto); }
511c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
512c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void trace(Visitor* visitor)
513c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
514c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        visitor->trace(m_context);
515c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
516c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
517d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)private:
518c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    explicit WebGLRenderingContextLostCallback(WebGLRenderingContextBase* context)
519c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_context(context) { }
520c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
521c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<WebGLRenderingContextBase> m_context;
522d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)};
523d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
524c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class WebGLRenderingContextErrorMessageCallback FINAL : public NoBaseWillBeGarbageCollectedFinalized<WebGLRenderingContextErrorMessageCallback>, public blink::WebGraphicsContext3D::WebGraphicsErrorMessageCallback {
525c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
526d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)public:
527c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static PassOwnPtrWillBeRawPtr<WebGLRenderingContextErrorMessageCallback> create(WebGLRenderingContextBase* context)
528c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
529c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return adoptPtrWillBeNoop(new WebGLRenderingContextErrorMessageCallback(context));
530c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
531c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
532c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual ~WebGLRenderingContextErrorMessageCallback() { }
533c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
534d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    virtual void onErrorMessage(const blink::WebString& message, blink::WGC3Dint)
535d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
536d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (m_context->m_synthesizedErrorsToConsole)
537d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_context->printGLErrorToConsole(message);
538d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        InspectorInstrumentation::didFireWebGLErrorOrWarning(m_context->canvas(), message);
539d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
540c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
541c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void trace(Visitor* visitor)
542c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
543c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        visitor->trace(m_context);
544c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
545c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
546d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)private:
547c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    explicit WebGLRenderingContextErrorMessageCallback(WebGLRenderingContextBase* context)
548c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_context(context) { }
549c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
550c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<WebGLRenderingContextBase> m_context;
551d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)};
552d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
553d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLRenderingContextBase::WebGLRenderingContextBase(HTMLCanvasElement* passedCanvas, PassOwnPtr<blink::WebGraphicsContext3D> context, WebGLContextAttributes* requestedAttributes)
554d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : CanvasRenderingContext(passedCanvas)
555d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , ActiveDOMObject(&passedCanvas->document())
5567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_contextLostMode(NotLostContext)
5577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_autoRecoveryMethod(Manual)
558d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_dispatchContextLostEventTimer(this, &WebGLRenderingContextBase::dispatchContextLostEvent)
559d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_restoreAllowed(false)
560d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_restoreTimer(this, &WebGLRenderingContextBase::maybeRestoreContext)
561d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_generatedImageCache(4)
562d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_requestedAttributes(requestedAttributes->clone())
563d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_synthesizedErrorsToConsole(true)
564d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_numGLErrorsToConsoleAllowed(maxGLErrorsAllowedToConsole)
565d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_multisamplingAllowed(false)
566d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_multisamplingObserverRegistered(false)
567d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_onePlusMaxNonDefaultTextureUnit(0)
5685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    , m_savingImage(false)
569d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
570a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    ASSERT(context);
571d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
572d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_contextGroup = WebGLContextGroup::create();
573d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_contextGroup->addContext(this);
574d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
575d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_maxViewportDims[0] = m_maxViewportDims[1] = 0;
576a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    context->getIntegerv(GL_MAX_VIEWPORT_DIMS, m_maxViewportDims);
577d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
578c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtr<DrawingBuffer> buffer = createDrawingBuffer(context);
579c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!buffer)
580a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return;
581d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
582c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#if ENABLE(OILPAN)
583c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_sharedWebGraphicsContext3D = WebGLSharedWebGraphicsContext3D::create(buffer.release());
584c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#else
585c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_drawingBuffer = buffer.release();
586c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#endif
587c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
588c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    drawingBuffer()->bind();
589a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    setupFlags();
590a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    initializeNewContext();
591d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
592d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
593f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)PassRefPtr<DrawingBuffer> WebGLRenderingContextBase::createDrawingBuffer(PassOwnPtr<blink::WebGraphicsContext3D> context)
594f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
595f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RefPtr<WebGLRenderingContextEvictionManager> contextEvictionManager = adoptRef(new WebGLRenderingContextEvictionManager());
596f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
597f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    blink::WebGraphicsContext3D::Attributes attrs;
598f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    attrs.alpha = m_requestedAttributes->alpha();
599f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    attrs.depth = m_requestedAttributes->depth();
600f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    attrs.stencil = m_requestedAttributes->stencil();
601f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    attrs.antialias = m_requestedAttributes->antialias();
602f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    attrs.premultipliedAlpha = m_requestedAttributes->premultipliedAlpha();
603f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    DrawingBuffer::PreserveDrawingBuffer preserve = m_requestedAttributes->preserveDrawingBuffer() ? DrawingBuffer::Preserve : DrawingBuffer::Discard;
604f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return DrawingBuffer::create(context, clampedCanvasSize(), preserve, attrs, contextEvictionManager.release());
605f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
606f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
607d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::initializeNewContext()
608d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
609d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!isContextLost());
610d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_needsUpdate = true;
611d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_markedCanvasDirty = false;
612d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_activeTextureUnit = 0;
613d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_packAlignment = 4;
614d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_unpackAlignment = 4;
615d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_unpackFlipY = false;
616d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_unpackPremultiplyAlpha = false;
617d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_unpackColorspaceConversion = GC3D_BROWSER_DEFAULT_WEBGL;
618d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_boundArrayBuffer = nullptr;
619d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_currentProgram = nullptr;
620d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_framebufferBinding = nullptr;
621d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_renderbufferBinding = nullptr;
622d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_depthMask = true;
623d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_stencilEnabled = false;
624d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_stencilMask = 0xFFFFFFFF;
625d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_stencilMaskBack = 0xFFFFFFFF;
626d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_stencilFuncRef = 0;
627d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_stencilFuncRefBack = 0;
628d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_stencilFuncMask = 0xFFFFFFFF;
629d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_stencilFuncMaskBack = 0xFFFFFFFF;
630d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_layerCleared = false;
631d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_numGLErrorsToConsoleAllowed = maxGLErrorsAllowedToConsole;
632d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
633d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_clearColor[0] = m_clearColor[1] = m_clearColor[2] = m_clearColor[3] = 0;
634d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_scissorEnabled = false;
635d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_clearDepth = 1;
636d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_clearStencil = 0;
637d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_colorMask[0] = m_colorMask[1] = m_colorMask[2] = m_colorMask[3] = true;
638d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
639d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint numCombinedTextureImageUnits = 0;
640a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->getIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &numCombinedTextureImageUnits);
641d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_textureUnits.clear();
642d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_textureUnits.resize(numCombinedTextureImageUnits);
643d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
644d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint numVertexAttribs = 0;
645a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->getIntegerv(GL_MAX_VERTEX_ATTRIBS, &numVertexAttribs);
646d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_maxVertexAttribs = numVertexAttribs;
647d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
648d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_maxTextureSize = 0;
649a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->getIntegerv(GL_MAX_TEXTURE_SIZE, &m_maxTextureSize);
650d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_maxTextureLevel = WebGLTexture::computeLevelCount(m_maxTextureSize, m_maxTextureSize);
651d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_maxCubeMapTextureSize = 0;
652a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->getIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &m_maxCubeMapTextureSize);
653d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_maxCubeMapTextureLevel = WebGLTexture::computeLevelCount(m_maxCubeMapTextureSize, m_maxCubeMapTextureSize);
654d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_maxRenderbufferSize = 0;
655a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->getIntegerv(GL_MAX_RENDERBUFFER_SIZE, &m_maxRenderbufferSize);
656d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
657d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // These two values from EXT_draw_buffers are lazily queried.
658d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_maxDrawBuffers = 0;
659d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_maxColorAttachments = 0;
660d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
661d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_backDrawBuffer = GL_BACK;
662d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
663d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_defaultVertexArrayObject = WebGLVertexArrayObjectOES::create(this, WebGLVertexArrayObjectOES::VaoTypeDefault);
664d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    addContextObject(m_defaultVertexArrayObject.get());
665d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_boundVertexArrayObject = m_defaultVertexArrayObject;
666d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
667d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_vertexAttribValue.resize(m_maxVertexAttribs);
668d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
669d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    createFallbackBlackTextures1x1();
670d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
671a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->viewport(0, 0, drawingBufferWidth(), drawingBufferHeight());
672a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->scissor(0, 0, drawingBufferWidth(), drawingBufferHeight());
673d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
674c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_contextLostCallbackAdapter = WebGLRenderingContextLostCallback::create(this);
675c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_errorMessageCallbackAdapter = WebGLRenderingContextErrorMessageCallback::create(this);
676d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
677a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->setContextLostCallback(m_contextLostCallbackAdapter.get());
678a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->setErrorMessageCallback(m_errorMessageCallbackAdapter.get());
679d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
680d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // This ensures that the context has a valid "lastFlushID" and won't be mistakenly identified as the "least recently used" context.
681a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->flush();
682d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
683d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (int i = 0; i < WebGLExtensionNameCount; ++i)
684d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_extensionEnabled[i] = false;
685d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
686d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    activateContext(this);
687d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
688d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
689d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::setupFlags()
690d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
691c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ASSERT(drawingBuffer());
692d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (Page* p = canvas()->document().page()) {
693d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_synthesizedErrorsToConsole = p->settings().webGLErrorsToConsoleEnabled();
694d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
695d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!m_multisamplingObserverRegistered && m_requestedAttributes->antialias()) {
696c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            m_multisamplingAllowed = drawingBuffer()->multisample();
697d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            p->addMultisamplingChangedObserver(this);
698d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_multisamplingObserverRegistered = true;
699d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
700d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
701d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
702d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_isGLES2NPOTStrict = !extensionsUtil()->isExtensionEnabled("GL_OES_texture_npot");
703d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_isDepthStencilSupported = extensionsUtil()->isExtensionEnabled("GL_OES_packed_depth_stencil");
704d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
705d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
706d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::addCompressedTextureFormat(GLenum format)
707d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
708d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_compressedTextureFormats.contains(format))
709d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_compressedTextureFormats.append(format);
710d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
711d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
712d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::removeAllCompressedTextureFormats()
713d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
714d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_compressedTextureFormats.clear();
715d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
716d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
717d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Helper function for V8 bindings to identify what version of WebGL a CanvasRenderingContext supports.
718d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)unsigned WebGLRenderingContextBase::getWebGLVersion(const CanvasRenderingContext* context)
719d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
720d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!context->is3d())
721d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
722d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return static_cast<const WebGLRenderingContextBase*>(context)->version();
723d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
724d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
725d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLRenderingContextBase::~WebGLRenderingContextBase()
726d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
727c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#if !ENABLE(OILPAN)
728d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Remove all references to WebGLObjects so if they are the last reference
729d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // they will be freed before the last context is removed from the context group.
730d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_boundArrayBuffer = nullptr;
731d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_defaultVertexArrayObject = nullptr;
732d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_boundVertexArrayObject = nullptr;
733d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_vertexAttrib0Buffer = nullptr;
734d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_currentProgram = nullptr;
735d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_framebufferBinding = nullptr;
736d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_renderbufferBinding = nullptr;
737d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
738d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (size_t i = 0; i < m_textureUnits.size(); ++i) {
739c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_textureUnits[i].m_texture2DBinding = nullptr;
740c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_textureUnits[i].m_textureCubeMapBinding = nullptr;
741d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
742d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
743d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_blackTexture2D = nullptr;
744d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_blackTextureCubeMap = nullptr;
745d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
746d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    detachAndRemoveAllObjects();
747d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
748c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // Release all extensions now.
749c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_extensions.clear();
750c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#endif
751d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
752d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Context must be removed from the group prior to the destruction of the
753d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // WebGraphicsContext3D, otherwise shared objects may not be properly deleted.
754d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_contextGroup->removeContext(this);
755d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
756d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    destroyContext();
757d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
758f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if !ENABLE(OILPAN)
759c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (m_multisamplingObserverRegistered)
760c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (Page* page = canvas()->document().page())
761d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            page->removeMultisamplingChangedObserver(this);
762f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif
763d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
764d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    willDestroyContext(this);
765d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
766d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
767d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::destroyContext()
768d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
769c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!drawingBuffer())
770a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return;
771d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
772d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_extensionsUtil.clear();
773d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
774a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->setContextLostCallback(0);
775a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->setErrorMessageCallback(0);
776a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
777c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ASSERT(drawingBuffer());
778c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#if ENABLE(OILPAN)
779c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // The DrawingBuffer ref pointers are cleared, but the
780c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // WebGLSharedWebGraphicsContext3D object will hold onto the
781c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // DrawingBuffer for as long as needed (== until all
782c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // context objects have been finalized), at which point
783c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // DrawingBuffer destruction happens.
784c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_sharedWebGraphicsContext3D.clear();
785c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#else
786f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    m_drawingBuffer->beginDestruction();
787a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_drawingBuffer.clear();
788c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#endif
789d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
790d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
791d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::markContextChanged(ContentChangeType changeType)
792d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
793d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_framebufferBinding || isContextLost())
794d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
795d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
796c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    drawingBuffer()->markContentsChanged();
797d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
798d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_layerCleared = false;
799d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RenderBox* renderBox = canvas()->renderBox();
800d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (renderBox && renderBox->hasAcceleratedCompositing()) {
801d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_markedCanvasDirty = true;
802d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        canvas()->clearCopiedImage();
803d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        renderBox->contentChanged(changeType);
804d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else {
805d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!m_markedCanvasDirty) {
806d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_markedCanvasDirty = true;
807d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            canvas()->didDraw(FloatRect(FloatPoint(0, 0), clampedCanvasSize()));
808d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
809d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
810d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
811d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
812d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::clearIfComposited(GLbitfield mask)
813d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
814d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
815d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
816d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
817c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!drawingBuffer()->layerComposited() || m_layerCleared
818d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        || m_requestedAttributes->preserveDrawingBuffer() || (mask && m_framebufferBinding))
819d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
820d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
821c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeRawPtr<WebGLContextAttributes> contextAttributes = getContextAttributes();
822d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
823d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Determine if it's possible to combine the clear the user asked for and this clear.
824d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool combinedClear = mask && !m_scissorEnabled;
825d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
826a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->disable(GL_SCISSOR_TEST);
827a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (combinedClear && (mask & GL_COLOR_BUFFER_BIT)) {
828a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->clearColor(m_colorMask[0] ? m_clearColor[0] : 0,
829a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            m_colorMask[1] ? m_clearColor[1] : 0,
830a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            m_colorMask[2] ? m_clearColor[2] : 0,
831a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            m_colorMask[3] ? m_clearColor[3] : 0);
832a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    } else {
833a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->clearColor(0, 0, 0, 0);
834a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
835a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->colorMask(true, true, true, true);
836d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLbitfield clearMask = GL_COLOR_BUFFER_BIT;
837d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (contextAttributes->depth()) {
838d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!combinedClear || !m_depthMask || !(mask & GL_DEPTH_BUFFER_BIT))
839a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->clearDepth(1.0f);
840d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        clearMask |= GL_DEPTH_BUFFER_BIT;
841a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->depthMask(true);
842d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
843d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (contextAttributes->stencil()) {
844d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (combinedClear && (mask & GL_STENCIL_BUFFER_BIT))
845a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->clearStencil(m_clearStencil & m_stencilMask);
846d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        else
847a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->clearStencil(0);
848d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        clearMask |= GL_STENCIL_BUFFER_BIT;
849a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->stencilMaskSeparate(GL_FRONT, 0xFFFFFFFF);
850d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
851d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
852c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    drawingBuffer()->clearFramebuffers(clearMask);
853d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
854d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    restoreStateAfterClear();
855d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_framebufferBinding)
856a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->bindFramebuffer(GL_FRAMEBUFFER, objectOrZero(m_framebufferBinding.get()));
857d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_layerCleared = true;
858d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
859d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return combinedClear;
860d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
861d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
862d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::restoreStateAfterClear()
863d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
864d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
865d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
866d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
867d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Restore the state that the context set.
868d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_scissorEnabled)
869a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->enable(GL_SCISSOR_TEST);
870a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->clearColor(m_clearColor[0], m_clearColor[1],
871a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        m_clearColor[2], m_clearColor[3]);
872a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->colorMask(m_colorMask[0], m_colorMask[1],
873a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        m_colorMask[2], m_colorMask[3]);
874a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->clearDepth(m_clearDepth);
875a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->clearStencil(m_clearStencil);
876a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->stencilMaskSeparate(GL_FRONT, m_stencilMask);
877a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->depthMask(m_depthMask);
878d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
879d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
880d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::markLayerComposited()
881d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
882d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isContextLost())
883c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        drawingBuffer()->markLayerComposited();
884d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
885d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
8867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebGLRenderingContextBase::setIsHidden(bool hidden)
8877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
8887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (drawingBuffer())
8897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        drawingBuffer()->setIsHidden(hidden);
8907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
8917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
892d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::paintRenderingResultsToCanvas()
893d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
894d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost()) {
895d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        canvas()->clearPresentationCopy();
896d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
897d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
898d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
899d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (canvas()->document().printing())
900d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        canvas()->clearPresentationCopy();
901d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
902d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Until the canvas is written to by the application, the clear that
903d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // happened after it was composited should be ignored by the compositor.
904c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (drawingBuffer()->layerComposited() && !m_requestedAttributes->preserveDrawingBuffer()) {
905c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        drawingBuffer()->paintCompositedResultsToCanvas(canvas()->buffer());
906d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
907d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        canvas()->makePresentationCopy();
908d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else
909d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        canvas()->clearPresentationCopy();
9105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
911d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    clearIfComposited();
912d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
913d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_markedCanvasDirty && !m_layerCleared)
914d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
915d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
916d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    canvas()->clearCopiedImage();
917d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_markedCanvasDirty = false;
918d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
91943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    ScopedTexture2DRestorer restorer(this);
92043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
921c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    drawingBuffer()->commit();
9227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!canvas()->buffer()->copyRenderingResultsFromDrawingBuffer(drawingBuffer(), m_savingImage)) {
923d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        canvas()->ensureUnacceleratedImageBuffer();
924d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (canvas()->hasImageBuffer())
925c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            drawingBuffer()->paintRenderingResultsToCanvas(canvas()->buffer());
926d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
927d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
928d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_framebufferBinding)
929a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->bindFramebuffer(GL_FRAMEBUFFER, objectOrZero(m_framebufferBinding.get()));
930d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
931c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        drawingBuffer()->bind();
932d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
933d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
934aafa69cb17c9d6606c07663ade5f81388a2c5986Ben MurdochPassRefPtrWillBeRawPtr<ImageData> WebGLRenderingContextBase::paintRenderingResultsToImageData()
935d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
936d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
937d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
938d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
939d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    clearIfComposited();
940c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    drawingBuffer()->commit();
941d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    int width, height;
942c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtr<Uint8ClampedArray> imageDataPixels = drawingBuffer()->paintRenderingResultsToImageData(width, height);
943d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!imageDataPixels)
944d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
945d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
946d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_framebufferBinding)
947a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->bindFramebuffer(GL_FRAMEBUFFER, objectOrZero(m_framebufferBinding.get()));
948d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
949c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        drawingBuffer()->bind();
950d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
951d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return ImageData::create(IntSize(width, height), imageDataPixels);
952d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
953d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
954d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::reshape(int width, int height)
955d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
956d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
957d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
958d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
959d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // This is an approximation because at WebGLRenderingContextBase level we don't
960d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // know if the underlying FBO uses textures or renderbuffers.
961d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint maxSize = std::min(m_maxTextureSize, m_maxRenderbufferSize);
962d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Limit drawing buffer size to 4k to avoid memory exhaustion.
963d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const int sizeUpperLimit = 4096;
964d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    maxSize = std::min(maxSize, sizeUpperLimit);
965d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint maxWidth = std::min(maxSize, m_maxViewportDims[0]);
966d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint maxHeight = std::min(maxSize, m_maxViewportDims[1]);
967d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    width = clamp(width, 1, maxWidth);
968d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    height = clamp(height, 1, maxHeight);
969d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
970d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_needsUpdate) {
971d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        RenderBox* renderBox = canvas()->renderBox();
972d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (renderBox && renderBox->hasAcceleratedCompositing())
973d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            renderBox->contentChanged(CanvasChanged);
974d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_needsUpdate = false;
975d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
976d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
977d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // We don't have to mark the canvas as dirty, since the newly created image buffer will also start off
978d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // clear (and this matches what reshape will do).
979c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    drawingBuffer()->reset(IntSize(width, height));
980d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    restoreStateAfterClear();
981d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
982a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->bindTexture(GL_TEXTURE_2D, objectOrZero(m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get()));
983a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->bindRenderbuffer(GL_RENDERBUFFER, objectOrZero(m_renderbufferBinding.get()));
984d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_framebufferBinding)
985a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->bindFramebuffer(GL_FRAMEBUFFER, objectOrZero(m_framebufferBinding.get()));
986d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
987d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
988d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)int WebGLRenderingContextBase::drawingBufferWidth() const
989d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
990c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return isContextLost() ? 0 : drawingBuffer()->size().width();
991d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
992d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
993d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)int WebGLRenderingContextBase::drawingBufferHeight() const
994d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
995c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return isContextLost() ? 0 : drawingBuffer()->size().height();
996d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
997d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
998d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)unsigned WebGLRenderingContextBase::sizeInBytes(GLenum type)
999d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1000d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (type) {
1001d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BYTE:
1002d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return sizeof(GLbyte);
1003d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_BYTE:
1004d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return sizeof(GLubyte);
1005d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SHORT:
1006d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return sizeof(GLshort);
1007d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_SHORT:
1008d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return sizeof(GLushort);
1009d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_INT:
1010d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return sizeof(GLint);
1011d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_INT:
1012d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return sizeof(GLuint);
1013d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FLOAT:
1014d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return sizeof(GLfloat);
1015d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1016d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT_NOT_REACHED();
1017d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return 0;
1018d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1019d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1020d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::activeTexture(GLenum texture)
1021d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1022d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1023d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1024d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (texture - GL_TEXTURE0 >= m_textureUnits.size()) {
1025d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "activeTexture", "texture unit out of range");
1026d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1027d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1028d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_activeTextureUnit = texture - GL_TEXTURE0;
1029a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->activeTexture(texture);
1030d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1031c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    drawingBuffer()->setActiveTextureUnit(texture);
1032d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1033d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1034d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1035d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::attachShader(WebGLProgram* program, WebGLShader* shader)
1036d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1037d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("attachShader", program) || !validateWebGLObject("attachShader", shader))
1038d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1039d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!program->attachShader(shader)) {
1040d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "attachShader", "shader attachment already has shader");
1041d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1042d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1043a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->attachShader(objectOrZero(program), objectOrZero(shader));
1044d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    shader->onAttached();
1045d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1046d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1047d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::bindAttribLocation(WebGLProgram* program, GLuint index, const String& name)
1048d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1049d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("bindAttribLocation", program))
1050d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1051d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateLocationLength("bindAttribLocation", name))
1052d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1053d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateString("bindAttribLocation", name))
1054d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1055d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isPrefixReserved(name)) {
1056d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "bindAttribLocation", "reserved prefix");
1057d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1058d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1059d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (index >= m_maxVertexAttribs) {
1060d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "bindAttribLocation", "index out of range");
1061d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1062d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1063a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->bindAttribLocation(objectOrZero(program), index, name.utf8().data());
1064d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1065d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1066d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::checkObjectToBeBound(const char* functionName, WebGLObject* object, bool& deleted)
1067d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1068d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    deleted = false;
1069d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1070d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
1071d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (object) {
1072d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!object->validate(contextGroup(), this)) {
1073d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "object not from this context");
1074d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
1075d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
1076d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        deleted = !object->object();
1077d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1078d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
1079d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1080d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1081d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::bindBuffer(GLenum target, WebGLBuffer* buffer)
1082d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1083d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool deleted;
1084d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!checkObjectToBeBound("bindBuffer", buffer, deleted))
1085d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1086d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (deleted)
1087d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        buffer = 0;
1088d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (buffer && buffer->getTarget() && buffer->getTarget() != target) {
1089d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "bindBuffer", "buffers can not be used with multiple targets");
1090d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1091d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1092d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (target == GL_ARRAY_BUFFER)
1093d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_boundArrayBuffer = buffer;
1094d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else if (target == GL_ELEMENT_ARRAY_BUFFER)
1095d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_boundVertexArrayObject->setElementArrayBuffer(buffer);
1096d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else {
1097d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "bindBuffer", "invalid target");
1098d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1099d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1101a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->bindBuffer(target, objectOrZero(buffer));
1102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (buffer)
1103d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        buffer->setTarget(target);
1104d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::bindFramebuffer(GLenum target, WebGLFramebuffer* buffer)
1107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool deleted;
1109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!checkObjectToBeBound("bindFramebuffer", buffer, deleted))
1110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (deleted)
1112d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        buffer = 0;
1113d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (target != GL_FRAMEBUFFER) {
1114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "bindFramebuffer", "invalid target");
1115d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1116d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1117d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_framebufferBinding = buffer;
1118c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    drawingBuffer()->setFramebufferBinding(objectOrZero(m_framebufferBinding.get()));
1119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_framebufferBinding) {
1120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // Instead of binding fb 0, bind the drawing buffer.
1121c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        drawingBuffer()->bind();
1122a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    } else {
1123a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->bindFramebuffer(target, objectOrZero(buffer));
1124a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
1125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (buffer)
1126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        buffer->setHasEverBeenBound();
1127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    applyStencilTest();
1128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::bindRenderbuffer(GLenum target, WebGLRenderbuffer* renderBuffer)
1131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool deleted;
1133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!checkObjectToBeBound("bindRenderbuffer", renderBuffer, deleted))
1134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (deleted)
1136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        renderBuffer = 0;
1137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (target != GL_RENDERBUFFER) {
1138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "bindRenderbuffer", "invalid target");
1139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_renderbufferBinding = renderBuffer;
1142a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->bindRenderbuffer(target, objectOrZero(renderBuffer));
1143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (renderBuffer)
1144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        renderBuffer->setHasEverBeenBound();
1145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::bindTexture(GLenum target, WebGLTexture* texture)
1148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool deleted;
1150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!checkObjectToBeBound("bindTexture", texture, deleted))
1151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (deleted)
1153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        texture = 0;
1154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (texture && texture->getTarget() && texture->getTarget() != target) {
1155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "bindTexture", "textures can not be used with multiple targets");
1156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1158d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint maxLevel = 0;
1159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (target == GL_TEXTURE_2D) {
1160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_textureUnits[m_activeTextureUnit].m_texture2DBinding = texture;
1161d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        maxLevel = m_maxTextureLevel;
1162d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1163d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!m_activeTextureUnit)
1164c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            drawingBuffer()->setTexture2DBinding(objectOrZero(texture));
1165d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1166d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else if (target == GL_TEXTURE_CUBE_MAP) {
1167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding = texture;
1168d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        maxLevel = m_maxCubeMapTextureLevel;
1169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else {
1170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "bindTexture", "invalid target");
1171d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1172d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1174a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->bindTexture(target, objectOrZero(texture));
1175d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (texture) {
1176d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        texture->setTarget(target, maxLevel);
1177d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_onePlusMaxNonDefaultTextureUnit = max(m_activeTextureUnit + 1, m_onePlusMaxNonDefaultTextureUnit);
1178d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else {
1179d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // If the disabled index is the current maximum, trace backwards to find the new max enabled texture index
1180d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (m_onePlusMaxNonDefaultTextureUnit == m_activeTextureUnit + 1) {
1181d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            findNewMaxNonDefaultTextureUnit();
1182d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
1183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1184d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1185d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Note: previously we used to automatically set the TEXTURE_WRAP_R
1186d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // repeat mode to CLAMP_TO_EDGE for cube map textures, because OpenGL
1187d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // ES 2.0 doesn't expose this flag (a bug in the specification) and
1188d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // otherwise the application has no control over the seams in this
1189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // dimension. However, it appears that supporting this properly on all
1190d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // platforms is fairly involved (will require a HashMap from texture ID
1191d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // in all ports), and we have not had any complaints, so the logic has
1192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // been removed.
1193d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1194d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1195d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1196d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
1197d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1198d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1199d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1200a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->blendColor(red, green, blue, alpha);
1201d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1202d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1203d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::blendEquation(GLenum mode)
1204d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1205d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateBlendEquation("blendEquation", mode))
1206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1207a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->blendEquation(mode);
1208d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1209d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1210d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
1211d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1212d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateBlendEquation("blendEquationSeparate", modeRGB) || !validateBlendEquation("blendEquationSeparate", modeAlpha))
1213d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1214a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->blendEquationSeparate(modeRGB, modeAlpha);
1215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1216d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::blendFunc(GLenum sfactor, GLenum dfactor)
1219d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1220d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateBlendFuncFactors("blendFunc", sfactor, dfactor))
1221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1222a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->blendFunc(sfactor, dfactor);
1223d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1224d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1225d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
1226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Note: Alpha does not have the same restrictions as RGB.
1228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateBlendFuncFactors("blendFuncSeparate", srcRGB, dstRGB))
1229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1230a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
1231d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1233f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid WebGLRenderingContextBase::bufferDataImpl(GLenum target, long long size, const void* data, GLenum usage)
1234d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1235f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    WebGLBuffer* buffer = validateBufferDataTarget("bufferData", target);
1236d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!buffer)
1237d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1238f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
1239f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    switch (usage) {
1240f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case GL_STREAM_DRAW:
1241f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case GL_STATIC_DRAW:
1242f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    case GL_DYNAMIC_DRAW:
1243f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        break;
1244f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    default:
1245f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        synthesizeGLError(GL_INVALID_ENUM, "bufferData", "invalid usage");
1246d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1247d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1248f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
1249f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (!validateValueFitNonNegInt32("bufferData", "size", size))
1250f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return;
1251f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
1252f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    webContext()->bufferData(target, static_cast<GLsizeiptr>(size), data, usage);
1253f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
1254f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
1255f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid WebGLRenderingContextBase::bufferData(GLenum target, long long size, GLenum usage)
1256f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
1257f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (isContextLost())
1258f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return;
1259d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!size) {
1260d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "bufferData", "size == 0");
1261d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1262d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1263f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    bufferDataImpl(target, size, 0, usage);
1264d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1265d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1266d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::bufferData(GLenum target, ArrayBuffer* data, GLenum usage)
1267d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1268d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1269d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1270d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!data) {
1271d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "bufferData", "no data");
1272d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1273d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1274f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    bufferDataImpl(target, data->byteLength(), data->data(), usage);
1275d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1276d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1277d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::bufferData(GLenum target, ArrayBufferView* data, GLenum usage)
1278d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1280d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1281d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!data) {
1282d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "bufferData", "no data");
1283d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1284d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1285f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    bufferDataImpl(target, data->byteLength(), data->baseAddress(), usage);
1286d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1287d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1288f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid WebGLRenderingContextBase::bufferSubDataImpl(GLenum target, long long offset, GLsizeiptr size, const void* data)
1289d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1290f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    WebGLBuffer* buffer = validateBufferDataTarget("bufferSubData", target);
1291d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!buffer)
1292d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1293f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (!validateValueFitNonNegInt32("bufferSubData", "offset", offset))
1294d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1295d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!data)
1296d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1297d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1298f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    webContext()->bufferSubData(target, static_cast<GLintptr>(offset), size, data);
1299d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1300d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1301f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid WebGLRenderingContextBase::bufferSubData(GLenum target, long long offset, ArrayBuffer* data)
1302d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1303d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1304d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1305f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (!data)
1306d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1307f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    bufferSubDataImpl(target, offset, data->byteLength(), data->data());
1308f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
1309f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
1310f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid WebGLRenderingContextBase::bufferSubData(GLenum target, long long offset, ArrayBufferView* data)
1311f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
1312f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (isContextLost())
1313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1314d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!data)
1315d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1316f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    bufferSubDataImpl(target, offset, data->byteLength(), data->baseAddress());
1317d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1318d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLenum WebGLRenderingContextBase::checkFramebufferStatus(GLenum target)
1320d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1321d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1322d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return GL_FRAMEBUFFER_UNSUPPORTED;
1323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (target != GL_FRAMEBUFFER) {
1324d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "checkFramebufferStatus", "invalid target");
1325d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
1326d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1327d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_framebufferBinding || !m_framebufferBinding->object())
1328d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return GL_FRAMEBUFFER_COMPLETE;
1329d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const char* reason = "framebuffer incomplete";
1330d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum result = m_framebufferBinding->checkStatus(&reason);
1331d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (result != GL_FRAMEBUFFER_COMPLETE) {
1332d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        emitGLWarning("checkFramebufferStatus", reason);
1333d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return result;
1334d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1335a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    result = webContext()->checkFramebufferStatus(target);
1336d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return result;
1337d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1338d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1339d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::clear(GLbitfield mask)
1340d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1341d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1342d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1343d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) {
1344d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "clear", "invalid mask");
1345d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1346d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1347d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const char* reason = "framebuffer incomplete";
1348a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), &reason)) {
1349d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "clear", reason);
1350d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1351d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1352d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!clearIfComposited(mask))
1353a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->clear(mask);
1354d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    markContextChanged(CanvasChanged);
1355d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1356d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1357d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::clearColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a)
1358d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1359d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1360d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1361d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (std::isnan(r))
1362d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        r = 0;
1363d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (std::isnan(g))
1364d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        g = 0;
1365d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (std::isnan(b))
1366d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        b = 0;
1367d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (std::isnan(a))
1368d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        a = 1;
1369d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_clearColor[0] = r;
1370d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_clearColor[1] = g;
1371d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_clearColor[2] = b;
1372d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_clearColor[3] = a;
1373a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->clearColor(r, g, b, a);
1374d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1375d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1376d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::clearDepth(GLfloat depth)
1377d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1378d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1379d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1380d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_clearDepth = depth;
1381a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->clearDepth(depth);
1382d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1383d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1384d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::clearStencil(GLint s)
1385d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1386d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1387d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1388d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_clearStencil = s;
1389a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->clearStencil(s);
1390d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1391d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1392d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
1393d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1394d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1395d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1396d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_colorMask[0] = red;
1397d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_colorMask[1] = green;
1398d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_colorMask[2] = blue;
1399d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_colorMask[3] = alpha;
1400a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->colorMask(red, green, blue, alpha);
1401d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1402d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1403d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::compileShader(WebGLShader* shader)
1404d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1405d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("compileShader", shader))
1406d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1407a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->compileShader(objectOrZero(shader));
1408d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1409d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1410d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, ArrayBufferView* data)
1411d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1412d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1413d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1414d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateTexFuncLevel("compressedTexImage2D", target, level))
1415d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1416d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1417d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateCompressedTexFormat(internalformat)) {
1418d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "compressedTexImage2D", "invalid internalformat");
1419d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1420d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1421d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (border) {
1422d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D", "border not 0");
1423d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1424d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1425d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateCompressedTexDimensions("compressedTexImage2D", NotTexSubImage2D, target, level, width, height, internalformat))
1426d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1427d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateCompressedTexFuncData("compressedTexImage2D", width, height, internalformat, data))
1428d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1429d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1430d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture* tex = validateTextureBinding("compressedTexImage2D", target, true);
1431d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!tex)
1432d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1433d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isGLES2NPOTStrict()) {
1434d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (level && WebGLTexture::isNPOT(width, height)) {
1435d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D", "level > 0 not power of 2");
1436d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
1437d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
1438d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1439a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->compressedTexImage2D(target, level, internalformat, width, height,
1440a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        border, data->byteLength(), data->baseAddress());
1441d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    tex->setLevelInfo(target, level, internalformat, width, height, GL_UNSIGNED_BYTE);
1442d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1443d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1444d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, ArrayBufferView* data)
1445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1446d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1447d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1448d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateTexFuncLevel("compressedTexSubImage2D", target, level))
1449d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1450d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateCompressedTexFormat(format)) {
1451d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "compressedTexSubImage2D", "invalid format");
1452d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1453d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1454d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateCompressedTexFuncData("compressedTexSubImage2D", width, height, format, data))
1455d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1456d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1457d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture* tex = validateTextureBinding("compressedTexSubImage2D", target, true);
1458d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!tex)
1459d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1460d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1461d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (format != tex->getInternalFormat(target, level)) {
1462d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "compressedTexSubImage2D", "format does not match texture format");
1463d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1464d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1465d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1466d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateCompressedTexSubDimensions("compressedTexSubImage2D", target, level, xoffset, yoffset, width, height, format, tex))
1467d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1468d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1469a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->compressedTexSubImage2D(target, level, xoffset, yoffset,
1470a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        width, height, format, data->byteLength(), data->baseAddress());
1471d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1472d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1473d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateSettableTexFormat(const char* functionName, GLenum format)
1474d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1475d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (WebGLImageConversion::getClearBitsByFormat(format) & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) {
1476d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, functionName, "format can not be set, only rendered to");
1477d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
1478d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1479d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
1480d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1481d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1482d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::copyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1483d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1484d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1485d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1486d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateTexFuncParameters("copyTexImage2D", NotTexSubImage2D, target, level, internalformat, width, height, border, internalformat, GL_UNSIGNED_BYTE))
1487d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1488d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateSettableTexFormat("copyTexImage2D", internalformat))
1489d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1490d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture* tex = validateTextureBinding("copyTexImage2D", target, true);
1491d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!tex)
1492d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1493d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFramebufferColorFormat())) {
1494d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "copyTexImage2D", "framebuffer is incompatible format");
1495d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1496d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1497d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isGLES2NPOTStrict() && level && WebGLTexture::isNPOT(width, height)) {
1498d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "copyTexImage2D", "level > 0 not power of 2");
1499d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1500d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1501d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const char* reason = "framebuffer incomplete";
1502a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), &reason)) {
1503d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexImage2D", reason);
1504d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1505d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1506d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    clearIfComposited();
1507c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ScopedDrawingBufferBinder binder(drawingBuffer(), m_framebufferBinding.get());
1508a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->copyTexImage2D(target, level, internalformat, x, y, width, height, border);
1509d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FIXME: if the framebuffer is not complete, none of the below should be executed.
1510d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    tex->setLevelInfo(target, level, internalformat, width, height, GL_UNSIGNED_BYTE);
1511d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1512d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1513d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::copyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1514d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1515d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1516d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1517d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateTexFuncLevel("copyTexSubImage2D", target, level))
1518d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1519d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture* tex = validateTextureBinding("copyTexSubImage2D", target, true);
1520d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!tex)
1521d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1522d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateSize("copyTexSubImage2D", xoffset, yoffset) || !validateSize("copyTexSubImage2D", width, height))
1523d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1524d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Before checking if it is in the range, check if overflow happens first.
1525d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Checked<GLint, RecordOverflow> maxX = xoffset;
1526d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    maxX += width;
1527d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Checked<GLint, RecordOverflow> maxY = yoffset;
1528d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    maxY += height;
1529d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (maxX.hasOverflowed() || maxY.hasOverflowed()) {
1530d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "copyTexSubImage2D", "bad dimensions");
1531d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1532d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1533d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (maxX.unsafeGet() > tex->getWidth(target, level) || maxY.unsafeGet() > tex->getHeight(target, level)) {
1534d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "copyTexSubImage2D", "rectangle out of range");
1535d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1536d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1537d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum internalformat = tex->getInternalFormat(target, level);
1538d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateSettableTexFormat("copyTexSubImage2D", internalformat))
1539d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1540d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFramebufferColorFormat())) {
1541d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "copyTexSubImage2D", "framebuffer is incompatible format");
1542d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1543d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1544d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const char* reason = "framebuffer incomplete";
1545a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), &reason)) {
1546d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexSubImage2D", reason);
1547d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1548d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1549d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    clearIfComposited();
1550c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ScopedDrawingBufferBinder binder(drawingBuffer(), m_framebufferBinding.get());
1551a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
1552d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1553d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1554c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<WebGLBuffer> WebGLRenderingContextBase::createBuffer()
1555d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1556d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1557d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
1558c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeRawPtr<WebGLBuffer> o = WebGLBuffer::create(this);
1559d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    addSharedObject(o.get());
1560c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return o.release();
1561d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1562d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1563c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<WebGLFramebuffer> WebGLRenderingContextBase::createFramebuffer()
1564d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1565d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1566d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
1567c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeRawPtr<WebGLFramebuffer> o = WebGLFramebuffer::create(this);
1568d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    addContextObject(o.get());
1569c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return o.release();
1570d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1571d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1572c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<WebGLTexture> WebGLRenderingContextBase::createTexture()
1573d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1574d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1575d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
1576c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeRawPtr<WebGLTexture> o = WebGLTexture::create(this);
1577d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    addSharedObject(o.get());
1578c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return o.release();
1579d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1580d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1581c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<WebGLProgram> WebGLRenderingContextBase::createProgram()
1582d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1583d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1584d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
1585c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeRawPtr<WebGLProgram> o = WebGLProgram::create(this);
1586d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    addSharedObject(o.get());
1587c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return o.release();
1588d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1589d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1590c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<WebGLRenderbuffer> WebGLRenderingContextBase::createRenderbuffer()
1591d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1592d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1593d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
1594c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeRawPtr<WebGLRenderbuffer> o = WebGLRenderbuffer::create(this);
1595d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    addSharedObject(o.get());
1596c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return o.release();
1597d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1598d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1599d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLRenderbuffer* WebGLRenderingContextBase::ensureEmulatedStencilBuffer(GLenum target, WebGLRenderbuffer* renderbuffer)
1600d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1601d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1602d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
1603d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!renderbuffer->emulatedStencilBuffer()) {
1604d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        renderbuffer->setEmulatedStencilBuffer(createRenderbuffer());
1605a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->bindRenderbuffer(target, objectOrZero(renderbuffer->emulatedStencilBuffer()));
1606a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->bindRenderbuffer(target, objectOrZero(m_renderbufferBinding.get()));
1607d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1608d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return renderbuffer->emulatedStencilBuffer();
1609d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1610d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1611c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<WebGLShader> WebGLRenderingContextBase::createShader(GLenum type)
1612d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1613d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1614d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
1615d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (type != GL_VERTEX_SHADER && type != GL_FRAGMENT_SHADER) {
1616d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "createShader", "invalid shader type");
1617d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
1618d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1619d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1620c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeRawPtr<WebGLShader> o = WebGLShader::create(this, type);
1621d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    addSharedObject(o.get());
1622c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return o.release();
1623d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1624d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1625d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::cullFace(GLenum mode)
1626d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1627d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1628d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1629d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (mode) {
1630d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FRONT_AND_BACK:
1631d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FRONT:
1632d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BACK:
1633d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
1634d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
1635d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "cullFace", "invalid mode");
1636d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1637d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1638a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->cullFace(mode);
1639d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1640d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1641d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::deleteObject(WebGLObject* object)
1642d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1643d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !object)
1644d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
1645d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!object->validate(contextGroup(), this)) {
1646d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "delete", "object does not belong to this context");
1647d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
1648d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1649d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (object->object()) {
1650d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // We need to pass in context here because we want
1651d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // things in this context unbound.
1652a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        object->deleteObject(webContext());
1653d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1654d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
1655d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1656d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1657d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::deleteBuffer(WebGLBuffer* buffer)
1658d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1659d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!deleteObject(buffer))
1660d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1661d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_boundArrayBuffer == buffer)
1662d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_boundArrayBuffer = nullptr;
1663d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1664d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_boundVertexArrayObject->unbindBuffer(buffer);
1665d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1666d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1667d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::deleteFramebuffer(WebGLFramebuffer* framebuffer)
1668d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1669d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!deleteObject(framebuffer))
1670d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1671d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (framebuffer == m_framebufferBinding) {
1672d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_framebufferBinding = nullptr;
1673c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        drawingBuffer()->setFramebufferBinding(0);
1674d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // Have to call bindFramebuffer here to bind back to internal fbo.
1675c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        drawingBuffer()->bind();
1676d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1677d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1678d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1679d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::deleteProgram(WebGLProgram* program)
1680d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1681d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    deleteObject(program);
1682d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // We don't reset m_currentProgram to 0 here because the deletion of the
1683d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // current program is delayed.
1684d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1685d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1686d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::deleteRenderbuffer(WebGLRenderbuffer* renderbuffer)
1687d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1688d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!deleteObject(renderbuffer))
1689d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1690d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (renderbuffer == m_renderbufferBinding)
1691d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_renderbufferBinding = nullptr;
1692d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_framebufferBinding)
1693d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_framebufferBinding->removeAttachmentFromBoundFramebuffer(renderbuffer);
1694d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1695d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1696d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::deleteShader(WebGLShader* shader)
1697d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1698d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    deleteObject(shader);
1699d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1700d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1701d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::deleteTexture(WebGLTexture* texture)
1702d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1703d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!deleteObject(texture))
1704d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1705d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1706d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    int maxBoundTextureIndex = -1;
1707d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (size_t i = 0; i < m_onePlusMaxNonDefaultTextureUnit; ++i) {
1708d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (texture == m_textureUnits[i].m_texture2DBinding) {
1709d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_textureUnits[i].m_texture2DBinding = nullptr;
1710d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            maxBoundTextureIndex = i;
1711d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (!i)
1712c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                drawingBuffer()->setTexture2DBinding(0);
1713d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
1714d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (texture == m_textureUnits[i].m_textureCubeMapBinding) {
1715d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_textureUnits[i].m_textureCubeMapBinding = nullptr;
1716d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            maxBoundTextureIndex = i;
1717d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
1718d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1719d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_framebufferBinding)
1720d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_framebufferBinding->removeAttachmentFromBoundFramebuffer(texture);
1721d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1722d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // If the deleted was bound to the the current maximum index, trace backwards to find the new max texture index
1723d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_onePlusMaxNonDefaultTextureUnit == static_cast<unsigned long>(maxBoundTextureIndex + 1)) {
1724d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        findNewMaxNonDefaultTextureUnit();
1725d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1726d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1727d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1728d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::depthFunc(GLenum func)
1729d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1730d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1731d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1732d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateStencilOrDepthFunc("depthFunc", func))
1733d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1734a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->depthFunc(func);
1735d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1736d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1737d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::depthMask(GLboolean flag)
1738d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1739d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1740d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1741d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_depthMask = flag;
1742a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->depthMask(flag);
1743d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1744d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1745d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::depthRange(GLfloat zNear, GLfloat zFar)
1746d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1747d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1748d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1749d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (zNear > zFar) {
1750d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "depthRange", "zNear > zFar");
1751d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1752d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1753a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->depthRange(zNear, zFar);
1754d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1755d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1756d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::detachShader(WebGLProgram* program, WebGLShader* shader)
1757d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1758d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("detachShader", program) || !validateWebGLObject("detachShader", shader))
1759d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1760d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!program->detachShader(shader)) {
1761d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "detachShader", "shader not attached");
1762d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1763d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1764a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->detachShader(objectOrZero(program), objectOrZero(shader));
1765a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    shader->onDetached(webContext());
1766d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1767d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1768d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::disable(GLenum cap)
1769d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1770d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateCapability("disable", cap))
1771d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1772d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (cap == GL_STENCIL_TEST) {
1773d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilEnabled = false;
1774d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        applyStencilTest();
1775d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1776d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1777d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (cap == GL_SCISSOR_TEST) {
1778d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_scissorEnabled = false;
1779c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        drawingBuffer()->setScissorEnabled(m_scissorEnabled);
1780d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1781a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->disable(cap);
1782d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1783d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1784d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::disableVertexAttribArray(GLuint index)
1785d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1786d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1787d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1788d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (index >= m_maxVertexAttribs) {
1789d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "disableVertexAttribArray", "index out of range");
1790d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1791d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1792d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1793d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVertexArrayObject->getVertexAttribState(index);
1794d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.enabled = false;
1795d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1796a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->disableVertexAttribArray(index);
1797d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1798d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1799d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateRenderingState(const char* functionName)
1800d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1801d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_currentProgram) {
1802d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, functionName, "no valid shader program in use");
1803d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
1804d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1805d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1806d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
1807d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1808d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1809d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateWebGLObject(const char* functionName, WebGLObject* object)
1810d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1811d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!object || !object->object()) {
1812d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "no object or object deleted");
1813d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
1814d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1815d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!object->validate(contextGroup(), this)) {
1816d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, functionName, "object does not belong to this context");
1817d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
1818d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1819d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
1820d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1821d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1822d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::drawArrays(GLenum mode, GLint first, GLsizei count)
1823d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1824d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateDrawArrays("drawArrays", mode, first, count))
1825d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1826d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1827d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    clearIfComposited();
1828d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1829d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    handleTextureCompleteness("drawArrays", true);
1830a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->drawArrays(mode, first, count);
1831d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    handleTextureCompleteness("drawArrays", false);
1832d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    markContextChanged(CanvasChanged);
1833d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1834d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1835d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::drawElements(GLenum mode, GLsizei count, GLenum type, long long offset)
1836d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1837d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateDrawElements("drawElements", mode, count, type, offset))
1838d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1839d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1840d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    clearIfComposited();
1841d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1842d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    handleTextureCompleteness("drawElements", true);
1843a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->drawElements(mode, count, type, static_cast<GLintptr>(offset));
1844d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    handleTextureCompleteness("drawElements", false);
1845d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    markContextChanged(CanvasChanged);
1846d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1847d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1848d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::drawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1849d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1850d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateDrawArrays("drawArraysInstancedANGLE", mode, first, count))
1851d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1852d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1853d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateDrawInstanced("drawArraysInstancedANGLE", primcount))
1854d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1855d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1856d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    clearIfComposited();
1857d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1858d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    handleTextureCompleteness("drawArraysInstancedANGLE", true);
1859a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->drawArraysInstancedANGLE(mode, first, count, primcount);
1860d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    handleTextureCompleteness("drawArraysInstancedANGLE", false);
1861d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    markContextChanged(CanvasChanged);
1862d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1863d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1864f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid WebGLRenderingContextBase::drawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, long long offset, GLsizei primcount)
1865d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1866d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateDrawElements("drawElementsInstancedANGLE", mode, count, type, offset))
1867d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1868d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1869d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateDrawInstanced("drawElementsInstancedANGLE", primcount))
1870d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1871d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1872d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    clearIfComposited();
1873d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1874d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    handleTextureCompleteness("drawElementsInstancedANGLE", true);
1875a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->drawElementsInstancedANGLE(mode, count, type, static_cast<GLintptr>(offset), primcount);
1876d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    handleTextureCompleteness("drawElementsInstancedANGLE", false);
1877d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    markContextChanged(CanvasChanged);
1878d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1879d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1880d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::enable(GLenum cap)
1881d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1882d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateCapability("enable", cap))
1883d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1884d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (cap == GL_STENCIL_TEST) {
1885d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilEnabled = true;
1886d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        applyStencilTest();
1887d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1888d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1889d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (cap == GL_SCISSOR_TEST) {
1890d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_scissorEnabled = true;
1891c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        drawingBuffer()->setScissorEnabled(m_scissorEnabled);
1892d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1893a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->enable(cap);
1894d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1895d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1896d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::enableVertexAttribArray(GLuint index)
1897d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1898d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1899d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1900d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (index >= m_maxVertexAttribs) {
1901d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "enableVertexAttribArray", "index out of range");
1902d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1903d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1904d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1905d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVertexArrayObject->getVertexAttribState(index);
1906d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.enabled = true;
1907d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1908a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->enableVertexAttribArray(index);
1909d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1910d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1911d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::finish()
1912d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1913d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1914d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1915a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->flush(); // Intentionally a flush, not a finish.
1916d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1917d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1918d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::flush()
1919d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1920d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
1921d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1922a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->flush();
1923d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1924d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1925d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::framebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, WebGLRenderbuffer* buffer)
1926d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1927d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateFramebufferFuncParameters("framebufferRenderbuffer", target, attachment))
1928d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1929d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (renderbuffertarget != GL_RENDERBUFFER) {
1930d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "framebufferRenderbuffer", "invalid target");
1931d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1932d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1933d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (buffer && !buffer->validate(contextGroup(), this)) {
1934d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "framebufferRenderbuffer", "no buffer or buffer not from this context");
1935d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1936d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1937d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Don't allow the default framebuffer to be mutated; all current
1938d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // implementations use an FBO internally in place of the default
1939d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FBO.
1940d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_framebufferBinding || !m_framebufferBinding->object()) {
1941d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "framebufferRenderbuffer", "no framebuffer bound");
1942d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1943d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1944d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Platform3DObject bufferObject = objectOrZero(buffer);
1945d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (attachment) {
1946d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL:
1947d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (isDepthStencilSupported() || !buffer) {
1948a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->framebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, renderbuffertarget, bufferObject);
1949a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->framebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, renderbuffertarget, bufferObject);
1950d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        } else {
1951d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuffer(renderbuffertarget, buffer);
1952d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (!emulatedStencilBuffer) {
1953d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                synthesizeGLError(GL_OUT_OF_MEMORY, "framebufferRenderbuffer", "out of memory");
1954d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return;
1955d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
1956a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->framebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, renderbuffertarget, bufferObject);
1957a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->framebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, renderbuffertarget, objectOrZero(emulatedStencilBuffer));
1958d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
1959d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
1960d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
1961a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->framebufferRenderbuffer(target, attachment, renderbuffertarget, bufferObject);
1962d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1963d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_framebufferBinding->setAttachmentForBoundFramebuffer(attachment, buffer);
1964d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    applyStencilTest();
1965d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1966d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1967d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::framebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, WebGLTexture* texture, GLint level)
1968d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1969d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateFramebufferFuncParameters("framebufferTexture2D", target, attachment))
1970d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1971d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (level) {
1972d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "framebufferTexture2D", "level not 0");
1973d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1974d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1975d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (texture && !texture->validate(contextGroup(), this)) {
1976d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "framebufferTexture2D", "no texture or texture not from this context");
1977d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1978d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1979d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Don't allow the default framebuffer to be mutated; all current
1980d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // implementations use an FBO internally in place of the default
1981d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FBO.
1982d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_framebufferBinding || !m_framebufferBinding->object()) {
1983d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "framebufferTexture2D", "no framebuffer bound");
1984d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
1985d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
1986d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Platform3DObject textureObject = objectOrZero(texture);
1987d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (attachment) {
1988d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL:
1989a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->framebufferTexture2D(target, GL_DEPTH_ATTACHMENT, textarget, textureObject, level);
1990a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->framebufferTexture2D(target, GL_STENCIL_ATTACHMENT, textarget, textureObject, level);
1991d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
1992d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_ATTACHMENT:
1993a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->framebufferTexture2D(target, attachment, textarget, textureObject, level);
1994d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
1995d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_ATTACHMENT:
1996a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->framebufferTexture2D(target, attachment, textarget, textureObject, level);
1997d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
1998d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
1999a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->framebufferTexture2D(target, attachment, textarget, textureObject, level);
2000d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2001d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_framebufferBinding->setAttachmentForBoundFramebuffer(attachment, textarget, texture, level);
2002d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    applyStencilTest();
2003d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2004d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2005d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::frontFace(GLenum mode)
2006d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2007d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2008d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
2009d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (mode) {
2010d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_CW:
2011d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_CCW:
2012d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
2013d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
2014d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "frontFace", "invalid mode");
2015d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
2016d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2017a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->frontFace(mode);
2018d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2019d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2020d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::generateMipmap(GLenum target)
2021d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2022d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2023d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
2024d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture* tex = validateTextureBinding("generateMipmap", target, false);
2025d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!tex)
2026d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
2027d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!tex->canGenerateMipmaps()) {
2028d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "generateMipmap", "level 0 not power of 2 or not all the same size");
2029d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
2030d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2031d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateSettableTexFormat("generateMipmap", tex->getInternalFormat(target, 0)))
2032d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
2033d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2034d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // generateMipmap won't work properly if minFilter is not NEAREST_MIPMAP_LINEAR
2035d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // on Mac.  Remove the hack once this driver bug is fixed.
2036d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#if OS(MACOSX)
2037d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool needToResetMinFilter = false;
2038d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (tex->getMinFilter() != GL_NEAREST_MIPMAP_LINEAR) {
2039a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->texParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
2040d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        needToResetMinFilter = true;
2041d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2042d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#endif
2043a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->generateMipmap(target);
2044d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#if OS(MACOSX)
2045d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (needToResetMinFilter)
2046a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->texParameteri(target, GL_TEXTURE_MIN_FILTER, tex->getMinFilter());
2047d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#endif
2048d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    tex->generateMipmapLevelInfo();
2049d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2050d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2051c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<WebGLActiveInfo> WebGLRenderingContextBase::getActiveAttrib(WebGLProgram* program, GLuint index)
2052d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2053d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("getActiveAttrib", program))
2054d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2055d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    blink::WebGraphicsContext3D::ActiveInfo info;
2056a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (!webContext()->getActiveAttrib(objectOrZero(program), index, info))
2057d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2058d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebGLActiveInfo::create(info.name, info.type, info.size);
2059d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2060d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2061c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<WebGLActiveInfo> WebGLRenderingContextBase::getActiveUniform(WebGLProgram* program, GLuint index)
2062d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2063d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("getActiveUniform", program))
2064d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2065d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    blink::WebGraphicsContext3D::ActiveInfo info;
2066a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (!webContext()->getActiveUniform(objectOrZero(program), index, info))
2067d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2068d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebGLActiveInfo::create(info.name, info.type, info.size);
2069d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2070d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2071c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Nullable<WillBeHeapVector<RefPtrWillBeMember<WebGLShader> > > WebGLRenderingContextBase::getAttachedShaders(WebGLProgram* program)
2072d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2073d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("getAttachedShaders", program))
2074c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return Nullable<WillBeHeapVector<RefPtrWillBeMember<WebGLShader> > >();
2075d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2076c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WillBeHeapVector<RefPtrWillBeMember<WebGLShader> > shaderObjects;
2077d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const GLenum shaderType[] = {
2078d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        GL_VERTEX_SHADER,
2079d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        GL_FRAGMENT_SHADER
2080d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    };
2081d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (unsigned i = 0; i < sizeof(shaderType) / sizeof(GLenum); ++i) {
2082d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        WebGLShader* shader = program->getAttachedShader(shaderType[i]);
2083d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (shader)
2084d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            shaderObjects.append(shader);
2085d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2086197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return shaderObjects;
2087d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2088d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2089d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLint WebGLRenderingContextBase::getAttribLocation(WebGLProgram* program, const String& name)
2090d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2091d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("getAttribLocation", program))
2092d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return -1;
2093d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateLocationLength("getAttribLocation", name))
2094d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return -1;
2095d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateString("getAttribLocation", name))
2096d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return -1;
2097d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isPrefixReserved(name))
2098d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return -1;
2099d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!program->linkStatus()) {
2100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "getAttribLocation", "program not linked");
2101d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2103a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return webContext()->getAttribLocation(objectOrZero(program), name.utf8().data());
2104d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getBufferParameter(GLenum target, GLenum pname)
2107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (target != GL_ARRAY_BUFFER && target != GL_ELEMENT_ARRAY_BUFFER) {
2111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getBufferParameter", "invalid target");
2112d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2113d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2115d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (pname != GL_BUFFER_SIZE && pname != GL_BUFFER_USAGE) {
2116d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getBufferParameter", "invalid parameter name");
2117d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2118d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint value = 0;
2121a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->getBufferParameteriv(target, pname, &value);
2122d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (pname == GL_BUFFER_SIZE)
2123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(value);
2124d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebGLGetInfo(static_cast<unsigned>(value));
2125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2127c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<WebGLContextAttributes> WebGLRenderingContextBase::getContextAttributes()
2128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // We always need to return a new WebGLContextAttributes object to
2132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // prevent the user from mutating any cached version.
2133c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    blink::WebGraphicsContext3D::Attributes attrs = drawingBuffer()->getActualAttributes();
2134c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeRawPtr<WebGLContextAttributes> attributes = m_requestedAttributes->clone();
2135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Some requested attributes may not be honored, so we need to query the underlying
2136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // context/drawing buffer and adjust accordingly.
2137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_requestedAttributes->depth() && !attrs.depth)
2138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        attributes->setDepth(false);
2139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_requestedAttributes->stencil() && !attrs.stencil)
2140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        attributes->setStencil(false);
2141c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    attributes->setAntialias(drawingBuffer()->multisample());
2142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return attributes.release();
2143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLenum WebGLRenderingContextBase::getError()
2146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_lostContextErrors.size()) {
2148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        GLenum err = m_lostContextErrors.first();
2149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_lostContextErrors.remove(0);
2150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return err;
2151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return GL_NO_ERROR;
2155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2156a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return webContext()->getError();
2157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2158d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
215907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochconst char* const* WebGLRenderingContextBase::ExtensionTracker::prefixes() const
2160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2161d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static const char* const unprefixed[] = { "", 0, };
216207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return m_prefixes ? m_prefixes : unprefixed;
216307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
2164d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
216507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochbool WebGLRenderingContextBase::ExtensionTracker::matchesNameWithPrefixes(const String& name) const
216607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
216707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    const char* const* prefixSet = prefixes();
216807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    for (; *prefixSet; ++prefixSet) {
216907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        String prefixedName = String(*prefixSet) + extensionName();
2170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (equalIgnoringCase(prefixedName, name)) {
2171d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return true;
2172d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
2173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2174d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return false;
2175d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2176d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
217707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochbool WebGLRenderingContextBase::extensionSupportedAndAllowed(const ExtensionTracker* tracker)
217807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
217907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (tracker->draft() && !RuntimeEnabledFeatures::webGLDraftExtensionsEnabled())
218007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return false;
218107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!tracker->supported(this))
218207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return false;
218307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
218407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
218507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
218607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
2187c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<WebGLExtension> WebGLRenderingContextBase::getExtension(const String& name)
2188d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2190d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2191d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (size_t i = 0; i < m_extensions.size(); ++i) {
2193c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ExtensionTracker* tracker = m_extensions[i].get();
2194d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (tracker->matchesNameWithPrefixes(name)) {
219507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            if (!extensionSupportedAndAllowed(tracker))
2196d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return nullptr;
2197d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2198c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            RefPtrWillBeRawPtr<WebGLExtension> extension = tracker->getExtension(this);
2199d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (extension)
2200d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_extensionEnabled[extension->name()] = true;
2201d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return extension.release();
2202d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
2203d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2204d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2205d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return nullptr;
2206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2207d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2208d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getFramebufferAttachmentParameter(GLenum target, GLenum attachment, GLenum pname)
2209d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2210d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateFramebufferFuncParameters("getFramebufferAttachmentParameter", target, attachment))
2211d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2212d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2213d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_framebufferBinding || !m_framebufferBinding->object()) {
2214d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "getFramebufferAttachmentParameter", "no framebuffer bound");
2215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2216d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLSharedObject* object = m_framebufferBinding->getAttachmentObject(attachment);
2219d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!object) {
2220d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)
2221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo(GL_NONE);
2222d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // OpenGL ES 2.0 specifies INVALID_ENUM in this case, while desktop GL
2223d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // specifies INVALID_OPERATION.
2224d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getFramebufferAttachmentParameter", "invalid parameter name");
2225d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(object->isTexture() || object->isRenderbuffer());
2229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (object->isTexture()) {
2230d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        switch (pname) {
2231d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo(GL_TEXTURE);
2233d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2234c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLTexture>(static_cast<WebGLTexture*>(object)));
2235d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2236d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2237d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            {
2238d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                GLint value = 0;
2239a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                webContext()->getFramebufferAttachmentParameteriv(target, attachment, pname, &value);
2240d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return WebGLGetInfo(value);
2241d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
2242d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        default:
2243d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_ENUM, "getFramebufferAttachmentParameter", "invalid parameter name for texture attachment");
2244d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo();
2245d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
2246d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else {
2247d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        switch (pname) {
2248d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2249d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo(GL_RENDERBUFFER);
2250d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2251c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLRenderbuffer>(static_cast<WebGLRenderbuffer*>(object)));
2252d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        default:
2253d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_ENUM, "getFramebufferAttachmentParameter", "invalid parameter name for renderbuffer attachment");
2254d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo();
2255d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
2256d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2257d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2258d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2259d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getParameter(GLenum pname)
2260d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2261d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2262d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2263d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const int intZero = 0;
2264d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (pname) {
2265d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ACTIVE_TEXTURE:
2266d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2267d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ALIASED_LINE_WIDTH_RANGE:
2268d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getWebGLFloatArrayParameter(pname);
2269d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ALIASED_POINT_SIZE_RANGE:
2270d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getWebGLFloatArrayParameter(pname);
2271d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ALPHA_BITS:
2272d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2273d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ARRAY_BUFFER_BINDING:
2274c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLBuffer>(m_boundArrayBuffer.get()));
2275d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BLEND:
2276d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getBooleanParameter(pname);
2277d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BLEND_COLOR:
2278d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getWebGLFloatArrayParameter(pname);
2279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BLEND_DST_ALPHA:
2280d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2281d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BLEND_DST_RGB:
2282d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2283d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BLEND_EQUATION_ALPHA:
2284d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2285d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BLEND_EQUATION_RGB:
2286d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2287d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BLEND_SRC_ALPHA:
2288d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2289d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BLEND_SRC_RGB:
2290d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2291d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BLUE_BITS:
2292d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2293d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COLOR_CLEAR_VALUE:
2294d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getWebGLFloatArrayParameter(pname);
2295d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COLOR_WRITEMASK:
2296d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getBooleanArrayParameter(pname);
2297d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_TEXTURE_FORMATS:
2298d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(Uint32Array::create(m_compressedTextureFormats.data(), m_compressedTextureFormats.size()));
2299d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_CULL_FACE:
2300d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getBooleanParameter(pname);
2301d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_CULL_FACE_MODE:
2302d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2303d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_CURRENT_PROGRAM:
2304c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLProgram>(m_currentProgram.get()));
2305d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_BITS:
2306d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!m_framebufferBinding && !m_requestedAttributes->depth())
2307d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo(intZero);
2308d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2309d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_CLEAR_VALUE:
2310d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getFloatParameter(pname);
2311d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_FUNC:
2312d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_RANGE:
2314d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getWebGLFloatArrayParameter(pname);
2315d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_TEST:
2316d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getBooleanParameter(pname);
2317d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_WRITEMASK:
2318d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getBooleanParameter(pname);
2319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DITHER:
2320d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getBooleanParameter(pname);
2321d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ELEMENT_ARRAY_BUFFER_BINDING:
2322c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLBuffer>(m_boundVertexArrayObject->boundElementArrayBuffer()));
2323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FRAMEBUFFER_BINDING:
2324c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLFramebuffer>(m_framebufferBinding.get()));
2325d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FRONT_FACE:
2326d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2327d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_GENERATE_MIPMAP_HINT:
2328d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2329d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_GREEN_BITS:
2330d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
233110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
233210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return getIntParameter(pname);
233310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_IMPLEMENTATION_COLOR_READ_TYPE:
233410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return getIntParameter(pname);
2335d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_LINE_WIDTH:
2336d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getFloatParameter(pname);
2337d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
2338d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2339d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
2340d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2341d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
2342d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2343d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_RENDERBUFFER_SIZE:
2344d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2345d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_TEXTURE_IMAGE_UNITS:
2346d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2347d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_TEXTURE_SIZE:
2348d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2349d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_VARYING_VECTORS:
2350d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2351d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_VERTEX_ATTRIBS:
2352d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2353d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
2354d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2355d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_VERTEX_UNIFORM_VECTORS:
2356d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2357d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_VIEWPORT_DIMS:
2358d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getWebGLIntArrayParameter(pname);
2359d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_NUM_SHADER_BINARY_FORMATS:
2360d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // FIXME: should we always return 0 for this?
2361d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2362d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_PACK_ALIGNMENT:
2363d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2364d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_POLYGON_OFFSET_FACTOR:
2365d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getFloatParameter(pname);
2366d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_POLYGON_OFFSET_FILL:
2367d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getBooleanParameter(pname);
2368d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_POLYGON_OFFSET_UNITS:
2369d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getFloatParameter(pname);
2370d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RED_BITS:
2371d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2372d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RENDERBUFFER_BINDING:
2373c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLRenderbuffer>(m_renderbufferBinding.get()));
2374d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RENDERER:
2375d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(String("WebKit WebGL"));
2376d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SAMPLE_BUFFERS:
2377d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2378d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SAMPLE_COVERAGE_INVERT:
2379d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getBooleanParameter(pname);
2380d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SAMPLE_COVERAGE_VALUE:
2381d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getFloatParameter(pname);
2382d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SAMPLES:
2383d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2384d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SCISSOR_BOX:
2385d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getWebGLIntArrayParameter(pname);
2386d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SCISSOR_TEST:
2387d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getBooleanParameter(pname);
2388d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SHADING_LANGUAGE_VERSION:
2389a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return WebGLGetInfo("WebGL GLSL ES 1.0 (" + String(webContext()->getString(GL_SHADING_LANGUAGE_VERSION)) + ")");
2390d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_BACK_FAIL:
2391d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2392d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_BACK_FUNC:
2393d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2394d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
2395d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2396d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_BACK_PASS_DEPTH_PASS:
2397d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2398d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_BACK_REF:
2399d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2400d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_BACK_VALUE_MASK:
2401d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2402d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_BACK_WRITEMASK:
2403d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2404d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_BITS:
2405d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!m_framebufferBinding && !m_requestedAttributes->stencil())
2406d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo(intZero);
2407d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2408d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_CLEAR_VALUE:
2409d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2410d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_FAIL:
2411d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2412d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_FUNC:
2413d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2414d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_PASS_DEPTH_FAIL:
2415d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2416d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_PASS_DEPTH_PASS:
2417d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2418d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_REF:
2419d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2420d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_TEST:
2421d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getBooleanParameter(pname);
2422d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_VALUE_MASK:
2423d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2424d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_WRITEMASK:
2425d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getUnsignedIntParameter(pname);
2426d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SUBPIXEL_BITS:
2427d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2428d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_BINDING_2D:
2429c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLTexture>(m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get()));
2430d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_BINDING_CUBE_MAP:
2431c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLTexture>(m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding.get()));
2432d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNPACK_ALIGNMENT:
2433d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getIntParameter(pname);
2434d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GC3D_UNPACK_FLIP_Y_WEBGL:
2435d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(m_unpackFlipY);
2436d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GC3D_UNPACK_PREMULTIPLY_ALPHA_WEBGL:
2437d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(m_unpackPremultiplyAlpha);
2438d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GC3D_UNPACK_COLORSPACE_CONVERSION_WEBGL:
2439d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(m_unpackColorspaceConversion);
2440d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_VENDOR:
2441d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(String("WebKit"));
2442d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_VERSION:
2443a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return WebGLGetInfo("WebGL 1.0 (" + String(webContext()->getString(GL_VERSION)) + ")");
2444d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_VIEWPORT:
2445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return getWebGLIntArrayParameter(pname);
2446d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: // OES_standard_derivatives
2447d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(OESStandardDerivativesName))
2448d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return getUnsignedIntParameter(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES);
2449d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter name, OES_standard_derivatives not enabled");
2450d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2451d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case WebGLDebugRendererInfo::UNMASKED_RENDERER_WEBGL:
2452d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(WebGLDebugRendererInfoName))
2453a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            return WebGLGetInfo(webContext()->getString(GL_RENDERER));
2454d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter name, WEBGL_debug_renderer_info not enabled");
2455d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2456d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case WebGLDebugRendererInfo::UNMASKED_VENDOR_WEBGL:
2457d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(WebGLDebugRendererInfoName))
2458a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            return WebGLGetInfo(webContext()->getString(GL_VENDOR));
2459d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter name, WEBGL_debug_renderer_info not enabled");
2460d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2461d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_VERTEX_ARRAY_BINDING_OES: // OES_vertex_array_object
2462d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(OESVertexArrayObjectName)) {
2463d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (!m_boundVertexArrayObject->isDefaultObject())
2464c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLVertexArrayObjectOES>(m_boundVertexArrayObject.get()));
2465d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo();
2466d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
2467d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter name, OES_vertex_array_object not enabled");
2468d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2469d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotropic
2470d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(EXTTextureFilterAnisotropicName))
2471d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return getUnsignedIntParameter(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT);
2472d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter name, EXT_texture_filter_anisotropic not enabled");
2473d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2474d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_COLOR_ATTACHMENTS_EXT: // EXT_draw_buffers BEGIN
2475d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(WebGLDrawBuffersName))
2476d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo(maxColorAttachments());
2477d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter name, WEBGL_draw_buffers not enabled");
2478d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2479d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_DRAW_BUFFERS_EXT:
2480d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(WebGLDrawBuffersName))
2481d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo(maxDrawBuffers());
2482d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter name, WEBGL_draw_buffers not enabled");
2483d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2484d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
2485d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(WebGLDrawBuffersName)
2486d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && pname >= GL_DRAW_BUFFER0_EXT
2487d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && pname < static_cast<GLenum>(GL_DRAW_BUFFER0_EXT + maxDrawBuffers())) {
2488d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            GLint value = GL_NONE;
2489d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (m_framebufferBinding)
2490d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                value = m_framebufferBinding->getDrawBuffer(pname);
2491d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            else // emulated backbuffer
2492d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                value = m_backDrawBuffer;
2493d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo(value);
2494d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
2495d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter name");
2496d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2497d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2498d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2499d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2500d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getProgramParameter(WebGLProgram* program, GLenum pname)
2501d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2502d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("getProgramParameter", program))
2503d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2504d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2505d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint value = 0;
2506d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (pname) {
2507d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DELETE_STATUS:
2508d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(program->isDeleted());
2509d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_VALIDATE_STATUS:
2510a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getProgramiv(objectOrZero(program), pname, &value);
2511d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(static_cast<bool>(value));
2512d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_LINK_STATUS:
2513d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(program->linkStatus());
2514d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ATTACHED_SHADERS:
2515d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ACTIVE_ATTRIBUTES:
2516d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ACTIVE_UNIFORMS:
2517a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getProgramiv(objectOrZero(program), pname, &value);
2518d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(value);
2519d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
2520d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getProgramParameter", "invalid parameter name");
2521d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2522d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2523d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2524d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2525d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)String WebGLRenderingContextBase::getProgramInfoLog(WebGLProgram* program)
2526d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2527d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2528d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return String();
2529d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateWebGLObject("getProgramInfoLog", program))
2530d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return "";
2531a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return ensureNotNull(webContext()->getProgramInfoLog(objectOrZero(program)));
2532d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2533d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2534d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getRenderbufferParameter(GLenum target, GLenum pname)
2535d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2536d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2537d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2538d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (target != GL_RENDERBUFFER) {
2539d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getRenderbufferParameter", "invalid target");
2540d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2541d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2542d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_renderbufferBinding || !m_renderbufferBinding->object()) {
2543d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "getRenderbufferParameter", "no renderbuffer bound");
2544d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2545d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2546d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2547d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint value = 0;
2548d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (pname) {
2549d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RENDERBUFFER_WIDTH:
2550d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RENDERBUFFER_HEIGHT:
2551d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RENDERBUFFER_RED_SIZE:
2552d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RENDERBUFFER_GREEN_SIZE:
2553d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RENDERBUFFER_BLUE_SIZE:
2554d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RENDERBUFFER_ALPHA_SIZE:
2555d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RENDERBUFFER_DEPTH_SIZE:
2556a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getRenderbufferParameteriv(target, pname, &value);
2557d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(value);
2558d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RENDERBUFFER_STENCIL_SIZE:
2559d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (m_renderbufferBinding->emulatedStencilBuffer()) {
2560a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->bindRenderbuffer(target, objectOrZero(m_renderbufferBinding->emulatedStencilBuffer()));
2561a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->getRenderbufferParameteriv(target, pname, &value);
2562a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->bindRenderbuffer(target, objectOrZero(m_renderbufferBinding.get()));
2563d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        } else {
2564a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->getRenderbufferParameteriv(target, pname, &value);
2565d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
2566d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(value);
2567d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RENDERBUFFER_INTERNAL_FORMAT:
2568d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(m_renderbufferBinding->internalFormat());
2569d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
2570d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getRenderbufferParameter", "invalid parameter name");
2571d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2572d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2573d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2574d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2575d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getShaderParameter(WebGLShader* shader, GLenum pname)
2576d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2577d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("getShaderParameter", shader))
2578d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2579d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint value = 0;
2580d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (pname) {
2581d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DELETE_STATUS:
2582d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(shader->isDeleted());
2583d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPILE_STATUS:
2584a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getShaderiv(objectOrZero(shader), pname, &value);
2585d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(static_cast<bool>(value));
2586d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SHADER_TYPE:
2587a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getShaderiv(objectOrZero(shader), pname, &value);
2588d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(static_cast<unsigned>(value));
2589d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
2590d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getShaderParameter", "invalid parameter name");
2591d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2592d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2593d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2594d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2595d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)String WebGLRenderingContextBase::getShaderInfoLog(WebGLShader* shader)
2596d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2597d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2598d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return String();
2599d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateWebGLObject("getShaderInfoLog", shader))
2600d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return "";
2601a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return ensureNotNull(webContext()->getShaderInfoLog(objectOrZero(shader)));
2602d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2603d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2604c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<WebGLShaderPrecisionFormat> WebGLRenderingContextBase::getShaderPrecisionFormat(GLenum shaderType, GLenum precisionType)
2605d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2606d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2607d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2608d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (shaderType) {
2609d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_VERTEX_SHADER:
2610d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FRAGMENT_SHADER:
2611d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
2612d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
2613d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getShaderPrecisionFormat", "invalid shader type");
2614d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2615d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2616d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (precisionType) {
2617d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_LOW_FLOAT:
2618d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MEDIUM_FLOAT:
2619d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_HIGH_FLOAT:
2620d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_LOW_INT:
2621d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MEDIUM_INT:
2622d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_HIGH_INT:
2623d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
2624d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
2625d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getShaderPrecisionFormat", "invalid precision type");
2626d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2627d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2628d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2629d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint range[2] = {0, 0};
2630d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint precision = 0;
2631a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->getShaderPrecisionFormat(shaderType, precisionType, range, &precision);
2632d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebGLShaderPrecisionFormat::create(range[0], range[1], precision);
2633d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2634d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2635d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)String WebGLRenderingContextBase::getShaderSource(WebGLShader* shader)
2636d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2637d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2638d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return String();
2639d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateWebGLObject("getShaderSource", shader))
2640d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return "";
2641d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return ensureNotNull(shader->source());
2642d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2643d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2644197021e6b966cfb06891637935ef33fff06433d1Ben MurdochNullable<Vector<String> > WebGLRenderingContextBase::getSupportedExtensions()
2645d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2646d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2647197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return Nullable<Vector<String> >();
2648197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
2649197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    Vector<String> result;
2650d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2651d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (size_t i = 0; i < m_extensions.size(); ++i) {
2652c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ExtensionTracker* tracker = m_extensions[i].get();
265307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (extensionSupportedAndAllowed(tracker)) {
265407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            const char* const* prefixes = tracker->prefixes();
265507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            for (; *prefixes; ++prefixes) {
265607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                String prefixedName = String(*prefixes) + tracker->extensionName();
265707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                result.append(prefixedName);
265807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            }
265907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        }
2660d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2661d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2662d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return result;
2663d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2664d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2665d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getTexParameter(GLenum target, GLenum pname)
2666d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2667d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2668d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2669d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture* tex = validateTextureBinding("getTexParameter", target, false);
2670d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!tex)
2671d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2672d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (pname) {
2673d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_MAG_FILTER:
2674d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_MIN_FILTER:
2675d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_WRAP_S:
2676d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_WRAP_T:
2677d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
2678d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            GLint value = 0;
2679a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->getTexParameteriv(target, pname, &value);
2680d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo(static_cast<unsigned>(value));
2681d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
2682d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotropic
2683d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(EXTTextureFilterAnisotropicName)) {
2684d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            GLfloat value = 0.f;
2685a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->getTexParameterfv(target, pname, &value);
2686d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo(value);
2687d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
2688d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getTexParameter", "invalid parameter name, EXT_texture_filter_anisotropic not enabled");
2689d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2690d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
2691d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getTexParameter", "invalid parameter name");
2692d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2693d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2694d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2695d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2696d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getUniform(WebGLProgram* program, const WebGLUniformLocation* uniformLocation)
2697d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2698d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("getUniform", program))
2699d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2700d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!uniformLocation || uniformLocation->program() != program) {
2701d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "getUniform", "no uniformlocation or not valid for this program");
2702d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2703d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2704d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint location = uniformLocation->location();
2705d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2706d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FIXME: make this more efficient using WebGLUniformLocation and caching types in it
2707d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint activeUniforms = 0;
2708a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->getProgramiv(objectOrZero(program), GL_ACTIVE_UNIFORMS, &activeUniforms);
2709d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (GLint i = 0; i < activeUniforms; i++) {
2710d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        blink::WebGraphicsContext3D::ActiveInfo info;
2711a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (!webContext()->getActiveUniform(objectOrZero(program), i, info))
2712d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo();
2713d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        String name = info.name;
2714d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        StringBuilder nameBuilder;
2715d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // Strip "[0]" from the name if it's an array.
2716d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (info.size > 1 && name.endsWith("[0]"))
2717d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            info.name = name.left(name.length() - 3);
2718d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // If it's an array, we need to iterate through each element, appending "[index]" to the name.
2719d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        for (GLint index = 0; index < info.size; ++index) {
2720d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            nameBuilder.clear();
2721d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            nameBuilder.append(info.name);
2722d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (info.size > 1 && index >= 1) {
2723d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                nameBuilder.append('[');
27247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                nameBuilder.appendNumber(index);
2725d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                nameBuilder.append(']');
2726d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
2727d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // Now need to look this up by name again to find its location
2728a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            GLint loc = webContext()->getUniformLocation(objectOrZero(program), nameBuilder.toString().utf8().data());
2729d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (loc == location) {
2730d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                // Found it. Use the type in the ActiveInfo to determine the return type.
2731d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                GLenum baseType;
2732d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                unsigned length;
2733d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                switch (info.type) {
2734d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_BOOL:
2735d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_BOOL;
2736d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 1;
2737d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2738d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_BOOL_VEC2:
2739d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_BOOL;
2740d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 2;
2741d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2742d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_BOOL_VEC3:
2743d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_BOOL;
2744d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 3;
2745d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2746d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_BOOL_VEC4:
2747d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_BOOL;
2748d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 4;
2749d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2750d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_INT:
2751d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_INT;
2752d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 1;
2753d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2754d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_INT_VEC2:
2755d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_INT;
2756d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 2;
2757d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2758d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_INT_VEC3:
2759d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_INT;
2760d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 3;
2761d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2762d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_INT_VEC4:
2763d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_INT;
2764d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 4;
2765d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2766d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_FLOAT:
2767d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_FLOAT;
2768d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 1;
2769d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2770d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_FLOAT_VEC2:
2771d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_FLOAT;
2772d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 2;
2773d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2774d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_FLOAT_VEC3:
2775d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_FLOAT;
2776d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 3;
2777d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2778d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_FLOAT_VEC4:
2779d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_FLOAT;
2780d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 4;
2781d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2782d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_FLOAT_MAT2:
2783d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_FLOAT;
2784d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 4;
2785d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2786d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_FLOAT_MAT3:
2787d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_FLOAT;
2788d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 9;
2789d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2790d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_FLOAT_MAT4:
2791d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_FLOAT;
2792d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 16;
2793d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2794d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_SAMPLER_2D:
2795d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_SAMPLER_CUBE:
2796d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    baseType = GL_INT;
2797d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    length = 1;
2798d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    break;
2799d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                default:
2800d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    // Can't handle this type
2801d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    synthesizeGLError(GL_INVALID_VALUE, "getUniform", "unhandled type");
2802d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    return WebGLGetInfo();
2803d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                }
2804d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                switch (baseType) {
2805d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_FLOAT: {
2806d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    GLfloat value[16] = {0};
2807a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                    webContext()->getUniformfv(objectOrZero(program), location, value);
2808d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    if (length == 1)
2809d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                        return WebGLGetInfo(value[0]);
2810d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    return WebGLGetInfo(Float32Array::create(value, length));
2811d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                }
2812d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_INT: {
2813d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    GLint value[4] = {0};
2814a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                    webContext()->getUniformiv(objectOrZero(program), location, value);
2815d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    if (length == 1)
2816d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                        return WebGLGetInfo(value[0]);
2817d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    return WebGLGetInfo(Int32Array::create(value, length));
2818d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                }
2819d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                case GL_BOOL: {
2820d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    GLint value[4] = {0};
2821a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                    webContext()->getUniformiv(objectOrZero(program), location, value);
2822d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    if (length > 1) {
2823d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                        bool boolValue[16] = {0};
2824d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                        for (unsigned j = 0; j < length; j++)
2825d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                            boolValue[j] = static_cast<bool>(value[j]);
2826d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                        return WebGLGetInfo(boolValue, length);
2827d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    }
2828d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    return WebGLGetInfo(static_cast<bool>(value[0]));
2829d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                }
2830d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                default:
2831d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    notImplemented();
2832d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                }
2833d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
2834d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
2835d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2836d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // If we get here, something went wrong in our unfortunately complex logic above
2837d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    synthesizeGLError(GL_INVALID_VALUE, "getUniform", "unknown error");
2838d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebGLGetInfo();
2839d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2840d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2841c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtrWillBeRawPtr<WebGLUniformLocation> WebGLRenderingContextBase::getUniformLocation(WebGLProgram* program, const String& name)
2842d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2843d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("getUniformLocation", program))
2844d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2845d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateLocationLength("getUniformLocation", name))
2846d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2847d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateString("getUniformLocation", name))
2848d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2849d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isPrefixReserved(name))
2850d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2851d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!program->linkStatus()) {
2852d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "getUniformLocation", "program not linked");
2853d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2854d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2855a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    GLint uniformLocation = webContext()->getUniformLocation(objectOrZero(program), name.utf8().data());
2856d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (uniformLocation == -1)
2857d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
2858d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebGLUniformLocation::create(program, uniformLocation);
2859d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2860d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2861d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getVertexAttrib(GLuint index, GLenum pname)
2862d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2863d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2864d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2865d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (index >= m_maxVertexAttribs) {
2866d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "getVertexAttrib", "index out of range");
2867d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2868d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2869d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVertexArrayObject->getVertexAttribState(index);
2870d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2871d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (extensionEnabled(ANGLEInstancedArraysName) && pname == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE)
2872d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(state.divisor);
2873d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2874d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (pname) {
2875d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
2876d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!state.bufferBinding || !state.bufferBinding->object())
2877d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return WebGLGetInfo();
2878c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return WebGLGetInfo(PassRefPtrWillBeRawPtr<WebGLBuffer>(state.bufferBinding.get()));
2879d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
2880d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(state.enabled);
2881d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
2882d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(state.normalized);
2883d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_VERTEX_ATTRIB_ARRAY_SIZE:
2884d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(state.size);
2885d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
2886d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(state.originalStride);
2887d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_VERTEX_ATTRIB_ARRAY_TYPE:
2888d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(state.type);
2889d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_CURRENT_VERTEX_ATTRIB:
2890d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(Float32Array::create(m_vertexAttribValue[index].value, 4));
2891d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
2892d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getVertexAttrib", "invalid parameter name");
2893d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo();
2894d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2895d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2896d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2897d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)long long WebGLRenderingContextBase::getVertexAttribOffset(GLuint index, GLenum pname)
2898d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2899d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2900d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2901d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER) {
2902d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "getVertexAttribOffset", "invalid parameter name");
2903d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2904d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2905a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    GLsizeiptr result = webContext()->getVertexAttribOffset(index, pname);
2906d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return static_cast<long long>(result);
2907d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2908d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2909d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::hint(GLenum target, GLenum mode)
2910d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2911d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
2912d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
2913d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool isValid = false;
2914d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (target) {
2915d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_GENERATE_MIPMAP_HINT:
2916d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        isValid = true;
2917d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
2918d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: // OES_standard_derivatives
2919d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(OESStandardDerivativesName))
2920d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            isValid = true;
2921d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
2922d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2923d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isValid) {
2924d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "hint", "invalid target");
2925d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
2926d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2927a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->hint(target, mode);
2928d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2929d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2930d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLboolean WebGLRenderingContextBase::isBuffer(WebGLBuffer* buffer)
2931d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2932d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!buffer || isContextLost())
2933d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2934d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2935d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!buffer->hasEverBeenBound())
2936d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2937d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2938a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return webContext()->isBuffer(buffer->object());
2939d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2940d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2941a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochbool WebGLRenderingContextBase::isContextLost() const
2942d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
29437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_contextLostMode != NotLostContext;
2944d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2945d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2946d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLboolean WebGLRenderingContextBase::isEnabled(GLenum cap)
2947d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2948d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateCapability("isEnabled", cap))
2949d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2950d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (cap == GL_STENCIL_TEST)
2951d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return m_stencilEnabled;
2952a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return webContext()->isEnabled(cap);
2953d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2954d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2955d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLboolean WebGLRenderingContextBase::isFramebuffer(WebGLFramebuffer* framebuffer)
2956d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2957d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!framebuffer || isContextLost())
2958d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2959d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2960d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!framebuffer->hasEverBeenBound())
2961d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2962d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2963a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return webContext()->isFramebuffer(framebuffer->object());
2964d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2965d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2966d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLboolean WebGLRenderingContextBase::isProgram(WebGLProgram* program)
2967d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2968d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!program || isContextLost())
2969d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2970d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2971a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return webContext()->isProgram(program->object());
2972d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2973d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2974d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLboolean WebGLRenderingContextBase::isRenderbuffer(WebGLRenderbuffer* renderbuffer)
2975d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2976d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!renderbuffer || isContextLost())
2977d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2978d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2979d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!renderbuffer->hasEverBeenBound())
2980d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2981d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2982a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return webContext()->isRenderbuffer(renderbuffer->object());
2983d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2984d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2985d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLboolean WebGLRenderingContextBase::isShader(WebGLShader* shader)
2986d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2987d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!shader || isContextLost())
2988d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2989d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2990a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return webContext()->isShader(shader->object());
2991d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2992d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2993d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLboolean WebGLRenderingContextBase::isTexture(WebGLTexture* texture)
2994d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2995d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!texture || isContextLost())
2996d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
2997d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2998d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!texture->hasEverBeenBound())
2999d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
3000d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3001a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return webContext()->isTexture(texture->object());
3002d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3003d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3004d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::lineWidth(GLfloat width)
3005d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3006d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3007d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3008a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->lineWidth(width);
3009d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3010d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3011d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::linkProgram(WebGLProgram* program)
3012d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3013d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("linkProgram", program))
3014d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3015d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3016a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->linkProgram(objectOrZero(program));
3017d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    program->increaseLinkCount();
3018d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3019d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3020d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::pixelStorei(GLenum pname, GLint param)
3021d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3022d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3023d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3024d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (pname) {
3025d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GC3D_UNPACK_FLIP_Y_WEBGL:
3026d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_unpackFlipY = param;
3027d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3028d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GC3D_UNPACK_PREMULTIPLY_ALPHA_WEBGL:
3029d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_unpackPremultiplyAlpha = param;
3030d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3031d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GC3D_UNPACK_COLORSPACE_CONVERSION_WEBGL:
3032d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (static_cast<GLenum>(param) == GC3D_BROWSER_DEFAULT_WEBGL || param == GL_NONE) {
3033d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_unpackColorspaceConversion = static_cast<GLenum>(param);
3034d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        } else {
3035d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, "pixelStorei", "invalid parameter for UNPACK_COLORSPACE_CONVERSION_WEBGL");
3036d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
3037d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3038d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3039d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_PACK_ALIGNMENT:
3040d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNPACK_ALIGNMENT:
3041d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (param == 1 || param == 2 || param == 4 || param == 8) {
3042d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (pname == GL_PACK_ALIGNMENT) {
3043d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_packAlignment = param;
3044c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                drawingBuffer()->setPackAlignment(param);
3045d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            } else { // GL_UNPACK_ALIGNMENT:
3046d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_unpackAlignment = param;
3047d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
3048a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->pixelStorei(pname, param);
3049d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        } else {
3050d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, "pixelStorei", "invalid parameter for alignment");
3051d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
3052d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3053d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3054d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
3055d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "pixelStorei", "invalid parameter name");
3056d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3057d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3058d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3059d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3060d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::polygonOffset(GLfloat factor, GLfloat units)
3061d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3062d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3063d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3064a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->polygonOffset(factor, units);
3065d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3066d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3067d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, ArrayBufferView* pixels)
3068d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3069d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3070d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3071d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Due to WebGL's same-origin restrictions, it is not possible to
3072d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // taint the origin using the WebGL API.
3073d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(canvas()->originClean());
3074d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Validate input parameters.
3075d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!pixels) {
3076d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "readPixels", "no destination ArrayBufferView");
3077d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3078d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3079d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (format) {
3080d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ALPHA:
3081d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RGB:
3082d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RGBA:
3083d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3084d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
3085d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "readPixels", "invalid format");
3086d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3087d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
308810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
308910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    ArrayBufferView::ViewType expectedViewType;
309010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
3091d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (type) {
3092d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_BYTE:
309310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        expectedViewType = ArrayBufferView::TypeUint8;
309410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        break;
3095d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_SHORT_5_6_5:
3096d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_SHORT_4_4_4_4:
3097d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_SHORT_5_5_5_1:
309810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        expectedViewType = ArrayBufferView::TypeUint16;
309910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        break;
310010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_FLOAT:
310110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        expectedViewType = ArrayBufferView::TypeFloat32;
310210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        break;
310310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_HALF_FLOAT_OES:
310410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        expectedViewType = ArrayBufferView::TypeUint16;
3105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
3107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "readPixels", "invalid type");
3108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (format != GL_RGBA || type != GL_UNSIGNED_BYTE) {
311110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        // Check against the implementation color read format and type.
311210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        blink::WGC3Dint implFormat = 0, implType = 0;
311310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        webContext()->getIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &implFormat);
311410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        webContext()->getIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &implType);
311510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        if (!implFormat || !implType || format != static_cast<GLenum>(implFormat) || type != static_cast<GLenum>(implType)) {
311610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "format/type not RGBA/UNSIGNED_BYTE or implementation-defined values");
311710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            return;
311810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        }
3119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Validate array type against pixel type.
312110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (pixels->type() != expectedViewType) {
312210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "ArrayBufferView was the wrong type for the pixel format");
3123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3124d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const char* reason = "framebuffer incomplete";
3126a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), &reason)) {
3127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "readPixels", reason);
3128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Calculate array size, taking into consideration of PACK_ALIGNMENT.
3131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned totalBytesRequired = 0;
3132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned padding = 0;
3133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, width, height, m_packAlignment, &totalBytesRequired, &padding);
3134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (error != GL_NO_ERROR) {
3135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(error, "readPixels", "invalid dimensions");
3136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (pixels->byteLength() < totalBytesRequired) {
3139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "ArrayBufferView not large enough for dimensions");
3140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    clearIfComposited();
3144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void* data = pixels->baseAddress();
3145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
3147c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ScopedDrawingBufferBinder binder(drawingBuffer(), m_framebufferBinding.get());
3148a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->readPixels(x, y, width, height, format, type, data);
3149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#if OS(MACOSX)
3152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FIXME: remove this section when GL driver bug on Mac is fixed, i.e.,
3153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // when alpha is off, readPixels should set alpha to 255 instead of 0.
3154c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!m_framebufferBinding && !drawingBuffer()->getActualAttributes().alpha) {
3155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        unsigned char* pixels = reinterpret_cast<unsigned char*>(data);
3156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        for (GLsizei iy = 0; iy < height; ++iy) {
3157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            for (GLsizei ix = 0; ix < width; ++ix) {
3158d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                pixels[3] = 255;
3159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                pixels += 4;
3160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
3161d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            pixels += padding;
3162d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3163d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3164d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#endif
3165d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3166d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
3168d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3171d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (target != GL_RENDERBUFFER) {
3172d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "renderbufferStorage", "invalid target");
3173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3174d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3175d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_renderbufferBinding || !m_renderbufferBinding->object()) {
3176d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "renderbufferStorage", "no bound renderbuffer");
3177d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3178d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3179d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateSize("renderbufferStorage", width, height))
3180d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3181d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (internalformat) {
3182d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_COMPONENT16:
3183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RGBA4:
3184d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RGB5_A1:
3185d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RGB565:
3186d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_INDEX8:
3187a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->renderbufferStorage(target, internalformat, width, height);
3188d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_renderbufferBinding->setInternalFormat(internalformat);
3189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_renderbufferBinding->setSize(width, height);
3190a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        m_renderbufferBinding->deleteEmulatedStencilBuffer(webContext());
3191d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_STENCIL_OES:
3193d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (isDepthStencilSupported()) {
3194a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->renderbufferStorage(target, GL_DEPTH24_STENCIL8_OES, width, height);
3195d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        } else {
3196d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuffer(target, m_renderbufferBinding.get());
3197d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (!emulatedStencilBuffer) {
3198d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                synthesizeGLError(GL_OUT_OF_MEMORY, "renderbufferStorage", "out of memory");
3199d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return;
3200d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
3201a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->renderbufferStorage(target, GL_DEPTH_COMPONENT16, width, height);
3202a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->bindRenderbuffer(target, objectOrZero(emulatedStencilBuffer));
3203a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->renderbufferStorage(target, GL_STENCIL_INDEX8, width, height);
3204a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            webContext()->bindRenderbuffer(target, objectOrZero(m_renderbufferBinding.get()));
3205d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            emulatedStencilBuffer->setSize(width, height);
3206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            emulatedStencilBuffer->setInternalFormat(GL_STENCIL_INDEX8);
3207d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3208d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_renderbufferBinding->setSize(width, height);
3209d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_renderbufferBinding->setInternalFormat(internalformat);
3210d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3211d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
3212d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "renderbufferStorage", "invalid internalformat");
3213d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3214d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    applyStencilTest();
3216d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::sampleCoverage(GLfloat value, GLboolean invert)
3219d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3220d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3222a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->sampleCoverage(value, invert);
3223d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3224d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3225d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
3226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateSize("scissor", width, height))
3230d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3231a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->scissor(x, y, width, height);
3232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3233d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3234d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::shaderSource(WebGLShader* shader, const String& string)
3235d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3236d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("shaderSource", shader))
3237d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3238d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    String stringWithoutComments = StripComments(string).result();
3239d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateString("shaderSource", stringWithoutComments))
3240d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3241d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    shader->setSource(string);
3242a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->shaderSource(objectOrZero(shader), stringWithoutComments.utf8().data());
3243d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3244d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3245d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::stencilFunc(GLenum func, GLint ref, GLuint mask)
3246d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3247d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3248d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3249d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateStencilOrDepthFunc("stencilFunc", func))
3250d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3251d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_stencilFuncRef = ref;
3252d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_stencilFuncRefBack = ref;
3253d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_stencilFuncMask = mask;
3254d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_stencilFuncMaskBack = mask;
3255a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->stencilFunc(func, ref, mask);
3256d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3257d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3258d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3259d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3260d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3261d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3262d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateStencilOrDepthFunc("stencilFuncSeparate", func))
3263d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3264d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (face) {
3265d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FRONT_AND_BACK:
3266d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilFuncRef = ref;
3267d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilFuncRefBack = ref;
3268d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilFuncMask = mask;
3269d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilFuncMaskBack = mask;
3270d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3271d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FRONT:
3272d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilFuncRef = ref;
3273d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilFuncMask = mask;
3274d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3275d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BACK:
3276d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilFuncRefBack = ref;
3277d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilFuncMaskBack = mask;
3278d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
3280d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "stencilFuncSeparate", "invalid face");
3281d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3282d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3283a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->stencilFuncSeparate(face, func, ref, mask);
3284d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3285d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3286d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::stencilMask(GLuint mask)
3287d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3288d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3289d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3290d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_stencilMask = mask;
3291d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_stencilMaskBack = mask;
3292a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->stencilMask(mask);
3293d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3294d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3295d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::stencilMaskSeparate(GLenum face, GLuint mask)
3296d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3297d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3298d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3299d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (face) {
3300d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FRONT_AND_BACK:
3301d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilMask = mask;
3302d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilMaskBack = mask;
3303d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3304d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FRONT:
3305d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilMask = mask;
3306d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3307d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BACK:
3308d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_stencilMaskBack = mask;
3309d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3310d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
3311d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "stencilMaskSeparate", "invalid face");
3312d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3314a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->stencilMaskSeparate(face, mask);
3315d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3316d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3317d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
3318d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3320d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3321a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->stencilOp(fail, zfail, zpass);
3322d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3324d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3325d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3326d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3327d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3328a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->stencilOpSeparate(face, fail, zfail, zpass);
3329d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3330d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3331d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLenum WebGLRenderingContextBase::convertTexInternalFormat(GLenum internalformat, GLenum type)
3332d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3333d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Convert to sized internal formats that are renderable with GL_CHROMIUM_color_buffer_float_rgb(a).
3334d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (type == GL_FLOAT && internalformat == GL_RGBA
3335d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        && extensionsUtil()->isExtensionEnabled("GL_CHROMIUM_color_buffer_float_rgba"))
3336d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return GL_RGBA32F_EXT;
3337d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (type == GL_FLOAT && internalformat == GL_RGB
3338d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        && extensionsUtil()->isExtensionEnabled("GL_CHROMIUM_color_buffer_float_rgb"))
3339d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return GL_RGB32F_EXT;
3340d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return internalformat;
3341d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3342d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3343d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texImage2DBase(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels, ExceptionState& exceptionState)
3344d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3345d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // All calling functions check isContextLost, so a duplicate check is not needed here.
3346d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FIXME: Handle errors.
3347d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture* tex = validateTextureBinding("texImage2D", target, true);
3348d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(validateTexFuncParameters("texImage2D", NotTexSubImage2D, target, level, internalformat, width, height, border, format, type));
3349d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(tex);
3350d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!level || !WebGLTexture::isNPOT(width, height));
3351d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!pixels || validateSettableTexFormat("texImage2D", internalformat));
3352a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->texImage2D(target, level, convertTexInternalFormat(internalformat, type), width, height, border, format, type, pixels);
3353d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    tex->setLevelInfo(target, level, internalformat, width, height, type);
3354d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3355d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3356d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texImage2DImpl(GLenum target, GLint level, GLenum internalformat, GLenum format, GLenum type, Image* image, WebGLImageConversion::ImageHtmlDomSource domSource, bool flipY, bool premultiplyAlpha, ExceptionState& exceptionState)
3357d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3358d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // All calling functions check isContextLost, so a duplicate check is not needed here.
3359d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Vector<uint8_t> data;
3360d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLImageConversion::ImageExtractor imageExtractor(image, domSource, premultiplyAlpha, m_unpackColorspaceConversion == GL_NONE);
3361d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!imageExtractor.extractSucceeded()) {
3362d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "texImage2D", "bad image data");
3363d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3364d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3365d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLImageConversion::DataFormat sourceDataFormat = imageExtractor.imageSourceFormat();
3366d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLImageConversion::AlphaOp alphaOp = imageExtractor.imageAlphaOp();
3367d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const void* imagePixelData = imageExtractor.imagePixelData();
3368d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3369d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool needConversion = true;
3370d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (type == GL_UNSIGNED_BYTE && sourceDataFormat == WebGLImageConversion::DataFormatRGBA8 && format == GL_RGBA && alphaOp == WebGLImageConversion::AlphaDoNothing && !flipY)
3371d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        needConversion = false;
3372d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else {
3373d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!WebGLImageConversion::packImageData(image, imagePixelData, format, type, flipY, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtractor.imageHeight(), imageExtractor.imageSourceUnpackAlignment(), data)) {
3374d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, "texImage2D", "packImage error");
3375d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
3376d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3377d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3378d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3379d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_unpackAlignment != 1)
3380a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1);
338107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    texImage2DBase(target, level, internalformat, imageExtractor.imageWidth(), imageExtractor.imageHeight(), 0, format, type, needConversion ? data.data() : imagePixelData, exceptionState);
3382d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_unpackAlignment != 1)
3383a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment);
3384d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3385d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3386d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateTexFunc(const char* functionName, TexFuncValidationFunctionType functionType, TexFuncValidationSourceType sourceType, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLint xoffset, GLint yoffset)
3387d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3388d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateTexFuncParameters(functionName, functionType, target, level, internalformat, width, height, border, format, type))
3389d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
3390d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3391d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture* texture = validateTextureBinding(functionName, target, true);
3392d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!texture)
3393d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
3394d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3395d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (functionType == NotTexSubImage2D) {
3396d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (level && WebGLTexture::isNPOT(width, height)) {
3397d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, functionName, "level > 0 not power of 2");
3398d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
3399d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3400d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // For SourceArrayBufferView, function validateTexFuncData() would handle whether to validate the SettableTexFormat
3401d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // by checking if the ArrayBufferView is null or not.
3402d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (sourceType != SourceArrayBufferView) {
3403d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (!validateSettableTexFormat(functionName, format))
3404d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return false;
3405d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3406d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else {
3407d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!validateSettableTexFormat(functionName, format))
3408d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
3409d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!validateSize(functionName, xoffset, yoffset))
3410d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
3411d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // Before checking if it is in the range, check if overflow happens first.
3412d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (xoffset + width < 0 || yoffset + height < 0) {
3413d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, functionName, "bad dimensions");
3414d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
3415d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3416d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (xoffset + width > texture->getWidth(target, level) || yoffset + height > texture->getHeight(target, level)) {
3417d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, functionName, "dimensions out of range");
3418d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
3419d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3420d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (texture->getInternalFormat(target, level) != format || texture->getType(target, level) != type) {
3421d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "type and format do not match texture");
3422d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
3423d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3424d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3425d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3426d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
3427d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3428d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3429f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liubool WebGLRenderingContextBase::validateValueFitNonNegInt32(const char* functionName, const char* paramName, long long value)
3430f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
3431f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (value < 0) {
3432f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        String errorMsg = String(paramName) + " < 0";
3433f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        synthesizeGLError(GL_INVALID_VALUE, functionName, errorMsg.ascii().data());
3434f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return false;
3435f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
3436f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (value > static_cast<long long>(std::numeric_limits<int>::max())) {
3437f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        String errorMsg = String(paramName) + " more than 32-bit";
3438f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        synthesizeGLError(GL_INVALID_OPERATION, functionName, errorMsg.ascii().data());
3439f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return false;
3440f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
3441f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return true;
3442f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
3443f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
3444d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtr<Image> WebGLRenderingContextBase::drawImageIntoBuffer(Image* image, int width, int height, const char* functionName)
3445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3446d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    IntSize size(width, height);
3447d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ImageBuffer* buf = m_generatedImageCache.imageBuffer(size);
3448d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!buf) {
3449d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_OUT_OF_MEMORY, functionName, "out of memory");
3450d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
3451d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3452d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3453d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    IntRect srcRect(IntPoint(), image->size());
3454d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    IntRect destRect(0, 0, size.width(), size.height());
3455d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    buf->context()->drawImage(image, destRect, srcRect);
3456d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return buf->copyImage(ImageBuffer::fastCopyImageMode());
3457d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3458d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3459d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum internalformat,
3460d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLsizei width, GLsizei height, GLint border,
3461d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum format, GLenum type, ArrayBufferView* pixels, ExceptionState& exceptionState)
3462d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3463d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateTexFuncData("texImage2D", level, width, height, format, type, pixels, NullAllowed)
3464d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceArrayBufferView, target, level, internalformat, width, height, border, format, type, 0, 0))
3465d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3466d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void* data = pixels ? pixels->baseAddress() : 0;
3467d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Vector<uint8_t> tempData;
3468d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool changeUnpackAlignment = false;
3469d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (data && (m_unpackFlipY || m_unpackPremultiplyAlpha)) {
3470d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!WebGLImageConversion::extractTextureData(width, height, format, type, m_unpackAlignment, m_unpackFlipY, m_unpackPremultiplyAlpha, data, tempData))
3471d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
3472d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        data = tempData.data();
3473d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        changeUnpackAlignment = true;
3474d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3475d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (changeUnpackAlignment)
3476a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1);
3477d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    texImage2DBase(target, level, internalformat, width, height, border, format, type, data, exceptionState);
3478d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (changeUnpackAlignment)
3479a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment);
3480d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3481d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3482d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum internalformat,
3483d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum format, GLenum type, ImageData* pixels, ExceptionState& exceptionState)
3484d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3485d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !pixels || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceImageData, target, level, internalformat, pixels->width(), pixels->height(), 0, format, type, 0, 0))
3486d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3487d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Vector<uint8_t> data;
3488d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool needConversion = true;
3489d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // The data from ImageData is always of format RGBA8.
3490d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // No conversion is needed if destination format is RGBA and type is USIGNED_BYTE and no Flip or Premultiply operation is required.
3491d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_unpackFlipY && !m_unpackPremultiplyAlpha && format == GL_RGBA && type == GL_UNSIGNED_BYTE)
3492d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        needConversion = false;
3493d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else {
3494d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!WebGLImageConversion::extractImageData(pixels->data()->data(), pixels->size(), format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) {
3495d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, "texImage2D", "bad image data");
3496d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
3497d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3498d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3499d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_unpackAlignment != 1)
3500a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1);
3501d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    texImage2DBase(target, level, internalformat, pixels->width(), pixels->height(), 0, format, type, needConversion ? data.data() : pixels->data()->data(), exceptionState);
3502d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_unpackAlignment != 1)
3503a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment);
3504d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3505d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3506d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum internalformat,
3507d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum format, GLenum type, HTMLImageElement* image, ExceptionState& exceptionState)
3508d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3509d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateHTMLImageElement("texImage2D", image, exceptionState))
3510d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3511d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3512d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtr<Image> imageForRender = image->cachedImage()->imageForRenderer(image->renderer());
3513d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (imageForRender->isSVGImage())
3514d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        imageForRender = drawImageIntoBuffer(imageForRender.get(), image->width(), image->height(), "texImage2D");
3515d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3516d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!imageForRender || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLImageElement, target, level, internalformat, imageForRender->width(), imageForRender->height(), 0, format, type, 0, 0))
3517d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3518d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3519d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    texImage2DImpl(target, level, internalformat, format, type, imageForRender.get(), WebGLImageConversion::HtmlDomImage, m_unpackFlipY, m_unpackPremultiplyAlpha, exceptionState);
3520d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3521d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3522d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum internalformat,
3523d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum format, GLenum type, HTMLCanvasElement* canvas, ExceptionState& exceptionState)
3524d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3525d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateHTMLCanvasElement("texImage2D", canvas, exceptionState) || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLCanvasElement, target, level, internalformat, canvas->width(), canvas->height(), 0, format, type, 0, 0))
3526d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3527d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3528d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture* texture = validateTextureBinding("texImage2D", target, true);
352943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
3530d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // If possible, copy from the canvas element directly to the texture
3531d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // via the GPU, without a read-back to system memory.
3532d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (GL_TEXTURE_2D == target && texture) {
353343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        ScopedTexture2DRestorer restorer(this);
353443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
3535d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!canvas->is3D()) {
3536d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            ImageBuffer* buffer = canvas->buffer();
3537a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            if (buffer && buffer->copyToPlatformTexture(webContext(), texture->object(), internalformat, type,
3538d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                level, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
3539d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                texture->setLevelInfo(target, level, internalformat, canvas->width(), canvas->height(), type);
3540d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return;
3541d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
3542d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        } else {
3543d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            WebGLRenderingContextBase* gl = toWebGLRenderingContextBase(canvas->renderingContext());
354443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            ScopedTexture2DRestorer restorer(gl);
3545c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            if (gl && gl->drawingBuffer()->copyToPlatformTexture(webContext(), texture->object(), internalformat, type,
3546d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                level, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
3547d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                texture->setLevelInfo(target, level, internalformat, canvas->width(), canvas->height(), type);
3548d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return;
3549d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
3550d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3551d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3552d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3553aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    RefPtrWillBeRawPtr<ImageData> imageData = canvas->getImageData();
3554d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (imageData)
3555d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        texImage2D(target, level, internalformat, format, type, imageData.get(), exceptionState);
3556d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
3557d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        texImage2DImpl(target, level, internalformat, format, type, canvas->copiedImage(), WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY, m_unpackPremultiplyAlpha, exceptionState);
3558d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3559d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3560d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtr<Image> WebGLRenderingContextBase::videoFrameToImage(HTMLVideoElement* video, BackingStoreCopy backingStoreCopy)
3561d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3562d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    IntSize size(video->videoWidth(), video->videoHeight());
3563d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ImageBuffer* buf = m_generatedImageCache.imageBuffer(size);
3564d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!buf) {
3565d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_OUT_OF_MEMORY, "texImage2D", "out of memory");
3566d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
3567d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3568d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    IntRect destRect(0, 0, size.width(), size.height());
3569d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    video->paintCurrentFrameInContext(buf->context(), destRect);
3570d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return buf->copyImage(backingStoreCopy);
3571d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3572d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3573d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum internalformat,
3574d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum format, GLenum type, HTMLVideoElement* video, ExceptionState& exceptionState)
3575d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3576d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateHTMLVideoElement("texImage2D", video, exceptionState)
3577d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLVideoElement, target, level, internalformat, video->videoWidth(), video->videoHeight(), 0, format, type, 0, 0))
3578d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3579d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3580d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Go through the fast path doing a GPU-GPU textures copy without a readback to system memory if possible.
3581d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Otherwise, it will fall back to the normal SW path.
3582d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture* texture = validateTextureBinding("texImage2D", target, true);
3583d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (GL_TEXTURE_2D == target && texture) {
3584c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (video->copyVideoTextureToPlatformTexture(webContext(), texture->object(), level, internalformat, type, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
3585d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            texture->setLevelInfo(target, level, internalformat, video->videoWidth(), video->videoHeight(), type);
3586d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
3587d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3588d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3589d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
35907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Try using an accelerated image buffer, this allows YUV conversion to be done on the GPU.
35917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    OwnPtr<ImageBufferSurface> surface = adoptPtr(new AcceleratedImageBufferSurface(IntSize(video->videoWidth(), video->videoHeight())));
35927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (surface->isValid()) {
35937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        OwnPtr<ImageBuffer> imageBuffer(ImageBuffer::create(surface.release()));
35947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (imageBuffer) {
35957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // The video element paints an RGBA frame into our surface here. By using an AcceleratedImageBufferSurface,
35967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // we enable the WebMediaPlayer implementation to do any necessary color space conversion on the GPU (though it
35977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // may still do a CPU conversion and upload the results).
35987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            video->paintCurrentFrameInContext(imageBuffer->context(), IntRect(0, 0, video->videoWidth(), video->videoHeight()));
35997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            imageBuffer->context()->canvas()->flush();
36007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
36017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // This is a straight GPU-GPU copy, any necessary color space conversion was handled in the paintCurrentFrameInContext() call.
36027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (imageBuffer->copyToPlatformTexture(webContext(), texture->object(), internalformat, type,
36037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                level, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
36047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                texture->setLevelInfo(target, level, internalformat, video->videoWidth(), video->videoHeight(), type);
36057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                return;
36067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            }
36077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
36087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
36097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
3610d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Normal pure SW path.
3611d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtr<Image> image = videoFrameToImage(video, ImageBuffer::fastCopyImageMode());
3612d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!image)
3613d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3614d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    texImage2DImpl(target, level, internalformat, format, type, image.get(), WebGLImageConversion::HtmlDomVideo, m_unpackFlipY, m_unpackPremultiplyAlpha, exceptionState);
3615d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3616d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3617d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texParameter(GLenum target, GLenum pname, GLfloat paramf, GLint parami, bool isFloat)
3618d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3619d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
3620d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3621d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture* tex = validateTextureBinding("texParameter", target, false);
3622d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!tex)
3623d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3624d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (pname) {
3625d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_MIN_FILTER:
3626d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_MAG_FILTER:
3627d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3628d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_WRAP_S:
3629d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_WRAP_T:
3630d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if ((isFloat && paramf != GL_CLAMP_TO_EDGE && paramf != GL_MIRRORED_REPEAT && paramf != GL_REPEAT)
3631d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            || (!isFloat && parami != GL_CLAMP_TO_EDGE && parami != GL_MIRRORED_REPEAT && parami != GL_REPEAT)) {
3632d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_ENUM, "texParameter", "invalid parameter");
3633d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
3634d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3635d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3636d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotropic
3637d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!extensionEnabled(EXTTextureFilterAnisotropicName)) {
3638d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_ENUM, "texParameter", "invalid parameter, EXT_texture_filter_anisotropic not enabled");
3639d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
3640d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3641d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
3642d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
3643d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "texParameter", "invalid parameter name");
3644d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3645d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3646d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isFloat) {
3647d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        tex->setParameterf(pname, paramf);
3648a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->texParameterf(target, pname, paramf);
3649d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else {
3650d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        tex->setParameteri(pname, parami);
3651a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->texParameteri(target, pname, parami);
3652d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3653d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3654d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3655d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texParameterf(GLenum target, GLenum pname, GLfloat param)
3656d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3657d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    texParameter(target, pname, param, 0, true);
3658d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3659d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3660d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texParameteri(GLenum target, GLenum pname, GLint param)
3661d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3662d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    texParameter(target, pname, 0, param, false);
3663d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3664d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3665d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texSubImage2DBase(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels, ExceptionState& exceptionState)
3666d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3667d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FIXME: Handle errors.
3668d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!isContextLost());
3669d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(validateTexFuncParameters("texSubImage2D", TexSubImage2D, target, level, format, width, height, 0, format, type));
3670d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(validateSize("texSubImage2D", xoffset, yoffset));
3671d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(validateSettableTexFormat("texSubImage2D", format));
3672d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture* tex = validateTextureBinding("texSubImage2D", target, true);
3673d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!tex) {
3674d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ASSERT_NOT_REACHED();
3675d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3676d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3677d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT((xoffset + width) >= 0);
3678d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT((yoffset + height) >= 0);
3679d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(tex->getWidth(target, level) >= (xoffset + width));
3680d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(tex->getHeight(target, level) >= (yoffset + height));
3681d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(tex->getInternalFormat(target, level) == format);
3682d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(tex->getType(target, level) == type);
3683a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
3684d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3685d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3686d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texSubImage2DImpl(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLenum format, GLenum type, Image* image, WebGLImageConversion::ImageHtmlDomSource domSource, bool flipY, bool premultiplyAlpha, ExceptionState& exceptionState)
3687d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3688d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // All calling functions check isContextLost, so a duplicate check is not needed here.
3689d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Vector<uint8_t> data;
3690d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLImageConversion::ImageExtractor imageExtractor(image, domSource, premultiplyAlpha, m_unpackColorspaceConversion == GL_NONE);
3691d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!imageExtractor.extractSucceeded()) {
3692d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "texSubImage2D", "bad image");
3693d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3694d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3695d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLImageConversion::DataFormat sourceDataFormat = imageExtractor.imageSourceFormat();
3696d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLImageConversion::AlphaOp alphaOp = imageExtractor.imageAlphaOp();
3697d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const void* imagePixelData = imageExtractor.imagePixelData();
3698d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3699d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool needConversion = true;
3700d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (type == GL_UNSIGNED_BYTE && sourceDataFormat == WebGLImageConversion::DataFormatRGBA8 && format == GL_RGBA && alphaOp == WebGLImageConversion::AlphaDoNothing && !flipY)
3701d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        needConversion = false;
3702d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else {
3703d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!WebGLImageConversion::packImageData(image, imagePixelData, format, type, flipY, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtractor.imageHeight(), imageExtractor.imageSourceUnpackAlignment(), data)) {
3704d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, "texSubImage2D", "bad image data");
3705d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
3706d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3707d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3708d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3709d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_unpackAlignment != 1)
3710a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1);
371107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    texSubImage2DBase(target, level, xoffset, yoffset, imageExtractor.imageWidth(), imageExtractor.imageHeight(), format, type,  needConversion ? data.data() : imagePixelData, exceptionState);
3712d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_unpackAlignment != 1)
3713a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment);
3714d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3715d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3716d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
3717d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLsizei width, GLsizei height,
3718d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum format, GLenum type, ArrayBufferView* pixels, ExceptionState& exceptionState)
3719d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3720d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateTexFuncData("texSubImage2D", level, width, height, format, type, pixels, NullNotAllowed)
3721d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        || !validateTexFunc("texSubImage2D", TexSubImage2D, SourceArrayBufferView, target, level, format, width, height, 0, format, type, xoffset, yoffset))
3722d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3723d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void* data = pixels->baseAddress();
3724d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Vector<uint8_t> tempData;
3725d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool changeUnpackAlignment = false;
3726d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (data && (m_unpackFlipY || m_unpackPremultiplyAlpha)) {
3727d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!WebGLImageConversion::extractTextureData(width, height, format, type,
3728d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                                           m_unpackAlignment,
3729d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                                           m_unpackFlipY, m_unpackPremultiplyAlpha,
3730d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                                           data,
3731d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                                           tempData))
3732d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
3733d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        data = tempData.data();
3734d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        changeUnpackAlignment = true;
3735d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3736d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (changeUnpackAlignment)
3737a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1);
3738d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    texSubImage2DBase(target, level, xoffset, yoffset, width, height, format, type, data, exceptionState);
3739d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (changeUnpackAlignment)
3740a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment);
3741d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3742d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3743d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
3744d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum format, GLenum type, ImageData* pixels, ExceptionState& exceptionState)
3745d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3746d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !pixels || !validateTexFunc("texSubImage2D", TexSubImage2D, SourceImageData, target, level, format,  pixels->width(), pixels->height(), 0, format, type, xoffset, yoffset))
3747d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3748d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3749d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Vector<uint8_t> data;
3750d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool needConversion = true;
3751d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // The data from ImageData is always of format RGBA8.
3752d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // No conversion is needed if destination format is RGBA and type is USIGNED_BYTE and no Flip or Premultiply operation is required.
3753d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && !m_unpackFlipY && !m_unpackPremultiplyAlpha)
3754d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        needConversion = false;
3755d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else {
3756d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!WebGLImageConversion::extractImageData(pixels->data()->data(), pixels->size(), format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) {
3757d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, "texSubImage2D", "bad image data");
3758d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
3759d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
3760d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3761d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_unpackAlignment != 1)
3762a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, 1);
3763d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    texSubImage2DBase(target, level, xoffset, yoffset, pixels->width(), pixels->height(), format, type, needConversion ? data.data() : pixels->data()->data(), exceptionState);
3764d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_unpackAlignment != 1)
3765a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment);
3766d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3767d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3768d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
3769d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum format, GLenum type, HTMLImageElement* image, ExceptionState& exceptionState)
3770d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3771d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateHTMLImageElement("texSubImage2D", image, exceptionState))
3772d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3773d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3774d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtr<Image> imageForRender = image->cachedImage()->imageForRenderer(image->renderer());
3775d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (imageForRender->isSVGImage())
3776d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        imageForRender = drawImageIntoBuffer(imageForRender.get(), image->width(), image->height(), "texSubImage2D");
3777d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3778d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!imageForRender || !validateTexFunc("texSubImage2D", TexSubImage2D, SourceHTMLImageElement, target, level, format, imageForRender->width(), imageForRender->height(), 0, format, type, xoffset, yoffset))
3779d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3780d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3781d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    texSubImage2DImpl(target, level, xoffset, yoffset, format, type, imageForRender.get(), WebGLImageConversion::HtmlDomImage, m_unpackFlipY, m_unpackPremultiplyAlpha, exceptionState);
3782d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3783d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3784d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
3785d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum format, GLenum type, HTMLCanvasElement* canvas, ExceptionState& exceptionState)
3786d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3787d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateHTMLCanvasElement("texSubImage2D", canvas, exceptionState)
3788d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        || !validateTexFunc("texSubImage2D", TexSubImage2D, SourceHTMLCanvasElement, target, level, format, canvas->width(), canvas->height(), 0, format, type, xoffset, yoffset))
3789d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3790d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3791aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    RefPtrWillBeRawPtr<ImageData> imageData = canvas->getImageData();
3792d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (imageData)
3793d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        texSubImage2D(target, level, xoffset, yoffset, format, type, imageData.get(), exceptionState);
3794d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
3795d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        texSubImage2DImpl(target, level, xoffset, yoffset, format, type, canvas->copiedImage(), WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY, m_unpackPremultiplyAlpha, exceptionState);
3796d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3797d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3798d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
3799d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum format, GLenum type, HTMLVideoElement* video, ExceptionState& exceptionState)
3800d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3801d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateHTMLVideoElement("texSubImage2D", video, exceptionState)
3802d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        || !validateTexFunc("texSubImage2D", TexSubImage2D, SourceHTMLVideoElement, target, level, format, video->videoWidth(), video->videoHeight(), 0, format, type, xoffset, yoffset))
3803d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3804d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3805d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtr<Image> image = videoFrameToImage(video, ImageBuffer::fastCopyImageMode());
3806d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!image)
3807d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3808d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    texSubImage2DImpl(target, level, xoffset, yoffset, format, type, image.get(), WebGLImageConversion::HtmlDomVideo, m_unpackFlipY, m_unpackPremultiplyAlpha, exceptionState);
3809d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3810d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3811d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform1f(const WebGLUniformLocation* location, GLfloat x)
3812d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3813d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !location)
3814d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3815d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3816d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (location->program() != m_currentProgram) {
3817d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "uniform1f", "location not for current program");
3818d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3819d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3820d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3821a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform1f(location->location(), x);
3822d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3823d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3824d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform1fv(const WebGLUniformLocation* location, Float32Array* v)
3825d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3826d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform1fv", location, v, 1))
3827d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3828d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3829a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform1fv(location->location(), v->length(), v->data());
3830d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3831d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3832d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform1fv(const WebGLUniformLocation* location, GLfloat* v, GLsizei size)
3833d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3834d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform1fv", location, v, size, 1))
3835d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3836d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3837a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform1fv(location->location(), size, v);
3838d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3839d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3840d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform1i(const WebGLUniformLocation* location, GLint x)
3841d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3842d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !location)
3843d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3844d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3845d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (location->program() != m_currentProgram) {
3846d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "uniform1i", "location not for current program");
3847d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3848d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3849d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3850a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform1i(location->location(), x);
3851d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3852d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3853d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform1iv(const WebGLUniformLocation* location, Int32Array* v)
3854d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3855d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform1iv", location, v, 1))
3856d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3857d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3858a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform1iv(location->location(), v->length(), v->data());
3859d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3860d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3861d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform1iv(const WebGLUniformLocation* location, GLint* v, GLsizei size)
3862d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3863d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform1iv", location, v, size, 1))
3864d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3865d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3866a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform1iv(location->location(), size, v);
3867d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3868d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3869d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform2f(const WebGLUniformLocation* location, GLfloat x, GLfloat y)
3870d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3871d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !location)
3872d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3873d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3874d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (location->program() != m_currentProgram) {
3875d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "uniform2f", "location not for current program");
3876d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3877d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3878d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3879a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform2f(location->location(), x, y);
3880d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3881d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3882d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform2fv(const WebGLUniformLocation* location, Float32Array* v)
3883d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3884d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform2fv", location, v, 2))
3885d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3886d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3887c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    webContext()->uniform2fv(location->location(), v->length() >> 1, v->data());
3888d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3889d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3890d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform2fv(const WebGLUniformLocation* location, GLfloat* v, GLsizei size)
3891d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3892d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform2fv", location, v, size, 2))
3893d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3894d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3895c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    webContext()->uniform2fv(location->location(), size >> 1, v);
3896d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3897d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3898d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform2i(const WebGLUniformLocation* location, GLint x, GLint y)
3899d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3900d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !location)
3901d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3902d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3903d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (location->program() != m_currentProgram) {
3904d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "uniform2i", "location not for current program");
3905d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3906d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3907d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3908a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform2i(location->location(), x, y);
3909d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3910d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3911d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform2iv(const WebGLUniformLocation* location, Int32Array* v)
3912d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3913d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform2iv", location, v, 2))
3914d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3915d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3916c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    webContext()->uniform2iv(location->location(), v->length() >> 1, v->data());
3917d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3918d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3919d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform2iv(const WebGLUniformLocation* location, GLint* v, GLsizei size)
3920d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3921d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform2iv", location, v, size, 2))
3922d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3923d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3924c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    webContext()->uniform2iv(location->location(), size >> 1, v);
3925d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3926d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3927d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform3f(const WebGLUniformLocation* location, GLfloat x, GLfloat y, GLfloat z)
3928d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3929d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !location)
3930d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3931d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3932d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (location->program() != m_currentProgram) {
3933d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "uniform3f", "location not for current program");
3934d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3935d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3936d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3937a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform3f(location->location(), x, y, z);
3938d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3939d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3940d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform3fv(const WebGLUniformLocation* location, Float32Array* v)
3941d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3942d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform3fv", location, v, 3))
3943d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3944d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3945a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform3fv(location->location(), v->length() / 3, v->data());
3946d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3947d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3948d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform3fv(const WebGLUniformLocation* location, GLfloat* v, GLsizei size)
3949d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3950d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform3fv", location, v, size, 3))
3951d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3952d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3953a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform3fv(location->location(), size / 3, v);
3954d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3955d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3956d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform3i(const WebGLUniformLocation* location, GLint x, GLint y, GLint z)
3957d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3958d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !location)
3959d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3960d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3961d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (location->program() != m_currentProgram) {
3962d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "uniform3i", "location not for current program");
3963d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3964d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3965d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3966a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform3i(location->location(), x, y, z);
3967d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3968d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3969d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform3iv(const WebGLUniformLocation* location, Int32Array* v)
3970d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3971d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform3iv", location, v, 3))
3972d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3973d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3974a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform3iv(location->location(), v->length() / 3, v->data());
3975d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3976d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3977d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform3iv(const WebGLUniformLocation* location, GLint* v, GLsizei size)
3978d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3979d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform3iv", location, v, size, 3))
3980d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3981d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3982a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform3iv(location->location(), size / 3, v);
3983d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3984d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3985d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform4f(const WebGLUniformLocation* location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3986d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3987d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !location)
3988d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3989d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3990d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (location->program() != m_currentProgram) {
3991d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "uniform4f", "location not for current program");
3992d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
3993d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3994d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3995a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform4f(location->location(), x, y, z, w);
3996d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3997d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3998d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform4fv(const WebGLUniformLocation* location, Float32Array* v)
3999d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4000d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform4fv", location, v, 4))
4001d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4002d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4003c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    webContext()->uniform4fv(location->location(), v->length() >> 2, v->data());
4004d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4005d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4006d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform4fv(const WebGLUniformLocation* location, GLfloat* v, GLsizei size)
4007d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4008d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform4fv", location, v, size, 4))
4009d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4010d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4011c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    webContext()->uniform4fv(location->location(), size >> 2, v);
4012d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4013d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4014d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform4i(const WebGLUniformLocation* location, GLint x, GLint y, GLint z, GLint w)
4015d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4016d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !location)
4017d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4018d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4019d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (location->program() != m_currentProgram) {
4020d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "uniform4i", "location not for current program");
4021d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4022d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4023d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4024a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniform4i(location->location(), x, y, z, w);
4025d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4026d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4027d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform4iv(const WebGLUniformLocation* location, Int32Array* v)
4028d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4029d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform4iv", location, v, 4))
4030d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4031d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4032c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    webContext()->uniform4iv(location->location(), v->length() >> 2, v->data());
4033d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4034d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4035d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniform4iv(const WebGLUniformLocation* location, GLint* v, GLsizei size)
4036d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4037d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformParameters("uniform4iv", location, v, size, 4))
4038d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4039d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4040c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    webContext()->uniform4iv(location->location(), size >> 2, v);
4041d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4042d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4043d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniformMatrix2fv(const WebGLUniformLocation* location, GLboolean transpose, Float32Array* v)
4044d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4045d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformMatrixParameters("uniformMatrix2fv", location, transpose, v, 4))
4046d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4047c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    webContext()->uniformMatrix2fv(location->location(), v->length() >> 2, transpose, v->data());
4048d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4049d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4050d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniformMatrix2fv(const WebGLUniformLocation* location, GLboolean transpose, GLfloat* v, GLsizei size)
4051d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4052d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformMatrixParameters("uniformMatrix2fv", location, transpose, v, size, 4))
4053d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4054c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    webContext()->uniformMatrix2fv(location->location(), size >> 2, transpose, v);
4055d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4056d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4057d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniformMatrix3fv(const WebGLUniformLocation* location, GLboolean transpose, Float32Array* v)
4058d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4059d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformMatrixParameters("uniformMatrix3fv", location, transpose, v, 9))
4060d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4061a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniformMatrix3fv(location->location(), v->length() / 9, transpose, v->data());
4062d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4063d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4064d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniformMatrix3fv(const WebGLUniformLocation* location, GLboolean transpose, GLfloat* v, GLsizei size)
4065d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4066d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformMatrixParameters("uniformMatrix3fv", location, transpose, v, size, 9))
4067d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4068a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->uniformMatrix3fv(location->location(), size / 9, transpose, v);
4069d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4070d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4071d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniformMatrix4fv(const WebGLUniformLocation* location, GLboolean transpose, Float32Array* v)
4072d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4073d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformMatrixParameters("uniformMatrix4fv", location, transpose, v, 16))
4074d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4075c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    webContext()->uniformMatrix4fv(location->location(), v->length() >> 4, transpose, v->data());
4076d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4077d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4078d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::uniformMatrix4fv(const WebGLUniformLocation* location, GLboolean transpose, GLfloat* v, GLsizei size)
4079d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4080d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateUniformMatrixParameters("uniformMatrix4fv", location, transpose, v, size, 16))
4081d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4082c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    webContext()->uniformMatrix4fv(location->location(), size >> 4, transpose, v);
4083d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4084d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4085d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::useProgram(WebGLProgram* program)
4086d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4087d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool deleted;
4088d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!checkObjectToBeBound("useProgram", program, deleted))
4089d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4090d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (deleted)
4091d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        program = 0;
4092d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (program && !program->linkStatus()) {
4093d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "useProgram", "program not valid");
4094d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4095d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4096d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_currentProgram != program) {
4097d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (m_currentProgram)
4098a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            m_currentProgram->onDetached(webContext());
4099d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_currentProgram = program;
4100a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->useProgram(objectOrZero(program));
4101d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (program)
4102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            program->onAttached();
4103d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4104d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::validateProgram(WebGLProgram* program)
4107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateWebGLObject("validateProgram", program))
4109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4110a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->validateProgram(objectOrZero(program));
4111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4112d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4113d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttrib1f(GLuint index, GLfloat v0)
4114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4115d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    vertexAttribfImpl("vertexAttrib1f", index, 1, v0, 0.0f, 0.0f, 1.0f);
4116d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4117d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4118d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttrib1fv(GLuint index, Float32Array* v)
4119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    vertexAttribfvImpl("vertexAttrib1fv", index, v, 1);
4121d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4122d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttrib1fv(GLuint index, GLfloat* v, GLsizei size)
4124d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    vertexAttribfvImpl("vertexAttrib1fv", index, v, size, 1);
4126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttrib2f(GLuint index, GLfloat v0, GLfloat v1)
4129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    vertexAttribfImpl("vertexAttrib2f", index, 2, v0, v1, 0.0f, 1.0f);
4131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttrib2fv(GLuint index, Float32Array* v)
4134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    vertexAttribfvImpl("vertexAttrib2fv", index, v, 2);
4136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttrib2fv(GLuint index, GLfloat* v, GLsizei size)
4139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    vertexAttribfvImpl("vertexAttrib2fv", index, v, size, 2);
4141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttrib3f(GLuint index, GLfloat v0, GLfloat v1, GLfloat v2)
4144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    vertexAttribfImpl("vertexAttrib3f", index, 3, v0, v1, v2, 1.0f);
4146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttrib3fv(GLuint index, Float32Array* v)
4149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    vertexAttribfvImpl("vertexAttrib3fv", index, v, 3);
4151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttrib3fv(GLuint index, GLfloat* v, GLsizei size)
4154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    vertexAttribfvImpl("vertexAttrib3fv", index, v, size, 3);
4156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4158d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttrib4f(GLuint index, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
4159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    vertexAttribfImpl("vertexAttrib4f", index, 4, v0, v1, v2, v3);
4161d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4162d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4163d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttrib4fv(GLuint index, Float32Array* v)
4164d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4165d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    vertexAttribfvImpl("vertexAttrib4fv", index, v, 4);
4166d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4168d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttrib4fv(GLuint index, GLfloat* v, GLsizei size)
4169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    vertexAttribfvImpl("vertexAttrib4fv", index, v, size, 4);
4171d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4172d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, long long offset)
4174d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4175d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
4176d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4177d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (type) {
4178d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BYTE:
4179d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_BYTE:
4180d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SHORT:
4181d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_SHORT:
4182d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FLOAT:
4183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4184d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
4185d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, "vertexAttribPointer", "invalid type");
4186d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4187d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4188d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (index >= m_maxVertexAttribs) {
4189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "vertexAttribPointer", "index out of range");
4190d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4191d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4192f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (size < 1 || size > 4 || stride < 0 || stride > 255) {
4193f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        synthesizeGLError(GL_INVALID_VALUE, "vertexAttribPointer", "bad size or stride");
4194d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4195d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4196f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (!validateValueFitNonNegInt32("vertexAttribPointer", "offset", offset))
4197f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return;
4198d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_boundArrayBuffer) {
4199d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "vertexAttribPointer", "no bound ARRAY_BUFFER");
4200d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4201d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4202d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned typeSize = sizeInBytes(type);
4203c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ASSERT((typeSize & (typeSize - 1)) == 0); // Ensure that the value is POT.
4204c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if ((stride & (typeSize - 1)) || (static_cast<GLintptr>(offset) & (typeSize - 1))) {
4205d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "vertexAttribPointer", "stride or offset not valid for type");
4206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4207d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4208d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLsizei bytesPerElement = size * typeSize;
4209d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4210d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_boundVertexArrayObject->setVertexAttribState(index, bytesPerElement, size, type, normalized, stride, static_cast<GLintptr>(offset), m_boundArrayBuffer);
4211a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->vertexAttribPointer(index, size, type, normalized, stride, static_cast<GLintptr>(offset));
4212d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4213d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4214d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttribDivisorANGLE(GLuint index, GLuint divisor)
4215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4216d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
4217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4219d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (index >= m_maxVertexAttribs) {
4220d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, "vertexAttribDivisorANGLE", "index out of range");
4221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4222d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4223d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4224d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_boundVertexArrayObject->setVertexAttribDivisor(index, divisor);
4225a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->vertexAttribDivisorANGLE(index, divisor);
4226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4230d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
4231d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateSize("viewport", width, height))
4233d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4234a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->viewport(x, y, width, height);
4235d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4236d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
42377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebGLRenderingContextBase::forceLostContext(LostContextMode mode, AutoRecoveryMethod autoRecoveryMethod)
4238d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4239d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost()) {
4240d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "loseContext", "context already lost");
4241d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4242d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4243d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
42447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_contextGroup->loseContextGroup(mode, autoRecoveryMethod);
4245d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4246d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
42477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebGLRenderingContextBase::loseContextImpl(WebGLRenderingContextBase::LostContextMode mode, AutoRecoveryMethod autoRecoveryMethod)
4248d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4249d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
4250d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4251d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4252d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_contextLostMode = mode;
42537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(m_contextLostMode != NotLostContext);
42547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_autoRecoveryMethod = autoRecoveryMethod;
4255d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4256d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (mode == RealLostContext) {
4257d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // Inform the embedder that a lost context was received. In response, the embedder might
4258d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // decide to take action such as asking the user for permission to use WebGL again.
4259d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (LocalFrame* frame = canvas()->document().frame())
4260a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            frame->loader().client()->didLoseWebGLContext(webContext()->getGraphicsResetStatusARB());
4261d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4262d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4263d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Make absolutely sure we do not refer to an already-deleted texture or framebuffer.
4264c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    drawingBuffer()->setTexture2DBinding(0);
4265c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    drawingBuffer()->setFramebufferBinding(0);
4266d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4267d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    detachAndRemoveAllObjects();
4268d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4269d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Lose all the extensions.
4270d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (size_t i = 0; i < m_extensions.size(); ++i) {
4271c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ExtensionTracker* tracker = m_extensions[i].get();
4272d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        tracker->loseExtension();
4273d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4274d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4275d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (size_t i = 0; i < WebGLExtensionNameCount; ++i)
4276d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_extensionEnabled[i] = false;
4277d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4278d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    removeAllCompressedTextureFormats();
4279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4280d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (mode != RealLostContext)
4281d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        destroyContext();
4282d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4283d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ConsoleDisplayPreference display = (mode == RealLostContext) ? DisplayInConsole: DontDisplayInConsole;
4284d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    synthesizeGLError(GC3D_CONTEXT_LOST_WEBGL, "loseContext", "context lost", display);
4285d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4286d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Don't allow restoration unless the context lost event has both been
4287d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // dispatched and its default behavior prevented.
4288d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_restoreAllowed = false;
42897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    deactivateContext(this);
42907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_autoRecoveryMethod == WhenAvailable)
42917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        addToEvictedList(this);
4292d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4293d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Always defer the dispatch of the context lost event, to implement
4294d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // the spec behavior of queueing a task.
4295d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_dispatchContextLostEventTimer.startOneShot(0, FROM_HERE);
4296d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4297d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4298d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::forceRestoreContext()
4299d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4300d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isContextLost()) {
4301d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, "restoreContext", "context not lost");
4302d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4303d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4304d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4305d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_restoreAllowed) {
43067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_contextLostMode == WebGLLoseContextLostContext)
4307d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, "restoreContext", "context restoration not allowed");
4308d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
4309d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4310d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4311d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_restoreTimer.isActive())
4312d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_restoreTimer.startOneShot(0, FROM_HERE);
4313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4314d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4315d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)blink::WebLayer* WebGLRenderingContextBase::platformLayer() const
4316d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4317c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return isContextLost() ? 0 : drawingBuffer()->platformLayer();
4318d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4320d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)Extensions3DUtil* WebGLRenderingContextBase::extensionsUtil()
4321d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4322a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    ASSERT(!isContextLost());
4323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_extensionsUtil)
4324f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        m_extensionsUtil = Extensions3DUtil::create(webContext());
4325d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return m_extensionsUtil.get();
4326d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4327d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4328d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::removeSharedObject(WebGLSharedObject* object)
4329d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4330d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_contextGroup->removeObject(object);
4331d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4332d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4333d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::addSharedObject(WebGLSharedObject* object)
4334d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4335d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!isContextLost());
4336d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_contextGroup->addObject(object);
4337d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4338d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4339d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::removeContextObject(WebGLContextObject* object)
4340d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4341d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_contextObjects.remove(object);
4342d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4343d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4344d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::addContextObject(WebGLContextObject* object)
4345d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4346d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!isContextLost());
4347d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_contextObjects.add(object);
4348d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4349d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4350d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::detachAndRemoveAllObjects()
4351d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4352d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    while (m_contextObjects.size() > 0) {
4353c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        WillBeHeapHashSet<RawPtrWillBeWeakMember<WebGLContextObject> >::iterator it = m_contextObjects.begin();
4354d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        (*it)->detachContext();
4355d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4356d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4357d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4358d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::hasPendingActivity() const
4359d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4360d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return false;
4361d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4362d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4363d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::stop()
4364d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4365d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isContextLost()) {
43667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // Never attempt to restore the context because the page is being torn down.
43677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        forceLostContext(SyntheticLostContext, Manual);
4368d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4369d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4370d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4371d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getBooleanParameter(GLenum pname)
4372d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4373d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLboolean value = 0;
4374d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isContextLost())
4375a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getBooleanv(pname, &value);
4376d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebGLGetInfo(static_cast<bool>(value));
4377d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4378d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4379d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getBooleanArrayParameter(GLenum pname)
4380d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4381d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (pname != GL_COLOR_WRITEMASK) {
4382d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        notImplemented();
4383d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WebGLGetInfo(0, 0);
4384d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4385d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLboolean value[4] = {0};
4386d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isContextLost())
4387a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getBooleanv(pname, value);
4388d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool boolValue[4];
4389d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (int ii = 0; ii < 4; ++ii)
4390d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        boolValue[ii] = static_cast<bool>(value[ii]);
4391d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebGLGetInfo(boolValue, 4);
4392d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4393d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4394d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getFloatParameter(GLenum pname)
4395d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4396d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLfloat value = 0;
4397d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isContextLost())
4398a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getFloatv(pname, &value);
4399d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebGLGetInfo(value);
4400d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4401d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4402d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getIntParameter(GLenum pname)
4403d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4404d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint value = 0;
4405d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isContextLost())
4406a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getIntegerv(pname, &value);
4407d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebGLGetInfo(value);
4408d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4409d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4410d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getUnsignedIntParameter(GLenum pname)
4411d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4412d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint value = 0;
4413d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isContextLost())
4414a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getIntegerv(pname, &value);
4415d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebGLGetInfo(static_cast<unsigned>(value));
4416d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4417d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4418d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getWebGLFloatArrayParameter(GLenum pname)
4419d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4420d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLfloat value[4] = {0};
4421d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isContextLost())
4422a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getFloatv(pname, value);
4423d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned length = 0;
4424d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (pname) {
4425d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ALIASED_POINT_SIZE_RANGE:
4426d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ALIASED_LINE_WIDTH_RANGE:
4427d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_RANGE:
4428d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        length = 2;
4429d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4430d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BLEND_COLOR:
4431d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COLOR_CLEAR_VALUE:
4432d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        length = 4;
4433d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4434d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
4435d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        notImplemented();
4436d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4437d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebGLGetInfo(Float32Array::create(value, length));
4438d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4439d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4440d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLGetInfo WebGLRenderingContextBase::getWebGLIntArrayParameter(GLenum pname)
4441d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4442d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint value[4] = {0};
4443d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isContextLost())
4444a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getIntegerv(pname, value);
4445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned length = 0;
4446d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (pname) {
4447d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_MAX_VIEWPORT_DIMS:
4448d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        length = 2;
4449d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4450d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SCISSOR_BOX:
4451d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_VIEWPORT:
4452d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        length = 4;
4453d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4454d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
4455d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        notImplemented();
4456d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4457d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebGLGetInfo(Int32Array::create(value, length));
4458d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4459d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4460d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::handleTextureCompleteness(const char* functionName, bool prepareToDraw)
4461d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4462d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // All calling functions check isContextLost, so a duplicate check is not needed here.
4463d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool resetActiveUnit = false;
4464d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture::TextureExtensionFlag flag = static_cast<WebGLTexture::TextureExtensionFlag>((extensionEnabled(OESTextureFloatLinearName) ? WebGLTexture::TextureFloatLinearExtensionEnabled : 0)
4465d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        | (extensionEnabled(OESTextureHalfFloatLinearName) ? WebGLTexture::TextureHalfFloatLinearExtensionEnabled : 0));
4466d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (unsigned ii = 0; ii < m_onePlusMaxNonDefaultTextureUnit; ++ii) {
4467d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if ((m_textureUnits[ii].m_texture2DBinding.get() && m_textureUnits[ii].m_texture2DBinding->needToUseBlackTexture(flag))
4468d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            || (m_textureUnits[ii].m_textureCubeMapBinding.get() && m_textureUnits[ii].m_textureCubeMapBinding->needToUseBlackTexture(flag))) {
4469d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (ii != m_activeTextureUnit) {
4470197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                webContext()->activeTexture(GL_TEXTURE0 + ii);
4471d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                resetActiveUnit = true;
4472d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            } else if (resetActiveUnit) {
4473197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                webContext()->activeTexture(GL_TEXTURE0 + ii);
4474d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                resetActiveUnit = false;
4475d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
4476d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            WebGLTexture* tex2D;
4477d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            WebGLTexture* texCubeMap;
4478d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (prepareToDraw) {
4479d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                String msg(String("texture bound to texture unit ") + String::number(ii)
4480d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    + " is not renderable. It maybe non-power-of-2 and have incompatible texture filtering or is not 'texture complete'."
4481d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    + " Or the texture is Float or Half Float type with linear filtering while OES_float_linear or OES_half_float_linear extension is not enabled.");
4482d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                emitGLWarning(functionName, msg.utf8().data());
4483d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                tex2D = m_blackTexture2D.get();
4484d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                texCubeMap = m_blackTextureCubeMap.get();
4485d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            } else {
4486d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                tex2D = m_textureUnits[ii].m_texture2DBinding.get();
4487d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                texCubeMap = m_textureUnits[ii].m_textureCubeMapBinding.get();
4488d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
4489d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (m_textureUnits[ii].m_texture2DBinding && m_textureUnits[ii].m_texture2DBinding->needToUseBlackTexture(flag))
4490a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                webContext()->bindTexture(GL_TEXTURE_2D, objectOrZero(tex2D));
4491d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (m_textureUnits[ii].m_textureCubeMapBinding && m_textureUnits[ii].m_textureCubeMapBinding->needToUseBlackTexture(flag))
4492a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                webContext()->bindTexture(GL_TEXTURE_CUBE_MAP, objectOrZero(texCubeMap));
4493d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4494d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4495d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (resetActiveUnit)
4496197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        webContext()->activeTexture(GL_TEXTURE0 + m_activeTextureUnit);
4497d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4498d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4499d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::createFallbackBlackTextures1x1()
4500d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4501d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // All calling functions check isContextLost, so a duplicate check is not needed here.
4502d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned char black[] = {0, 0, 0, 255};
4503d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_blackTexture2D = createTexture();
4504a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->bindTexture(GL_TEXTURE_2D, m_blackTexture2D->object());
4505a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1,
4506d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        0, GL_RGBA, GL_UNSIGNED_BYTE, black);
4507a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->bindTexture(GL_TEXTURE_2D, 0);
4508d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_blackTextureCubeMap = createTexture();
4509a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->bindTexture(GL_TEXTURE_CUBE_MAP, m_blackTextureCubeMap->object());
4510a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 1, 1,
4511d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        0, GL_RGBA, GL_UNSIGNED_BYTE, black);
4512a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 1, 1,
4513d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        0, GL_RGBA, GL_UNSIGNED_BYTE, black);
4514a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 1, 1,
4515d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        0, GL_RGBA, GL_UNSIGNED_BYTE, black);
4516a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 1, 1,
4517d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        0, GL_RGBA, GL_UNSIGNED_BYTE, black);
4518a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 1, 1,
4519d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        0, GL_RGBA, GL_UNSIGNED_BYTE, black);
4520a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 1, 1,
4521d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        0, GL_RGBA, GL_UNSIGNED_BYTE, black);
4522a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    webContext()->bindTexture(GL_TEXTURE_CUBE_MAP, 0);
4523d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4524d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4525d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::isTexInternalFormatColorBufferCombinationValid(GLenum texInternalFormat, GLenum colorBufferFormat)
4526d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4527d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned need = WebGLImageConversion::getChannelBitsByFormat(texInternalFormat);
4528d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned have = WebGLImageConversion::getChannelBitsByFormat(colorBufferFormat);
4529d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return (need & have) == need;
4530d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4531d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4532d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLenum WebGLRenderingContextBase::boundFramebufferColorFormat()
4533d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4534d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_framebufferBinding && m_framebufferBinding->object())
4535d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return m_framebufferBinding->colorBufferFormat();
4536d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_requestedAttributes->alpha())
4537d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return GL_RGBA;
4538d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return GL_RGB;
4539d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4540d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4541d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLTexture* WebGLRenderingContextBase::validateTextureBinding(const char* functionName, GLenum target, bool useSixEnumsForCubeMap)
4542d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4543d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLTexture* tex = 0;
4544d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (target) {
4545d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_2D:
4546d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        tex = m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get();
4547d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4548d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
4549d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4550d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4551d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4552d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4553d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4554d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!useSixEnumsForCubeMap) {
4555d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture target");
4556d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return 0;
4557d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4558d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        tex = m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding.get();
4559d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4560d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP:
4561d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (useSixEnumsForCubeMap) {
4562d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture target");
4563d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return 0;
4564d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4565d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        tex = m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding.get();
4566d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4567d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
4568d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture target");
4569d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
4570d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4571d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!tex)
4572d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, functionName, "no texture");
4573d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return tex;
4574d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4575d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4576d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateLocationLength(const char* functionName, const String& string)
4577d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4578d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const unsigned maxWebGLLocationLength = 256;
4579d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (string.length() > maxWebGLLocationLength) {
4580d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "location length > 256");
4581d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4582d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4583d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
4584d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4585d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4586d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateSize(const char* functionName, GLint x, GLint y)
4587d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4588d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (x < 0 || y < 0) {
4589d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "size < 0");
4590d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4591d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4592d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
4593d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4594d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4595d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateString(const char* functionName, const String& string)
4596d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4597d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (size_t i = 0; i < string.length(); ++i) {
4598d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!validateCharacter(string[i])) {
4599d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, functionName, "string not ASCII");
4600d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4601d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4602d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4603d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
4604d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4605d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4606d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateTexFuncFormatAndType(const char* functionName, GLenum format, GLenum type, GLint level)
4607d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4608d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (format) {
4609d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ALPHA:
4610d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_LUMINANCE:
4611d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_LUMINANCE_ALPHA:
4612d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RGB:
4613d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RGBA:
4614d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4615d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_STENCIL_OES:
4616d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_COMPONENT:
4617d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(WebGLDepthTextureName))
4618d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
4619d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "depth texture formats not enabled");
4620d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4621d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
4622d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture format");
4623d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4624d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4625d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4626d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (type) {
4627d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_BYTE:
4628d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_SHORT_5_6_5:
4629d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_SHORT_4_4_4_4:
4630d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_SHORT_5_5_5_1:
4631d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4632d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FLOAT:
4633d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(OESTextureFloatName))
4634d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
4635d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture type");
4636d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4637d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_HALF_FLOAT_OES:
4638d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(OESTextureHalfFloatName))
4639d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
4640d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture type");
4641d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4642d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_INT:
4643d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_INT_24_8_OES:
4644d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_SHORT:
4645d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(WebGLDepthTextureName))
4646d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
4647d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture type");
4648d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4649d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
4650d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture type");
4651d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4652d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4653d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4654d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Verify that the combination of format and type is supported.
4655d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (format) {
4656d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ALPHA:
4657d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_LUMINANCE:
4658d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_LUMINANCE_ALPHA:
4659d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (type != GL_UNSIGNED_BYTE
4660d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && type != GL_FLOAT
4661d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && type != GL_HALF_FLOAT_OES) {
4662d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "invalid type for format");
4663d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4664d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4665d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4666d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RGB:
4667d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (type != GL_UNSIGNED_BYTE
4668d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && type != GL_UNSIGNED_SHORT_5_6_5
4669d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && type != GL_FLOAT
4670d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && type != GL_HALF_FLOAT_OES) {
4671d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "invalid type for RGB format");
4672d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4673d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4674d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4675d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_RGBA:
4676d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (type != GL_UNSIGNED_BYTE
4677d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && type != GL_UNSIGNED_SHORT_4_4_4_4
4678d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && type != GL_UNSIGNED_SHORT_5_5_5_1
4679d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && type != GL_FLOAT
4680d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && type != GL_HALF_FLOAT_OES) {
4681d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "invalid type for RGBA format");
4682d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4683d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4684d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4685d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_COMPONENT:
4686d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!extensionEnabled(WebGLDepthTextureName)) {
4687d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid format. DEPTH_COMPONENT not enabled");
4688d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4689d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4690d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (type != GL_UNSIGNED_SHORT
4691d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && type != GL_UNSIGNED_INT) {
4692d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "invalid type for DEPTH_COMPONENT format");
4693d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4694d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4695d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (level > 0) {
4696d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "level must be 0 for DEPTH_COMPONENT format");
4697d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4698d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4699d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4700d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_STENCIL_OES:
4701d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!extensionEnabled(WebGLDepthTextureName)) {
4702d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid format. DEPTH_STENCIL not enabled");
4703d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4704d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4705d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (type != GL_UNSIGNED_INT_24_8_OES) {
4706d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "invalid type for DEPTH_STENCIL format");
4707d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4708d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4709d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (level > 0) {
4710d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "level must be 0 for DEPTH_STENCIL format");
4711d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4712d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4713d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4714d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
4715d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ASSERT_NOT_REACHED();
4716d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4717d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4718d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
4719d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4720d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4721d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateTexFuncLevel(const char* functionName, GLenum target, GLint level)
4722d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4723d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (level < 0) {
4724d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "level < 0");
4725d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4726d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4727d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (target) {
4728d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_2D:
4729d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (level >= m_maxTextureLevel) {
4730d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, functionName, "level out of range");
4731d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4732d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4733d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4734d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
4735d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4736d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4737d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4738d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4739d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4740d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (level >= m_maxCubeMapTextureLevel) {
4741d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, functionName, "level out of range");
4742d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4743d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4744d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4745d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4746d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // This function only checks if level is legal, so we return true and don't
4747d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // generate INVALID_ENUM if target is illegal.
4748d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
4749d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4750d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4751d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateTexFuncDimensions(const char* functionName, TexFuncValidationFunctionType functionType,
4752d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum target, GLint level, GLsizei width, GLsizei height)
4753d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4754d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (width < 0 || height < 0) {
4755d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "width or height < 0");
4756d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4757d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4758d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4759d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (target) {
4760d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_2D:
4761d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (width > (m_maxTextureSize >> level) || height > (m_maxTextureSize >> level)) {
4762d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, functionName, "width or height out of range");
4763d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4764d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4765d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4766d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
4767d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4768d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4769d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4770d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4771d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4772d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (functionType != TexSubImage2D && width != height) {
4773d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, functionName, "width != height for cube map");
4774d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4775d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4776d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // No need to check height here. For texImage width == height.
4777d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // For texSubImage that will be checked when checking yoffset + height is in range.
4778d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (width > (m_maxCubeMapTextureSize >> level)) {
4779d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_VALUE, functionName, "width or height out of range for cube map");
4780d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4781d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4782d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4783d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
4784d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target");
4785d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4786d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4787d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
4788d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4789d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4790d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateTexFuncParameters(const char* functionName, TexFuncValidationFunctionType functionType, GLenum target,
4791d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type)
4792d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4793d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // We absolutely have to validate the format and type combination.
4794d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // The texImage2D entry points taking HTMLImage, etc. will produce
4795d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // temporary data based on this combination, so it must be legal.
4796d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateTexFuncFormatAndType(functionName, format, type, level) || !validateTexFuncLevel(functionName, target, level))
4797d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4798d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4799d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateTexFuncDimensions(functionName, functionType, target, level, width, height))
4800d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4801d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4802d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (format != internalformat) {
4803d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, functionName, "format != internalformat");
4804d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4805d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4806d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4807d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (border) {
4808d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "border != 0");
4809d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4810d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4811d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4812d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
4813d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4814d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4815d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateTexFuncData(const char* functionName, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, ArrayBufferView* pixels, NullDisposition disposition)
4816d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4817d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // All calling functions check isContextLost, so a duplicate check is not needed here.
4818d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!pixels) {
4819d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (disposition == NullAllowed)
4820d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return true;
4821d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "no pixels");
4822d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4823d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4824d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4825d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateTexFuncFormatAndType(functionName, format, type, level))
4826d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4827d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateSettableTexFormat(functionName, format))
4828d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4829d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4830d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (type) {
4831d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_BYTE:
4832d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (pixels->type() != ArrayBufferView::TypeUint8) {
4833d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "type UNSIGNED_BYTE but ArrayBufferView not Uint8Array");
4834d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4835d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4836d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4837d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_SHORT_5_6_5:
4838d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_SHORT_4_4_4_4:
4839d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_SHORT_5_5_5_1:
4840d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (pixels->type() != ArrayBufferView::TypeUint16) {
4841d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "type UNSIGNED_SHORT but ArrayBufferView not Uint16Array");
4842d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4843d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4844d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4845d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FLOAT: // OES_texture_float
4846d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (pixels->type() != ArrayBufferView::TypeFloat32) {
4847d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "type FLOAT but ArrayBufferView not Float32Array");
4848d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4849d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4850d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4851d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_HALF_FLOAT_OES: // OES_texture_half_float
4852f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        // As per the specification, ArrayBufferView should be null or a Uint16Array when
4853d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // OES_texture_half_float is enabled.
4854f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (pixels && pixels->type() != ArrayBufferView::TypeUint16) {
4855f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            synthesizeGLError(GL_INVALID_OPERATION, functionName, "type HALF_FLOAT_OES but ArrayBufferView is not NULL and not Uint16Array");
4856d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
4857d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4858d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4859d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
4860d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ASSERT_NOT_REACHED();
4861d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4862d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4863d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned totalBytesRequired;
4864d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, width, height, m_unpackAlignment, &totalBytesRequired, 0);
4865d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (error != GL_NO_ERROR) {
4866d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(error, functionName, "invalid texture dimensions");
4867d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4868d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4869d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (pixels->byteLength() < totalBytesRequired) {
4870d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (m_unpackAlignment != 1) {
4871d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            error = WebGLImageConversion::computeImageSizeInBytes(format, type, width, height, 1, &totalBytesRequired, 0);
4872d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (pixels->byteLength() == totalBytesRequired) {
4873d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                synthesizeGLError(GL_INVALID_OPERATION, functionName, "ArrayBufferView not big enough for request with UNPACK_ALIGNMENT > 1");
4874d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return false;
4875d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
4876d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4877d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, functionName, "ArrayBufferView not big enough for request");
4878d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4879d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4880d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
4881d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4882d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4883d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateCompressedTexFormat(GLenum format)
4884d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4885d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return m_compressedTextureFormats.contains(format);
4886d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4887d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4888d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateCompressedTexFuncData(const char* functionName, GLsizei width, GLsizei height, GLenum format, ArrayBufferView* pixels)
4889d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4890d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!pixels) {
4891d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "no pixels");
4892d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4893d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4894d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (width < 0 || height < 0) {
4895d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "width or height < 0");
4896d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4897d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4898d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4899d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned bytesRequired = 0;
4900d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4901d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (format) {
4902d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
4903d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
4904d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
4905d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            const int kBlockWidth = 4;
4906d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            const int kBlockHeight = 4;
4907d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            const int kBlockSize = 8;
4908d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            int numBlocksAcross = (width + kBlockWidth - 1) / kBlockWidth;
4909d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            int numBlocksDown = (height + kBlockHeight - 1) / kBlockHeight;
4910d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            int numBlocks = numBlocksAcross * numBlocksDown;
4911d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            bytesRequired = numBlocks * kBlockSize;
4912d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4913d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4914d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
4915d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
4916d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
4917d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            const int kBlockWidth = 4;
4918d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            const int kBlockHeight = 4;
4919d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            const int kBlockSize = 16;
4920d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            int numBlocksAcross = (width + kBlockWidth - 1) / kBlockWidth;
4921d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            int numBlocksDown = (height + kBlockHeight - 1) / kBlockHeight;
4922d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            int numBlocks = numBlocksAcross * numBlocksDown;
4923d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            bytesRequired = numBlocks * kBlockSize;
4924d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4925d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4926d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GC3D_COMPRESSED_ATC_RGB_AMD:
492710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_ETC1_RGB8_OES:
4928d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
4929d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            bytesRequired = floor(static_cast<double>((width + 3) / 4)) * floor(static_cast<double>((height + 3) / 4)) * 8;
4930d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4931d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4932d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GC3D_COMPRESSED_ATC_RGBA_EXPLICIT_ALPHA_AMD:
4933d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GC3D_COMPRESSED_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
4934d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
4935d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            bytesRequired = floor(static_cast<double>((width + 3) / 4)) * floor(static_cast<double>((height + 3) / 4)) * 16;
4936d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4937d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4938d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
4939d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
4940d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
494110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            bytesRequired = (max(width, 8) * max(height, 8) * 4 + 7) / 8;
4942d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4943d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4944d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
4945d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:
4946d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        {
494710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            bytesRequired = (max(width, 16) * max(height, 8) * 2 + 7) / 8;
4948d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
4949d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
4950d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
4951d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid format");
4952d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4953d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4954d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4955d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (pixels->byteLength() != bytesRequired) {
4956d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "length of ArrayBufferView is not correct for dimensions");
4957d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4958d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4959d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4960d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
4961d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
4962d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4963d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateCompressedTexDimensions(const char* functionName, TexFuncValidationFunctionType functionType, GLenum target, GLint level, GLsizei width, GLsizei height, GLenum format)
4964d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4965d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateTexFuncDimensions(functionName, functionType, target, level, width, height))
4966d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
4967d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
496810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    bool widthValid = false;
496910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    bool heightValid = false;
497010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
4971d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (format) {
497210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GC3D_COMPRESSED_ATC_RGB_AMD:
497310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GC3D_COMPRESSED_ATC_RGBA_EXPLICIT_ALPHA_AMD:
497410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GC3D_COMPRESSED_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
4975d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
4976d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
4977d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
4978d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: {
4979d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        const int kBlockWidth = 4;
4980d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        const int kBlockHeight = 4;
498110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        widthValid = (level && width == 1) || (level && width == 2) || !(width % kBlockWidth);
498210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        heightValid = (level && height == 1) || (level && height == 2) || !(height % kBlockHeight);
498310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        break;
498410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
498510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
498610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
498710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
498810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: {
498910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        // Must be a power of two
499010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        widthValid = (width & (width - 1)) == 0;
499110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        heightValid = (height & (height - 1)) == 0;
499210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        break;
499310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
499410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_ETC1_RGB8_OES: {
499510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        widthValid = true;
499610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        heightValid = true;
499710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        break;
4998d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
4999d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
5000d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5001d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
500210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
500310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (!widthValid || !heightValid) {
500410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        synthesizeGLError(GL_INVALID_OPERATION, functionName, "width or height invalid for level");
500510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return false;
500610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
500710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
500810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return true;
5009d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5010d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5011d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateCompressedTexSubDimensions(const char* functionName, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, WebGLTexture* tex)
5012d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5013d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (xoffset < 0 || yoffset < 0) {
5014d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "xoffset or yoffset < 0");
5015d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5016d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5017d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5018d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (format) {
5019d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5020d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5021d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
5022d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: {
5023d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        const int kBlockWidth = 4;
5024d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        const int kBlockHeight = 4;
5025d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if ((xoffset % kBlockWidth) || (yoffset % kBlockHeight)) {
5026d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "xoffset or yoffset not multiple of 4");
5027d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
5028d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
5029d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (width - xoffset > tex->getWidth(target, level)
5030d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            || height - yoffset > tex->getHeight(target, level)) {
5031d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, functionName, "dimensions out of range");
5032d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
5033d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
5034d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return validateCompressedTexDimensions(functionName, TexSubImage2D, target, level, width, height, format);
5035d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
503610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
503710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
503810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
503910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: {
504010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        if ((xoffset != 0) || (yoffset != 0)) {
504110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            synthesizeGLError(GL_INVALID_OPERATION, functionName, "xoffset and yoffset must be zero");
504210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            return false;
504310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        }
504410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        if (width != tex->getWidth(target, level)
504510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            || height != tex->getHeight(target, level)) {
504610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            synthesizeGLError(GL_INVALID_OPERATION, functionName, "dimensions must match existing level");
504710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            return false;
504810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        }
504910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return validateCompressedTexDimensions(functionName, TexSubImage2D, target, level, width, height, format);
505010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
505110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GC3D_COMPRESSED_ATC_RGB_AMD:
505210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GC3D_COMPRESSED_ATC_RGBA_EXPLICIT_ALPHA_AMD:
505310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GC3D_COMPRESSED_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
505410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    case GL_ETC1_RGB8_OES: {
505510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        synthesizeGLError(GL_INVALID_OPERATION, functionName, "unable to update sub-images with this format");
505610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return false;
505710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
5058d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
5059d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5060d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5061d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5062d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5063d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateDrawMode(const char* functionName, GLenum mode)
5064d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5065d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (mode) {
5066d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_POINTS:
5067d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_LINE_STRIP:
5068d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_LINE_LOOP:
5069d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_LINES:
5070d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TRIANGLE_STRIP:
5071d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TRIANGLE_FAN:
5072d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_TRIANGLES:
5073d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return true;
5074d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
5075d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid draw mode");
5076d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5077d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5078d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5079d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5080d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateStencilSettings(const char* functionName)
5081d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5082d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_stencilMask != m_stencilMaskBack || m_stencilFuncRef != m_stencilFuncRefBack || m_stencilFuncMask != m_stencilFuncMaskBack) {
5083d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, functionName, "front and back stencils settings do not match");
5084d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5085d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5086d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
5087d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5088d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5089d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateStencilOrDepthFunc(const char* functionName, GLenum func)
5090d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5091d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (func) {
5092d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_NEVER:
5093d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_LESS:
5094d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_LEQUAL:
5095d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_GREATER:
5096d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_GEQUAL:
5097d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_EQUAL:
5098d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_NOTEQUAL:
5099d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ALWAYS:
5100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return true;
5101d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
5102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid function");
5103d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5104d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::printGLErrorToConsole(const String& message)
5108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_numGLErrorsToConsoleAllowed)
5110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5112d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    --m_numGLErrorsToConsoleAllowed;
5113d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    printWarningToConsole(message);
5114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5115d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_numGLErrorsToConsoleAllowed)
5116d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        printWarningToConsole("WebGL: too many errors, no more errors will be reported to the console for this context.");
5117d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5118d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return;
5119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5121d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::printWarningToConsole(const String& message)
5122d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!canvas())
5124d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5125e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    canvas()->document().addConsoleMessage(ConsoleMessage::create(RenderingMessageSource, WarningMessageLevel, message));
5126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateFramebufferFuncParameters(const char* functionName, GLenum target, GLenum attachment)
5129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (target != GL_FRAMEBUFFER) {
5131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target");
5132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (attachment) {
5135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_COLOR_ATTACHMENT0:
5136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_ATTACHMENT:
5137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_ATTACHMENT:
5138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL:
5139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
5140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
5141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(WebGLDrawBuffersName)
5142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && attachment > GL_COLOR_ATTACHMENT0
5143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            && attachment < static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + maxColorAttachments()))
5144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
5145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid attachment");
5146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
5149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateBlendEquation(const char* functionName, GLenum mode)
5152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (mode) {
5154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FUNC_ADD:
5155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FUNC_SUBTRACT:
5156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_FUNC_REVERSE_SUBTRACT:
5157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return true;
5158d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case GL_MIN_EXT:
5159d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case GL_MAX_EXT:
5160d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (extensionEnabled(EXTBlendMinMaxName))
5161d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            return true;
5162d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid mode");
5163d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return false;
5164d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
5165d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid mode");
5166d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5168d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateBlendFuncFactors(const char* functionName, GLenum src, GLenum dst)
5171d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5172d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (((src == GL_CONSTANT_COLOR || src == GL_ONE_MINUS_CONSTANT_COLOR)
5173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        && (dst == GL_CONSTANT_ALPHA || dst == GL_ONE_MINUS_CONSTANT_ALPHA))
5174d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        || ((dst == GL_CONSTANT_COLOR || dst == GL_ONE_MINUS_CONSTANT_COLOR)
5175d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        && (src == GL_CONSTANT_ALPHA || src == GL_ONE_MINUS_CONSTANT_ALPHA))) {
5176d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, functionName, "incompatible src and dst");
5177d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5178d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5179d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
5180d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5181d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5182d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateCapability(const char* functionName, GLenum cap)
5183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5184d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (cap) {
5185d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_BLEND:
5186d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_CULL_FACE:
5187d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DEPTH_TEST:
5188d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_DITHER:
5189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_POLYGON_OFFSET_FILL:
5190d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SAMPLE_ALPHA_TO_COVERAGE:
5191d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SAMPLE_COVERAGE:
5192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_SCISSOR_TEST:
5193d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_STENCIL_TEST:
5194d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return true;
5195d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
5196d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid capability");
5197d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5198d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5199d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5200d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5201d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateUniformParameters(const char* functionName, const WebGLUniformLocation* location, Float32Array* v, GLsizei requiredMinSize)
5202d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5203d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!v) {
5204d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "no array");
5205d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5207d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return validateUniformMatrixParameters(functionName, location, false, v->data(), v->length(), requiredMinSize);
5208d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5209d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5210d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateUniformParameters(const char* functionName, const WebGLUniformLocation* location, Int32Array* v, GLsizei requiredMinSize)
5211d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5212d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!v) {
5213d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "no array");
5214d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5216d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return validateUniformMatrixParameters(functionName, location, false, v->data(), v->length(), requiredMinSize);
5217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5219d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateUniformParameters(const char* functionName, const WebGLUniformLocation* location, void* v, GLsizei size, GLsizei requiredMinSize)
5220d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return validateUniformMatrixParameters(functionName, location, false, v, size, requiredMinSize);
5222d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5223d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5224d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateUniformMatrixParameters(const char* functionName, const WebGLUniformLocation* location, GLboolean transpose, Float32Array* v, GLsizei requiredMinSize)
5225d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!v) {
5227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "no array");
5228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5230d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return validateUniformMatrixParameters(functionName, location, transpose, v->data(), v->length(), requiredMinSize);
5231d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5233d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateUniformMatrixParameters(const char* functionName, const WebGLUniformLocation* location, GLboolean transpose, void* v, GLsizei size, GLsizei requiredMinSize)
5234d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5235d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!location)
5236d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5237d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (location->program() != m_currentProgram) {
5238d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, functionName, "location is not from current program");
5239d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5240d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5241d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!v) {
5242d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "no array");
5243d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5244d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5245d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (transpose) {
5246d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "transpose not FALSE");
5247d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5248d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5249d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (size < requiredMinSize || (size % requiredMinSize)) {
5250d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "invalid size");
5251d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5252d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5253d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
5254d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5255d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5256f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuWebGLBuffer* WebGLRenderingContextBase::validateBufferDataTarget(const char* functionName, GLenum target)
5257d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5258d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebGLBuffer* buffer = 0;
5259d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (target) {
5260d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ELEMENT_ARRAY_BUFFER:
5261d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        buffer = m_boundVertexArrayObject->boundElementArrayBuffer().get();
5262d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
5263d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_ARRAY_BUFFER:
5264d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        buffer = m_boundArrayBuffer.get();
5265d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
5266d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
5267d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target");
5268d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
5269d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5270d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!buffer) {
5271d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, functionName, "no buffer");
5272d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
5273d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5274f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return buffer;
5275d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5276d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5277d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateHTMLImageElement(const char* functionName, HTMLImageElement* image, ExceptionState& exceptionState)
5278d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!image || !image->cachedImage()) {
5280d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "no image");
5281d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5282d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5283d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const KURL& url = image->cachedImage()->response().url();
5284d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (url.isNull() || url.isEmpty() || !url.isValid()) {
5285d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "invalid image");
5286d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5287d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5288f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
5289f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (wouldTaintOrigin(image)) {
5290d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        exceptionState.throwSecurityError("The cross-origin image at " + url.elidedString() + " may not be loaded.");
5291d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5292d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5293d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
5294d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5295d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5296d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateHTMLCanvasElement(const char* functionName, HTMLCanvasElement* canvas, ExceptionState& exceptionState)
5297d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5298d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!canvas || !canvas->buffer()) {
5299d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "no canvas");
5300d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5301d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5302f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (wouldTaintOrigin(canvas)) {
5303d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        exceptionState.throwSecurityError("Tainted canvases may not be loaded.");
5304d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5305d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5306d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
5307d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5308d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5309d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateHTMLVideoElement(const char* functionName, HTMLVideoElement* video, ExceptionState& exceptionState)
5310d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5311d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!video || !video->videoWidth() || !video->videoHeight()) {
5312d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "no video");
5313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5314d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5315f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
5316f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (wouldTaintOrigin(video)) {
5317d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        exceptionState.throwSecurityError("The video element contains cross-origin data, and may not be loaded.");
5318d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5320d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
5321d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5322d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateDrawArrays(const char* functionName, GLenum mode, GLint first, GLsizei count)
5324d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5325d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateDrawMode(functionName, mode))
5326d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5327d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5328d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateStencilSettings(functionName))
5329d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5330d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5331d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (first < 0 || count < 0) {
5332d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "first or count < 0");
5333d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5334d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5335d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5336d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!count) {
5337d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        markContextChanged(CanvasChanged);
5338d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5339d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5340d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5341d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateRenderingState(functionName)) {
5342d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5343d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5344d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5345d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const char* reason = "framebuffer incomplete";
5346a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), &reason)) {
5347d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason);
5348d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5349d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5350d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5351d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
5352d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5353d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5354d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateDrawElements(const char* functionName, GLenum mode, GLsizei count, GLenum type, long long offset)
5355d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5356d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !validateDrawMode(functionName, mode))
5357d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5358d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5359d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateStencilSettings(functionName))
5360d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5361d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5362d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (type) {
5363d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_BYTE:
5364d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_SHORT:
5365d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
5366d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case GL_UNSIGNED_INT:
5367d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (extensionEnabled(OESElementIndexUintName))
5368d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
5369d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid type");
5370d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5371d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    default:
5372d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid type");
5373d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5374d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5375d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5376f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (count < 0) {
5377f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        synthesizeGLError(GL_INVALID_VALUE, functionName, "count < 0");
5378d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5379d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5380f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (!validateValueFitNonNegInt32(functionName, "offset", offset))
5381f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return false;
5382d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5383d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!count) {
5384d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        markContextChanged(CanvasChanged);
5385d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5386d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5387d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5388d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_boundVertexArrayObject->boundElementArrayBuffer()) {
5389d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_OPERATION, functionName, "no ELEMENT_ARRAY_BUFFER bound");
5390d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5391d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5392d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5393d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!validateRenderingState(functionName)) {
5394d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5395d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5396d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5397d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const char* reason = "framebuffer incomplete";
5398a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), &reason)) {
5399d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason);
5400d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5401d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5402d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5403d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
5404d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5405d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5406d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Helper function to validate draw*Instanced calls
5407d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebGLRenderingContextBase::validateDrawInstanced(const char* functionName, GLsizei primcount)
5408d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5409d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (primcount < 0) {
5410d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "primcount < 0");
5411d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
5412d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5413d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5414e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return true;
5415d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5416d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5417d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttribfImpl(const char* functionName, GLuint index, GLsizei expectedSize, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
5418d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5419d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
5420d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5421d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (index >= m_maxVertexAttribs) {
5422d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "index out of range");
5423d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5424d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5425d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // In GL, we skip setting vertexAttrib0 values.
5426d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (expectedSize) {
5427d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case 1:
5428a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->vertexAttrib1f(index, v0);
5429d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
5430d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case 2:
5431a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->vertexAttrib2f(index, v0, v1);
5432d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
5433d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case 3:
5434a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->vertexAttrib3f(index, v0, v1, v2);
5435d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
5436d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case 4:
5437a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->vertexAttrib4f(index, v0, v1, v2, v3);
5438d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
5439d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5440d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    VertexAttribValue& attribValue = m_vertexAttribValue[index];
5441d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    attribValue.value[0] = v0;
5442d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    attribValue.value[1] = v1;
5443d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    attribValue.value[2] = v2;
5444d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    attribValue.value[3] = v3;
5445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5446d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5447d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttribfvImpl(const char* functionName, GLuint index, Float32Array* v, GLsizei expectedSize)
5448d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5449d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
5450d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5451d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!v) {
5452d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "no array");
5453d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5454d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5455d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    vertexAttribfvImpl(functionName, index, v->data(), v->length(), expectedSize);
5456d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5457d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5458d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::vertexAttribfvImpl(const char* functionName, GLuint index, GLfloat* v, GLsizei size, GLsizei expectedSize)
5459d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5460d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
5461d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5462d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!v) {
5463d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "no array");
5464d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5465d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5466d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (size < expectedSize) {
5467d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "invalid size");
5468d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5469d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5470d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (index >= m_maxVertexAttribs) {
5471d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        synthesizeGLError(GL_INVALID_VALUE, functionName, "index out of range");
5472d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5473d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5474d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // In GL, we skip setting vertexAttrib0 values.
5475d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    switch (expectedSize) {
5476d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case 1:
5477a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->vertexAttrib1fv(index, v);
5478d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
5479d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case 2:
5480a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->vertexAttrib2fv(index, v);
5481d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
5482d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case 3:
5483a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->vertexAttrib3fv(index, v);
5484d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
5485d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    case 4:
5486a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->vertexAttrib4fv(index, v);
5487d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        break;
5488d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5489d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    VertexAttribValue& attribValue = m_vertexAttribValue[index];
5490d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    attribValue.initValue();
5491d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (int ii = 0; ii < expectedSize; ++ii)
5492d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        attribValue.value[ii] = v[ii];
5493d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5494d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5495d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::dispatchContextLostEvent(Timer<WebGLRenderingContextBase>*)
5496d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5497a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<WebGLContextEvent> event = WebGLContextEvent::create(EventTypeNames::webglcontextlost, false, true, "");
5498d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    canvas()->dispatchEvent(event);
5499d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_restoreAllowed = event->defaultPrevented();
55007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_restoreAllowed) {
55017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_autoRecoveryMethod == Auto)
55027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_restoreTimer.startOneShot(0, FROM_HERE);
55037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
5504d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5505d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5506d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::maybeRestoreContext(Timer<WebGLRenderingContextBase>*)
5507d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5508d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(isContextLost());
5509d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5510d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // The rendering context is not restored unless the default behavior of the
5511d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // webglcontextlost event was prevented earlier.
5512d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    //
5513d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Because of the way m_restoreTimer is set up for real vs. synthetic lost
5514d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // context events, we don't have to worry about this test short-circuiting
5515d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // the retry loop for real context lost events.
5516d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_restoreAllowed)
5517d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5518d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5519d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = canvas()->document().frame();
5520d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!frame)
5521d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5522d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5523d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Settings* settings = frame->settings();
5524d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5525d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!frame->loader().client()->allowWebGL(settings && settings->webGLEnabled()))
5526d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5527d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5528a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // If the context was lost due to RealLostContext, we need to destroy the old DrawingBuffer before creating new DrawingBuffer to ensure resource budget enough.
5529c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (drawingBuffer()) {
5530c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#if ENABLE(OILPAN)
5531c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_sharedWebGraphicsContext3D->dispose();
5532c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#else
5533f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        m_drawingBuffer->beginDestruction();
5534f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        m_drawingBuffer.clear();
5535c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#endif
5536f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
5537a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
5538197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    blink::WebGraphicsContext3D::Attributes attributes = m_requestedAttributes->attributes(canvas()->document().topDocument().url().string(), settings, version());
553943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    OwnPtr<blink::WebGraphicsContext3D> context = adoptPtr(blink::Platform::current()->createOffscreenGraphicsContext3D(attributes, 0));
5540c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtr<DrawingBuffer> buffer;
5541a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (context) {
5542a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        // Construct a new drawing buffer with the new WebGraphicsContext3D.
5543c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        buffer = createDrawingBuffer(context.release());
5544a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        // If DrawingBuffer::create() fails to allocate a fbo, |drawingBuffer| is set to null.
5545a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
5546c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!buffer) {
5547d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (m_contextLostMode == RealLostContext) {
5548d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_restoreTimer.startOneShot(secondsBetweenRestoreAttempts, FROM_HERE);
5549d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        } else {
5550d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // This likely shouldn't happen but is the best way to report it to the WebGL app.
5551d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            synthesizeGLError(GL_INVALID_OPERATION, "", "error restoring context");
5552d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
5553d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5554d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5555d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5556c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#if ENABLE(OILPAN)
5557c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (m_sharedWebGraphicsContext3D)
5558c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_sharedWebGraphicsContext3D->update(buffer.release());
5559c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    else
5560c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_sharedWebGraphicsContext3D = WebGLSharedWebGraphicsContext3D::create(buffer.release());
5561c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#else
5562c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_drawingBuffer = buffer.release();
5563c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#endif
5564c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5565c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    drawingBuffer()->bind();
5566d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_lostContextErrors.clear();
55677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_contextLostMode = NotLostContext;
55687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_autoRecoveryMethod = Manual;
55697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_restoreAllowed = false;
55707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    removeFromEvictedList(this);
5571d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5572d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    setupFlags();
5573d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    initializeNewContext();
5574d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    markContextChanged(CanvasContextChanged);
5575d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    canvas()->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcontextrestored, false, true, ""));
5576d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5577d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5578d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)String WebGLRenderingContextBase::ensureNotNull(const String& text) const
5579d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5580d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (text.isNull())
5581d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return WTF::emptyString();
5582d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return text;
5583d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5584d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5585d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebGLRenderingContextBase::LRUImageBufferCache::LRUImageBufferCache(int capacity)
5586d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : m_buffers(adoptArrayPtr(new OwnPtr<ImageBuffer>[capacity]))
5587d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_capacity(capacity)
5588d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5589d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5590d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5591d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)ImageBuffer* WebGLRenderingContextBase::LRUImageBufferCache::imageBuffer(const IntSize& size)
5592d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5593d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    int i;
5594d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (i = 0; i < m_capacity; ++i) {
5595d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ImageBuffer* buf = m_buffers[i].get();
5596d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!buf)
5597d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
5598d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (buf->size() != size)
5599d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            continue;
5600d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        bubbleToFront(i);
5601d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return buf;
5602d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5603d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5604d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    OwnPtr<ImageBuffer> temp(ImageBuffer::create(size));
5605d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!temp)
5606d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
5607d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    i = std::min(m_capacity - 1, i);
5608d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_buffers[i] = temp.release();
5609d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5610d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ImageBuffer* buf = m_buffers[i].get();
5611d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bubbleToFront(i);
5612d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return buf;
5613d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5614d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5615d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::LRUImageBufferCache::bubbleToFront(int idx)
5616d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5617d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (int i = idx; i > 0; --i)
5618d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_buffers[i].swap(m_buffers[i-1]);
5619d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5620d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5621d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)namespace {
5622d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5623d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    String GetErrorString(GLenum error)
5624d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
5625d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        switch (error) {
5626d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case GL_INVALID_ENUM:
5627d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return "INVALID_ENUM";
5628d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case GL_INVALID_VALUE:
5629d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return "INVALID_VALUE";
5630d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case GL_INVALID_OPERATION:
5631d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return "INVALID_OPERATION";
5632d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case GL_OUT_OF_MEMORY:
5633d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return "OUT_OF_MEMORY";
5634d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case GL_INVALID_FRAMEBUFFER_OPERATION:
5635d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return "INVALID_FRAMEBUFFER_OPERATION";
5636d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case GC3D_CONTEXT_LOST_WEBGL:
5637d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return "CONTEXT_LOST_WEBGL";
5638d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        default:
5639d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return String::format("WebGL ERROR(0x%04X)", error);
5640d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
5641d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5642d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5643d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} // namespace anonymous
5644d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5645d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::synthesizeGLError(GLenum error, const char* functionName, const char* description, ConsoleDisplayPreference display)
5646d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5647d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    String errorType = GetErrorString(error);
5648d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_synthesizedErrorsToConsole && display == DisplayInConsole) {
5649d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        String message = String("WebGL: ") + errorType +  ": " + String(functionName) + ": " + String(description);
5650d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        printGLErrorToConsole(message);
5651d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5652d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isContextLost())
5653a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->synthesizeGLError(error);
5654d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else {
5655d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (m_lostContextErrors.find(error) == WTF::kNotFound)
5656d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_lostContextErrors.append(error);
5657d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5658d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    InspectorInstrumentation::didFireWebGLError(canvas(), errorType);
5659d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5660d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5661d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::emitGLWarning(const char* functionName, const char* description)
5662d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5663d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_synthesizedErrorsToConsole) {
5664d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        String message = String("WebGL: ") + String(functionName) + ": " + String(description);
5665d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        printGLErrorToConsole(message);
5666d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5667d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    InspectorInstrumentation::didFireWebGLWarning(canvas());
5668d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5669d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5670d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::applyStencilTest()
5671d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5672d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool haveStencilBuffer = false;
5673d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5674d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_framebufferBinding)
5675d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        haveStencilBuffer = m_framebufferBinding->hasStencilBuffer();
5676d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else {
5677c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        RefPtrWillBeRawPtr<WebGLContextAttributes> attributes = getContextAttributes();
5678d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        haveStencilBuffer = attributes->stencil();
5679d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5680d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    enableOrDisable(GL_STENCIL_TEST,
5681d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    m_stencilEnabled && haveStencilBuffer);
5682d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5683d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5684d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::enableOrDisable(GLenum capability, bool enable)
5685d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5686d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost())
5687d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
5688d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (enable)
5689a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->enable(capability);
5690d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
5691a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->disable(capability);
5692d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5693d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5694d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)IntSize WebGLRenderingContextBase::clampedCanvasSize()
5695d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5696d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return IntSize(clamp(canvas()->width(), 1, m_maxViewportDims[0]),
5697d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                   clamp(canvas()->height(), 1, m_maxViewportDims[1]));
5698d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5699d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5700d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLint WebGLRenderingContextBase::maxDrawBuffers()
5701d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5702d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !extensionEnabled(WebGLDrawBuffersName))
5703d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
5704d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_maxDrawBuffers)
5705a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getIntegerv(GL_MAX_DRAW_BUFFERS_EXT, &m_maxDrawBuffers);
5706d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_maxColorAttachments)
5707a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &m_maxColorAttachments);
5708d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // WEBGL_draw_buffers requires MAX_COLOR_ATTACHMENTS >= MAX_DRAW_BUFFERS.
5709d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return std::min(m_maxDrawBuffers, m_maxColorAttachments);
5710d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5711d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5712d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GLint WebGLRenderingContextBase::maxColorAttachments()
5713d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5714d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isContextLost() || !extensionEnabled(WebGLDrawBuffersName))
5715d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
5716d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_maxColorAttachments)
5717a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        webContext()->getIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &m_maxColorAttachments);
5718d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return m_maxColorAttachments;
5719d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5720d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5721d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::setBackDrawBuffer(GLenum buf)
5722d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5723d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_backDrawBuffer = buf;
5724d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5725d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5726d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::restoreCurrentFramebuffer()
5727d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5728d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bindFramebuffer(GL_FRAMEBUFFER, m_framebufferBinding.get());
5729d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5730d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5731d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::restoreCurrentTexture2D()
5732d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5733d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bindTexture(GL_TEXTURE_2D, m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get());
5734d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5735d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5736d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::multisamplingChanged(bool enabled)
5737d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5738d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_multisamplingAllowed != enabled) {
5739d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_multisamplingAllowed = enabled;
57407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        forceLostContext(WebGLRenderingContextBase::SyntheticLostContext, WebGLRenderingContextBase::Auto);
5741d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5742d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5743d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5744d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebGLRenderingContextBase::findNewMaxNonDefaultTextureUnit()
5745d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5746d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Trace backwards from the current max to find the new max non-default texture unit
5747d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    int startIndex = m_onePlusMaxNonDefaultTextureUnit - 1;
5748d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (int i = startIndex; i >= 0; --i) {
5749d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (m_textureUnits[i].m_texture2DBinding
5750d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            || m_textureUnits[i].m_textureCubeMapBinding) {
5751d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_onePlusMaxNonDefaultTextureUnit = i + 1;
5752d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
5753d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
5754d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5755d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_onePlusMaxNonDefaultTextureUnit = 0;
5756d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
5757d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5758c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void WebGLRenderingContextBase::TextureUnitState::trace(Visitor* visitor)
5759c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
5760c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_texture2DBinding);
5761c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_textureCubeMapBinding);
5762c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
5763c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5764c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void WebGLRenderingContextBase::trace(Visitor* visitor)
5765c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
5766c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#if ENABLE(OILPAN)
5767c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_contextObjects);
5768c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#endif
5769c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_contextLostCallbackAdapter);
5770c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_errorMessageCallbackAdapter);
5771c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_boundArrayBuffer);
5772c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_defaultVertexArrayObject);
5773c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_boundVertexArrayObject);
5774c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_vertexAttrib0Buffer);
5775c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_currentProgram);
5776c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_framebufferBinding);
5777c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_renderbufferBinding);
5778c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_textureUnits);
5779c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_blackTexture2D);
5780c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_blackTextureCubeMap);
5781c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_requestedAttributes);
5782c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_extensions);
5783c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    CanvasRenderingContext::trace(visitor);
5784c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
5785c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5786c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#if ENABLE(OILPAN)
5787c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassRefPtr<WebGLSharedWebGraphicsContext3D> WebGLRenderingContextBase::sharedWebGraphicsContext3D() const
5788c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
5789c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return m_sharedWebGraphicsContext3D;
5790c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
5791c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5792c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)DrawingBuffer* WebGLRenderingContextBase::drawingBuffer() const
5793c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
5794c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return m_sharedWebGraphicsContext3D ? m_sharedWebGraphicsContext3D->drawingBuffer() : 0;
5795c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
5796c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#else
5797c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)DrawingBuffer* WebGLRenderingContextBase::drawingBuffer() const
5798c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
5799c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return m_drawingBuffer.get();
5800c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
5801c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#endif
5802c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5803c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
5804