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