Context.cpp revision 6f28403ac996ab4516f1b10d1f359ad03d291436
10bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 20bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 30bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 40bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// you may not use this file except in compliance with the License. 50bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// You may obtain a copy of the License at 60bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 70bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 80bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 90bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Unless required by applicable law or agreed to in writing, software 100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// See the License for the specific language governing permissions and 130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// limitations under the License. 140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Context.cpp: Implements the es2::Context class, managing all GL state and performing 160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// rendering operations. It is the GLES2 specific implementation of EGLContext. 170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Context.h" 190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "main.h" 210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "mathutil.h" 220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "utilities.h" 230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "ResourceManager.h" 240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Buffer.h" 250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Fence.h" 260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Framebuffer.h" 270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Program.h" 280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Query.h" 290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Renderbuffer.h" 300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Sampler.h" 310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Shader.h" 320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Texture.h" 330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "TransformFeedback.h" 340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "VertexArray.h" 350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "VertexDataManager.h" 360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "IndexDataManager.h" 370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "libEGL/Display.h" 3831c07a304f3247c26ba72eff0cb0a74eb05366e8Nicolas Capens#include "common/Surface.hpp" 390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Common/Half.hpp" 400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <EGL/eglext.h> 420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43b28c662c82c7ac74962cb12a5d9f5bde2e650032Nicolas Capens#include <algorithm> 44400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens#include <string> 45b28c662c82c7ac74962cb12a5d9f5bde2e650032Nicolas Capens 460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensnamespace es2 470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 48f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas CapensContext::Context(egl::Display *display, const Context *shareContext, EGLint clientVersion, const egl::Config *config) 49f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas Capens : egl::Context(display), clientVersion(clientVersion), config(config) 500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Context *context = new sw::Context(); 520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device = new es2::Device(context); 530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setClearColor(0.0f, 0.0f, 0.0f, 0.0f); 550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthClearValue = 1.0f; 570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilClearValue = 0; 580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.cullFaceEnabled = false; 600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.cullMode = GL_BACK; 610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.frontFace = GL_CCW; 620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthTestEnabled = false; 630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthFunc = GL_LESS; 640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEnabled = false; 650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendRGB = GL_ONE; 660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendAlpha = GL_ONE; 670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendRGB = GL_ZERO; 680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendAlpha = GL_ZERO; 690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationRGB = GL_FUNC_ADD; 700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationAlpha = GL_FUNC_ADD; 710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.red = 0; 720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.green = 0; 730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.blue = 0; 740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.alpha = 0; 750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilTestEnabled = false; 760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilFunc = GL_ALWAYS; 770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilRef = 0; 7805c32b9b014dd9536782fcec3ea96168a97e2e28Alexis Hetu mState.stencilMask = 0xFFFFFFFFu; 7905c32b9b014dd9536782fcec3ea96168a97e2e28Alexis Hetu mState.stencilWritemask = 0xFFFFFFFFu; 800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackFunc = GL_ALWAYS; 810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackRef = 0; 8205c32b9b014dd9536782fcec3ea96168a97e2e28Alexis Hetu mState.stencilBackMask = 0xFFFFFFFFu; 8305c32b9b014dd9536782fcec3ea96168a97e2e28Alexis Hetu mState.stencilBackWritemask = 0xFFFFFFFFu; 840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilFail = GL_KEEP; 850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthFail = GL_KEEP; 860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthPass = GL_KEEP; 870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackFail = GL_KEEP; 880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackPassDepthFail = GL_KEEP; 890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackPassDepthPass = GL_KEEP; 900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetFillEnabled = false; 910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetFactor = 0.0f; 920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetUnits = 0.0f; 930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleAlphaToCoverageEnabled = false; 940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageEnabled = false; 950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageValue = 1.0f; 960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageInvert = false; 970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorTestEnabled = false; 980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.ditherEnabled = true; 990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.primitiveRestartFixedIndexEnabled = false; 1000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.rasterizerDiscardEnabled = false; 1010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.generateMipmapHint = GL_DONT_CARE; 1020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.fragmentShaderDerivativeHint = GL_DONT_CARE; 103010a464878f32daed863edee3fc6ad21920d605bAlexis Hetu mState.textureFilteringHint = GL_DONT_CARE; 1040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.lineWidth = 1.0f; 1060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportX = 0; 1080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportY = 0; 1090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportWidth = 0; 1100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportHeight = 0; 1110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.zNear = 0.0f; 1120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.zFar = 1.0f; 1130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorX = 0; 1150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorY = 0; 1160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorWidth = 0; 1170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorHeight = 0; 1180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskRed = true; 1200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskGreen = true; 1210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskBlue = true; 1220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskAlpha = true; 1230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthMask = true; 1240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(shareContext) 1260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager = shareContext->mResourceManager; 1280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->addRef(); 1290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 1310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager = new ResourceManager(); 1330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 3.7 page 83: 1360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have twodimensional 1370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // and cube map texture state vectors respectively associated with them. 1380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // In order that access to these initial textures not be lost, they are treated as texture 1390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // objects all of whose names are 0. 1400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTexture2DZero = new Texture2D(0); 1420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTexture3DZero = new Texture3D(0); 1430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTexture2DArrayZero = new Texture2DArray(0); 1440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTextureCubeMapZero = new TextureCubeMap(0); 1450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTextureExternalZero = new TextureExternal(0); 1460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.activeSampler = 0; 1480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindVertexArray(0); 1490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindArrayBuffer(0); 1500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindElementArrayBuffer(0); 1510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindTextureCubeMap(0); 1520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindTexture2D(0); 1530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindReadFramebuffer(0); 1540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindDrawFramebuffer(0); 1550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindRenderbuffer(0); 1560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindGenericUniformBuffer(0); 1570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindTransformFeedback(0); 1580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.currentProgram = 0; 1600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packAlignment = 4; 1620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackInfo.alignment = 4; 1630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packRowLength = 0; 1640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packImageHeight = 0; 1650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packSkipPixels = 0; 1660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packSkipRows = 0; 1670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packSkipImages = 0; 1680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackInfo.rowLength = 0; 1690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackInfo.imageHeight = 0; 1700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackInfo.skipPixels = 0; 1710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackInfo.skipRows = 0; 1720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackInfo.skipImages = 0; 1730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mVertexDataManager = nullptr; 1750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mIndexDataManager = nullptr; 1760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidEnum = false; 1780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidValue = false; 1790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidOperation = false; 1800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mOutOfMemory = false; 1810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidFramebufferOperation = false; 1820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mHasBeenCurrent = false; 1840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens markAllStateDirty(); 1860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 1870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1880bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensContext::~Context() 1890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 1900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.currentProgram != 0) 1910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *programObject = mResourceManager->getProgram(mState.currentProgram); 1930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(programObject) 1940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens programObject->release(); 1960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.currentProgram = 0; 1980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens while(!mFramebufferNameSpace.empty()) 2010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens deleteFramebuffer(mFramebufferNameSpace.firstName()); 2030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens while(!mFenceNameSpace.empty()) 2060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens deleteFence(mFenceNameSpace.firstName()); 2080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens while(!mQueryNameSpace.empty()) 2110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens deleteQuery(mQueryNameSpace.firstName()); 2130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens while(!mVertexArrayNameSpace.empty()) 2160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2175da143cb0811357c0b781ed4fca28fc85ee9207aLingfeng Yang deleteVertexArray(mVertexArrayNameSpace.lastName()); 2180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens while(!mTransformFeedbackNameSpace.empty()) 2210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens deleteTransformFeedback(mTransformFeedbackNameSpace.firstName()); 2230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int type = 0; type < TEXTURE_TYPE_COUNT; type++) 2260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int sampler = 0; sampler < MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++) 2280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.samplerTexture[type][sampler] = nullptr; 2300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_VERTEX_ATTRIBS; i++) 2340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[i].mBoundBuffer = nullptr; 2360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < QUERY_TYPE_COUNT; i++) 2390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.activeQuery[i] = nullptr; 2410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.arrayBuffer = nullptr; 2440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.copyReadBuffer = nullptr; 2450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.copyWriteBuffer = nullptr; 2460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.pixelPackBuffer = nullptr; 2470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.pixelUnpackBuffer = nullptr; 2480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.genericUniformBuffer = nullptr; 249deaf0bc7a03ba3351f69509ae050fc859c507884Ben Vanik 250deaf0bc7a03ba3351f69509ae050fc859c507884Ben Vanik for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; i++) { 251deaf0bc7a03ba3351f69509ae050fc859c507884Ben Vanik mState.uniformBuffers[i].set(nullptr, 0, 0); 252deaf0bc7a03ba3351f69509ae050fc859c507884Ben Vanik } 253deaf0bc7a03ba3351f69509ae050fc859c507884Ben Vanik 2540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.renderbuffer = nullptr; 2550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_COMBINED_TEXTURE_IMAGE_UNITS; ++i) 2570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampler[i] = nullptr; 2590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTexture2DZero = nullptr; 2620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTexture3DZero = nullptr; 2630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTexture2DArrayZero = nullptr; 2640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTextureCubeMapZero = nullptr; 2650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTextureExternalZero = nullptr; 2660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete mVertexDataManager; 2680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete mIndexDataManager; 2690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->release(); 2710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete device; 2720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 2730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27431c07a304f3247c26ba72eff0cb0a74eb05366e8Nicolas Capensvoid Context::makeCurrent(gl::Surface *surface) 2750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 2760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!mHasBeenCurrent) 2770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mVertexDataManager = new VertexDataManager(this); 2790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mIndexDataManager = new IndexDataManager(); 2800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportX = 0; 2820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportY = 0; 2839494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens mState.viewportWidth = surface ? surface->getWidth() : 0; 2849494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens mState.viewportHeight = surface ? surface->getHeight() : 0; 2850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorX = 0; 2870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorY = 0; 2889494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens mState.scissorWidth = surface ? surface->getWidth() : 0; 2899494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens mState.scissorHeight = surface ? surface->getHeight() : 0; 2900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mHasBeenCurrent = true; 2920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2949494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens if(surface) 2959494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens { 2969494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens // Wrap the existing resources into GL objects and assign them to the '0' names 2979494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens egl::Image *defaultRenderTarget = surface->getRenderTarget(); 2989494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens egl::Image *depthStencil = surface->getDepthStencil(); 2990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3009494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens Colorbuffer *colorbufferZero = new Colorbuffer(defaultRenderTarget); 3019494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens DepthStencilbuffer *depthStencilbufferZero = new DepthStencilbuffer(depthStencil); 3029494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens Framebuffer *framebufferZero = new DefaultFramebuffer(colorbufferZero, depthStencilbufferZero); 3030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3049494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens setFramebufferZero(framebufferZero); 3050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3069494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens if(defaultRenderTarget) 3079494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens { 3089494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens defaultRenderTarget->release(); 3099494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens } 3100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3119494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens if(depthStencil) 3129494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens { 3139494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens depthStencil->release(); 3149494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens } 3159494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens } 3169494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens else 3170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3189494572a1798d5148d18d3db57c06ce07d608d23Nicolas Capens setFramebufferZero(nullptr); 3190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 3200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens markAllStateDirty(); 3220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3240bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensEGLint Context::getClientVersion() const 3250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return clientVersion; 3270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 329f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas CapensEGLint Context::getConfigID() const 330f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas Capens{ 331f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas Capens return config->mConfigID; 332f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas Capens} 333f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas Capens 3340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// This function will set all of the state-related dirty flags, so that all state is set during next pre-draw. 3350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::markAllStateDirty() 3360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mAppliedProgramSerial = 0; 3380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDepthStateDirty = true; 3400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMaskStateDirty = true; 3410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 3420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 3430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mPolygonOffsetStateDirty = true; 3440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = true; 3450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDitherStateDirty = true; 3460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFrontFaceDirty = true; 3470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setClearColor(float red, float green, float blue, float alpha) 3500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorClearValue.red = red; 3520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorClearValue.green = green; 3530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorClearValue.blue = blue; 3540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorClearValue.alpha = alpha; 3550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setClearDepth(float depth) 3580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthClearValue = depth; 3600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setClearStencil(int stencil) 3630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilClearValue = stencil; 3650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setCullFaceEnabled(bool enabled) 3680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.cullFaceEnabled = enabled; 3700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isCullFaceEnabled() const 3730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.cullFaceEnabled; 3750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setCullMode(GLenum mode) 3780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.cullMode = mode; 3800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFrontFace(GLenum front) 3830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.frontFace != front) 3850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.frontFace = front; 3870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFrontFaceDirty = true; 3880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 3890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDepthTestEnabled(bool enabled) 3920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthTestEnabled != enabled) 3940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthTestEnabled = enabled; 3960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDepthStateDirty = true; 3970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 3980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isDepthTestEnabled() const 4010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.depthTestEnabled; 4030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDepthFunc(GLenum depthFunc) 4060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthFunc != depthFunc) 4080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthFunc = depthFunc; 4100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDepthStateDirty = true; 4110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDepthRange(float zNear, float zFar) 4150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.zNear = zNear; 4170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.zFar = zFar; 4180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setBlendEnabled(bool enabled) 4210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.blendEnabled != enabled) 4230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEnabled = enabled; 4250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 4260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isBlendEnabled() const 4300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.blendEnabled; 4320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha) 4350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sourceBlendRGB != sourceRGB || 4370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendAlpha != sourceAlpha || 4380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendRGB != destRGB || 4390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendAlpha != destAlpha) 4400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendRGB = sourceRGB; 4420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendRGB = destRGB; 4430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendAlpha = sourceAlpha; 4440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendAlpha = destAlpha; 4450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 4460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setBlendColor(float red, float green, float blue, float alpha) 4500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.blendColor.red != red || 4520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.green != green || 4530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.blue != blue || 4540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.alpha != alpha) 4550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.red = red; 4570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.green = green; 4580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.blue = blue; 4590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.alpha = alpha; 4600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 4610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation) 4650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.blendEquationRGB != rgbEquation || 4670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationAlpha != alphaEquation) 4680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationRGB = rgbEquation; 4700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationAlpha = alphaEquation; 4710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 4720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilTestEnabled(bool enabled) 4760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilTestEnabled != enabled) 4780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilTestEnabled = enabled; 4800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 4810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isStencilTestEnabled() const 4850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.stencilTestEnabled; 4870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask) 4900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilFunc != stencilFunc || 4920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilRef != stencilRef || 4930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilMask != stencilMask) 4940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilFunc = stencilFunc; 4960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilRef = (stencilRef > 0) ? stencilRef : 0; 4970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilMask = stencilMask; 4980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 4990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask) 5030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilBackFunc != stencilBackFunc || 5050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackRef != stencilBackRef || 5060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackMask != stencilBackMask) 5070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackFunc = stencilBackFunc; 5090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0; 5100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackMask = stencilBackMask; 5110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 5120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilWritemask(GLuint stencilWritemask) 5160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilWritemask != stencilWritemask) 5180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilWritemask = stencilWritemask; 5200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 5210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilBackWritemask(GLuint stencilBackWritemask) 5250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilBackWritemask != stencilBackWritemask) 5270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackWritemask = stencilBackWritemask; 5290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 5300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass) 5340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilFail != stencilFail || 5360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthFail != stencilPassDepthFail || 5370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthPass != stencilPassDepthPass) 5380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilFail = stencilFail; 5400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthFail = stencilPassDepthFail; 5410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthPass = stencilPassDepthPass; 5420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 5430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass) 5470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilBackFail != stencilBackFail || 5490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackPassDepthFail != stencilBackPassDepthFail || 5500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackPassDepthPass != stencilBackPassDepthPass) 5510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackFail = stencilBackFail; 5530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackPassDepthFail = stencilBackPassDepthFail; 5540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackPassDepthPass = stencilBackPassDepthPass; 5550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 5560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPolygonOffsetFillEnabled(bool enabled) 5600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.polygonOffsetFillEnabled != enabled) 5620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetFillEnabled = enabled; 5640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mPolygonOffsetStateDirty = true; 5650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isPolygonOffsetFillEnabled() const 5690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.polygonOffsetFillEnabled; 5710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPolygonOffsetParams(GLfloat factor, GLfloat units) 5740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.polygonOffsetFactor != factor || 5760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetUnits != units) 5770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetFactor = factor; 5790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetUnits = units; 5800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mPolygonOffsetStateDirty = true; 5810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSampleAlphaToCoverageEnabled(bool enabled) 5850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleAlphaToCoverageEnabled != enabled) 5870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleAlphaToCoverageEnabled = enabled; 5890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = true; 5900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isSampleAlphaToCoverageEnabled() const 5940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.sampleAlphaToCoverageEnabled; 5960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSampleCoverageEnabled(bool enabled) 5990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageEnabled != enabled) 6010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 6020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageEnabled = enabled; 6030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = true; 6040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 6050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isSampleCoverageEnabled() const 6080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.sampleCoverageEnabled; 6100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSampleCoverageParams(GLclampf value, bool invert) 6130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageValue != value || 6150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageInvert != invert) 6160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 6170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageValue = value; 6180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageInvert = invert; 6190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = true; 6200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 6210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setScissorTestEnabled(bool enabled) 6240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorTestEnabled = enabled; 6260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isScissorTestEnabled() const 6290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.scissorTestEnabled; 6310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDitherEnabled(bool enabled) 6340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.ditherEnabled != enabled) 6360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 6370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.ditherEnabled = enabled; 6380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDitherStateDirty = true; 6390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 6400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isDitherEnabled() const 6430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.ditherEnabled; 6450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPrimitiveRestartFixedIndexEnabled(bool enabled) 6480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.primitiveRestartFixedIndexEnabled = enabled; 6500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isPrimitiveRestartFixedIndexEnabled() const 6530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.primitiveRestartFixedIndexEnabled; 6550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setRasterizerDiscardEnabled(bool enabled) 6580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.rasterizerDiscardEnabled = enabled; 6600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isRasterizerDiscardEnabled() const 6630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.rasterizerDiscardEnabled; 6650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLineWidth(GLfloat width) 6680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.lineWidth = width; 6700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLineWidth(clamp(width, ALIASED_LINE_WIDTH_RANGE_MIN, ALIASED_LINE_WIDTH_RANGE_MAX)); 6710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setGenerateMipmapHint(GLenum hint) 6740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.generateMipmapHint = hint; 6760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFragmentShaderDerivativeHint(GLenum hint) 6790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.fragmentShaderDerivativeHint = hint; 6810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // TODO: Propagate the hint to shader translator so we can write 6820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // ddx, ddx_coarse, or ddx_fine depending on the hint. 6830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Ignore for now. It is valid for implementations to ignore hint. 6840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 686010a464878f32daed863edee3fc6ad21920d605bAlexis Hetuvoid Context::setTextureFilteringHint(GLenum hint) 687010a464878f32daed863edee3fc6ad21920d605bAlexis Hetu{ 688010a464878f32daed863edee3fc6ad21920d605bAlexis Hetu mState.textureFilteringHint = hint; 689010a464878f32daed863edee3fc6ad21920d605bAlexis Hetu} 690010a464878f32daed863edee3fc6ad21920d605bAlexis Hetu 6910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height) 6920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportX = x; 6940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportY = y; 695b28c662c82c7ac74962cb12a5d9f5bde2e650032Nicolas Capens mState.viewportWidth = std::min<GLsizei>(width, IMPLEMENTATION_MAX_RENDERBUFFER_SIZE); // GL_MAX_VIEWPORT_DIMS[0] 696b28c662c82c7ac74962cb12a5d9f5bde2e650032Nicolas Capens mState.viewportHeight = std::min<GLsizei>(height, IMPLEMENTATION_MAX_RENDERBUFFER_SIZE); // GL_MAX_VIEWPORT_DIMS[1] 6970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height) 7000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorX = x; 7020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorY = y; 7030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorWidth = width; 7040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorHeight = height; 7050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setColorMask(bool red, bool green, bool blue, bool alpha) 7080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.colorMaskRed != red || mState.colorMaskGreen != green || 7100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskBlue != blue || mState.colorMaskAlpha != alpha) 7110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 7120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskRed = red; 7130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskGreen = green; 7140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskBlue = blue; 7150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskAlpha = alpha; 7160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMaskStateDirty = true; 7170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 7180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensunsigned int Context::getColorMask() const 7210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return (mState.colorMaskRed ? 0x1 : 0) | 7230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens (mState.colorMaskGreen ? 0x2 : 0) | 7240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens (mState.colorMaskBlue ? 0x4 : 0) | 7250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens (mState.colorMaskAlpha ? 0x8 : 0); 7260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDepthMask(bool mask) 7290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthMask != mask) 7310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 7320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthMask = mask; 7330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMaskStateDirty = true; 7340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 7350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setActiveSampler(unsigned int active) 7380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.activeSampler = active; 7400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7420bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getReadFramebufferName() const 7430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.readFramebuffer; 7450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7470bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getDrawFramebufferName() const 7480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.drawFramebuffer; 7500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7520bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getRenderbufferName() const 7530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.renderbuffer.name(); 7550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFramebufferReadBuffer(GLuint buf) 7580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens getReadFramebuffer()->setReadBuffer(buf); 7600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs) 7630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *drawFramebuffer = getDrawFramebuffer(); 7650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++) 7670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 7680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawFramebuffer->setDrawBuffer(i, (i < n) ? bufs[i] : GL_NONE); 7690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 7700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7720bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getArrayBufferName() const 7730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.arrayBuffer.name(); 7750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7770bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getElementArrayBufferName() const 7780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Buffer* elementArrayBuffer = getCurrentVertexArray()->getElementArrayBuffer(); 7800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return elementArrayBuffer ? elementArrayBuffer->name : 0; 7810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7830bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getActiveQuery(GLenum target) const 7840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Query *queryObject = nullptr; 7860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(target) 7880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 7890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ANY_SAMPLES_PASSED_EXT: 7900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens queryObject = mState.activeQuery[QUERY_ANY_SAMPLES_PASSED]; 7910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 7920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: 7930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens queryObject = mState.activeQuery[QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE]; 7940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 7950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 7960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens queryObject = mState.activeQuery[QUERY_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN]; 7970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 7980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 7990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(false); 8000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 8010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(queryObject) 8030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 8040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return queryObject->name; 8050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 8060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 0; 8080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setVertexAttribArrayEnabled(unsigned int attribNum, bool enabled) 8110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens getCurrentVertexArray()->enableAttribute(attribNum, enabled); 8130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setVertexAttribDivisor(unsigned int attribNum, GLuint divisor) 8160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens getCurrentVertexArray()->setVertexAttribDivisor(attribNum, divisor); 8180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensconst VertexAttribute &Context::getVertexAttribState(unsigned int attribNum) const 8210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return getCurrentVertexArray()->getVertexAttribute(attribNum); 8230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8256f28403ac996ab4516f1b10d1f359ad03d291436Alexis Hetuvoid Context::setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type, 8266f28403ac996ab4516f1b10d1f359ad03d291436Alexis Hetu bool normalized, bool pureInteger, GLsizei stride, const void *pointer) 8270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8286f28403ac996ab4516f1b10d1f359ad03d291436Alexis Hetu getCurrentVertexArray()->setAttributeState(attribNum, boundBuffer, size, type, normalized, pureInteger, stride, pointer); 8290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensconst void *Context::getVertexAttribPointer(unsigned int attribNum) const 8320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return getCurrentVertexArray()->getVertexAttribute(attribNum).mPointer; 8340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensconst VertexAttributeArray &Context::getVertexArrayAttributes() 8370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return getCurrentVertexArray()->getVertexAttributes(); 8390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensconst VertexAttributeArray &Context::getCurrentVertexAttributes() 8420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.vertexAttribute; 8440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPackAlignment(GLint alignment) 8470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packAlignment = alignment; 8490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setUnpackAlignment(GLint alignment) 8520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackInfo.alignment = alignment; 8540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensconst egl::Image::UnpackInfo& Context::getUnpackInfo() const 8570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.unpackInfo; 8590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPackRowLength(GLint rowLength) 8620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packRowLength = rowLength; 8640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPackImageHeight(GLint imageHeight) 8670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packImageHeight = imageHeight; 8690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPackSkipPixels(GLint skipPixels) 8720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packSkipPixels = skipPixels; 8740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPackSkipRows(GLint skipRows) 8770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packSkipRows = skipRows; 8790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPackSkipImages(GLint skipImages) 8820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packSkipImages = skipImages; 8840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setUnpackRowLength(GLint rowLength) 8870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackInfo.rowLength = rowLength; 8890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setUnpackImageHeight(GLint imageHeight) 8920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackInfo.imageHeight = imageHeight; 8940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setUnpackSkipPixels(GLint skipPixels) 8970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackInfo.skipPixels = skipPixels; 8990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setUnpackSkipRows(GLint skipRows) 9020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackInfo.skipRows = skipRows; 9040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setUnpackSkipImages(GLint skipImages) 9070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackInfo.skipImages = skipImages; 9090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9110bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createBuffer() 9120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createBuffer(); 9140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9160bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createProgram() 9170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createProgram(); 9190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9210bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createShader(GLenum type) 9220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createShader(type); 9240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9260bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createTexture() 9270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createTexture(); 9290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9310bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createRenderbuffer() 9320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createRenderbuffer(); 9340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Returns an unused framebuffer name 9370bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createFramebuffer() 9380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mFramebufferNameSpace.allocate(); 9400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9420bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createFence() 9430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mFenceNameSpace.allocate(new Fence()); 9450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Returns an unused query name 9480bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createQuery() 9490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mQueryNameSpace.allocate(); 9510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Returns an unused vertex array name 9540bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createVertexArray() 9550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mVertexArrayNameSpace.allocate(); 9570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9590bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLsync Context::createFenceSync(GLenum condition, GLbitfield flags) 9600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLuint handle = mResourceManager->createFenceSync(condition, flags); 9620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle)); 9640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Returns an unused transform feedback name 9670bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createTransformFeedback() 9680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mTransformFeedbackNameSpace.allocate(); 9700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Returns an unused sampler name 9730bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createSampler() 9740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createSampler(); 9760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteBuffer(GLuint buffer) 9790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens detachBuffer(buffer); 9810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteBuffer(buffer); 9830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteShader(GLuint shader) 9860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteShader(shader); 9880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteProgram(GLuint program) 9910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteProgram(program); 9930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteTexture(GLuint texture) 9960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens detachTexture(texture); 9980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteTexture(texture); 10000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteRenderbuffer(GLuint renderbuffer) 10030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mResourceManager->getRenderbuffer(renderbuffer)) 10050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens detachRenderbuffer(renderbuffer); 10070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteRenderbuffer(renderbuffer); 10100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteFramebuffer(GLuint framebuffer) 10130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens detachFramebuffer(framebuffer); 10150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebufferObject = mFramebufferNameSpace.remove(framebuffer); 10170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(framebufferObject) 10190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete framebufferObject; 10210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteFence(GLuint fence) 10250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Fence *fenceObject = mFenceNameSpace.remove(fence); 10270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(fenceObject) 10290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete fenceObject; 10310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteQuery(GLuint query) 10350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Query *queryObject = mQueryNameSpace.remove(query); 10370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(queryObject) 10390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens queryObject->release(); 10410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteVertexArray(GLuint vertexArray) 10450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 3.0.2] section 2.10 page 43: 10470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a vertex array object that is currently bound is deleted, the binding 10480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // for that object reverts to zero and the default vertex array becomes current. 10490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(getCurrentVertexArray()->name == vertexArray) 10500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindVertexArray(0); 10520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens VertexArray *vertexArrayObject = mVertexArrayNameSpace.remove(vertexArray); 10550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(vertexArrayObject) 10570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete vertexArrayObject; 10590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteFenceSync(GLsync fenceSync) 10630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // The spec specifies the underlying Fence object is not deleted until all current 10650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // wait commands finish. However, since the name becomes invalid, we cannot query the fence, 10660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // and since our API is currently designed for being called from a single thread, we can delete 10670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // the fence immediately. 10680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteFenceSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(fenceSync))); 10690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteTransformFeedback(GLuint transformFeedback) 10720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TransformFeedback *transformFeedbackObject = mTransformFeedbackNameSpace.remove(transformFeedback); 10740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(transformFeedbackObject) 10760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete transformFeedbackObject; 10780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteSampler(GLuint sampler) 10820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens detachSampler(sampler); 10840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteSampler(sampler); 10860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10880bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getBuffer(GLuint handle) const 10890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getBuffer(handle); 10910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10930bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensShader *Context::getShader(GLuint handle) const 10940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getShader(handle); 10960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10980bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensProgram *Context::getProgram(GLuint handle) const 10990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getProgram(handle); 11010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11030bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTexture *Context::getTexture(GLuint handle) const 11040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getTexture(handle); 11060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11080bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensRenderbuffer *Context::getRenderbuffer(GLuint handle) const 11090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getRenderbuffer(handle); 11110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11130bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensFramebuffer *Context::getReadFramebuffer() const 11140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return getFramebuffer(mState.readFramebuffer); 11160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11180bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensFramebuffer *Context::getDrawFramebuffer() const 11190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return getFramebuffer(mState.drawFramebuffer); 11210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindArrayBuffer(unsigned int buffer) 11240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 11260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.arrayBuffer = getBuffer(buffer); 11280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindElementArrayBuffer(unsigned int buffer) 11310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 11330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens getCurrentVertexArray()->setElementArrayBuffer(getBuffer(buffer)); 11350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindCopyReadBuffer(GLuint buffer) 11380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 11400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.copyReadBuffer = getBuffer(buffer); 11420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindCopyWriteBuffer(GLuint buffer) 11450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 11470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.copyWriteBuffer = getBuffer(buffer); 11490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindPixelPackBuffer(GLuint buffer) 11520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 11540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.pixelPackBuffer = getBuffer(buffer); 11560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindPixelUnpackBuffer(GLuint buffer) 11590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 11610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.pixelUnpackBuffer = getBuffer(buffer); 11630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindTransformFeedbackBuffer(GLuint buffer) 11660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 11680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback); 11700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(transformFeedback) 11720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 11730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens transformFeedback->setGenericBuffer(getBuffer(buffer)); 11740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 11750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindTexture2D(GLuint texture) 11780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkTextureAllocation(texture, TEXTURE_2D); 11800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.samplerTexture[TEXTURE_2D][mState.activeSampler] = getTexture(texture); 11820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindTextureCubeMap(GLuint texture) 11850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkTextureAllocation(texture, TEXTURE_CUBE); 11870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.samplerTexture[TEXTURE_CUBE][mState.activeSampler] = getTexture(texture); 11890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindTextureExternal(GLuint texture) 11920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkTextureAllocation(texture, TEXTURE_EXTERNAL); 11940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.samplerTexture[TEXTURE_EXTERNAL][mState.activeSampler] = getTexture(texture); 11960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindTexture3D(GLuint texture) 11990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkTextureAllocation(texture, TEXTURE_3D); 12010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.samplerTexture[TEXTURE_3D][mState.activeSampler] = getTexture(texture); 12030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindTexture2DArray(GLuint texture) 12060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkTextureAllocation(texture, TEXTURE_2D_ARRAY); 12080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.samplerTexture[TEXTURE_2D_ARRAY][mState.activeSampler] = getTexture(texture); 12100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindReadFramebuffer(GLuint framebuffer) 12130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!getFramebuffer(framebuffer)) 12150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFramebufferNameSpace.insert(framebuffer, new Framebuffer()); 12170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.readFramebuffer = framebuffer; 12200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindDrawFramebuffer(GLuint framebuffer) 12230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!getFramebuffer(framebuffer)) 12250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFramebufferNameSpace.insert(framebuffer, new Framebuffer()); 12270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.drawFramebuffer = framebuffer; 12300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindRenderbuffer(GLuint renderbuffer) 12330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkRenderbufferAllocation(renderbuffer); 12350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.renderbuffer = getRenderbuffer(renderbuffer); 12370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindVertexArray(GLuint array) 12400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens VertexArray *vertexArray = getVertexArray(array); 12420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!vertexArray) 12440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens vertexArray = new VertexArray(array); 12460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mVertexArrayNameSpace.insert(array, vertexArray); 12470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexArray = array; 12500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindGenericUniformBuffer(GLuint buffer) 12530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 12550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.genericUniformBuffer = getBuffer(buffer); 12570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size) 12600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 12620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Buffer* bufferObject = getBuffer(buffer); 1264bffe803cd29475ca68ab1fea8a04276726fa83b7Alexis Hetu mState.uniformBuffers[index].set(bufferObject, static_cast<int>(offset), static_cast<int>(size)); 12650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindGenericTransformFeedbackBuffer(GLuint buffer) 12680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 12700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens getTransformFeedback()->setGenericBuffer(getBuffer(buffer)); 12720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size) 12750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 12770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Buffer* bufferObject = getBuffer(buffer); 12790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens getTransformFeedback()->setBuffer(index, bufferObject, offset, size); 12800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindTransformFeedback(GLuint id) 12830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!getTransformFeedback(id)) 12850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTransformFeedbackNameSpace.insert(id, new TransformFeedback(id)); 12870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.transformFeedback = id; 12900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::bindSampler(GLuint unit, GLuint sampler) 12930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkSamplerAllocation(sampler); 12950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Sampler* samplerObject = getSampler(sampler); 12970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12983c99be0d2f6cc82773d9eacbc421a70c07426a9bAlexis Hetu mState.sampler[unit] = samplerObject; 12990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return !!samplerObject; 13010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 13020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::useProgram(GLuint program) 13040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 13050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLuint priorProgram = mState.currentProgram; 13060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.currentProgram = program; // Must switch before trying to delete, otherwise it only gets flagged. 13070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(priorProgram != program) 13090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *newProgram = mResourceManager->getProgram(program); 13110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *oldProgram = mResourceManager->getProgram(priorProgram); 13120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(newProgram) 13140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens newProgram->addRef(); 13160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(oldProgram) 13190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens oldProgram->release(); 13210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 13240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::beginQuery(GLenum target, GLuint query) 13260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 13270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // From EXT_occlusion_query_boolean: If BeginQueryEXT is called with an <id> 13280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // of zero, if the active query object name for <target> is non-zero (for the 13290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // targets ANY_SAMPLES_PASSED_EXT and ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, if 13300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // the active query for either target is non-zero), if <id> is the name of an 13310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // existing query object whose type does not match <target>, or if <id> is the 13320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // active query object name for any query type, the error INVALID_OPERATION is 13330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // generated. 13340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Ensure no other queries are active 13360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // NOTE: If other queries than occlusion are supported, we will need to check 13370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // separately that: 13380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // a) The query ID passed is not the current active query for any target/type 13390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // b) There are no active queries for the requested target (and in the case 13400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // of GL_ANY_SAMPLES_PASSED_EXT and GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, 13410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // no query may be active for either if glBeginQuery targets either. 13420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < QUERY_TYPE_COUNT; i++) 13430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.activeQuery[i]) 13450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 134694ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu switch(mState.activeQuery[i]->getType()) 134794ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu { 134894ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu case GL_ANY_SAMPLES_PASSED_EXT: 134994ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: 135094ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu if((target == GL_ANY_SAMPLES_PASSED_EXT) || 135194ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu (target == GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT)) 135294ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu { 135394ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu return error(GL_INVALID_OPERATION); 135494ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu } 135594ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu break; 135694ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 135794ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu if(target == GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN) 135894ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu { 135994ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu return error(GL_INVALID_OPERATION); 136094ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu } 136194ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu break; 136294ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu default: 136394ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu break; 136494ca5b63700fab01e8aa3f3fc67a2753efdd866eAlexis Hetu } 13650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens QueryType qType; 13690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(target) 13700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ANY_SAMPLES_PASSED_EXT: 13720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens qType = QUERY_ANY_SAMPLES_PASSED; 13730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: 13750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens qType = QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE; 13760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 13780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens qType = QUERY_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN; 13790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 138105c32b9b014dd9536782fcec3ea96168a97e2e28Alexis Hetu UNREACHABLE(target); 138205c32b9b014dd9536782fcec3ea96168a97e2e28Alexis Hetu return error(GL_INVALID_ENUM); 13830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Query *queryObject = createQuery(query, target); 13860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Check that name was obtained with glGenQueries 13880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!queryObject) 13890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 13910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Check for type mismatch 13940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(queryObject->getType() != target) 13950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 13970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Set query as active for specified target 14000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.activeQuery[qType] = queryObject; 14010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Begin query 14030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens queryObject->begin(); 14040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::endQuery(GLenum target) 14070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens QueryType qType; 14090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(target) 14110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ANY_SAMPLES_PASSED_EXT: qType = QUERY_ANY_SAMPLES_PASSED; break; 14130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: qType = QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE; break; 14140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: qType = QUERY_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN; break; 14150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(target); return; 14160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Query *queryObject = mState.activeQuery[qType]; 14190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!queryObject) 14210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 14230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens queryObject->end(); 14260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.activeQuery[qType] = nullptr; 14280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFramebufferZero(Framebuffer *buffer) 14310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete mFramebufferNameSpace.remove(0); 14330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFramebufferNameSpace.insert(0, buffer); 14340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setRenderbufferStorage(RenderbufferStorage *renderbuffer) 14370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *renderbufferObject = mState.renderbuffer; 14390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens renderbufferObject->setStorage(renderbuffer); 14400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14420bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensFramebuffer *Context::getFramebuffer(unsigned int handle) const 14430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mFramebufferNameSpace.find(handle); 14450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14470bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensFence *Context::getFence(unsigned int handle) const 14480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mFenceNameSpace.find(handle); 14500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14520bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensFenceSync *Context::getFenceSync(GLsync handle) const 14530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getFenceSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle))); 14550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14570bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensQuery *Context::getQuery(unsigned int handle) const 14580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mQueryNameSpace.find(handle); 14600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14620bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensQuery *Context::createQuery(unsigned int handle, GLenum type) 14630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!mQueryNameSpace.isReserved(handle)) 14650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return nullptr; 14670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 14690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Query *query = mQueryNameSpace.find(handle); 14710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!query) 14720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens query = new Query(handle, type); 14740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens query->addRef(); 14750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mQueryNameSpace.insert(handle, query); 14760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return query; 14790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14820bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensVertexArray *Context::getVertexArray(GLuint array) const 14830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mVertexArrayNameSpace.find(array); 14850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14870bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensVertexArray *Context::getCurrentVertexArray() const 14880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return getVertexArray(mState.vertexArray); 14900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isVertexArray(GLuint array) const 14930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mVertexArrayNameSpace.isReserved(array); 14950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::hasZeroDivisor() const 14980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Verify there is at least one active attribute with a divisor of zero 15000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens es2::Program *programObject = getCurrentProgram(); 15010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int attributeIndex = 0; attributeIndex < MAX_VERTEX_ATTRIBS; attributeIndex++) 15020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 15030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool active = (programObject->getAttributeStream(attributeIndex) != -1); 15040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(active && getCurrentVertexArray()->getVertexAttribute(attributeIndex).mDivisor == 0) 15050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 15060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 15070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 15080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 15090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 15100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 15110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 15120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 15130bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTransformFeedback *Context::getTransformFeedback(GLuint transformFeedback) const 15140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 15150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mTransformFeedbackNameSpace.find(transformFeedback); 15160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 15170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 15185bf9708430d230f133833b72d64921cafda98929Alexis Hetubool Context::isTransformFeedback(GLuint array) const 15195bf9708430d230f133833b72d64921cafda98929Alexis Hetu{ 15205bf9708430d230f133833b72d64921cafda98929Alexis Hetu return mTransformFeedbackNameSpace.isReserved(array); 15215bf9708430d230f133833b72d64921cafda98929Alexis Hetu} 15225bf9708430d230f133833b72d64921cafda98929Alexis Hetu 15230bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensSampler *Context::getSampler(GLuint sampler) const 15240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 15250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getSampler(sampler); 15260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 15270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 15280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isSampler(GLuint sampler) const 15290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 15300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->isSampler(sampler); 15310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 15320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 15330bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getArrayBuffer() const 15340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 15350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.arrayBuffer; 15360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 15370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 15380bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getElementArrayBuffer() const 15390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 15400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return getCurrentVertexArray()->getElementArrayBuffer(); 15410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 15420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 15430bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getCopyReadBuffer() const 15440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 15450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.copyReadBuffer; 15460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 15470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 15480bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getCopyWriteBuffer() const 15490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 15500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.copyWriteBuffer; 15510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 15520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 15530bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getPixelPackBuffer() const 15540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 15550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.pixelPackBuffer; 15560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 15570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 15580bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getPixelUnpackBuffer() const 15590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 15600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.pixelUnpackBuffer; 15610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 15620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 15630bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getGenericUniformBuffer() const 15640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 15650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.genericUniformBuffer; 15660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 15670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1568f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis HetuGLsizei Context::getRequiredBufferSize(GLsizei width, GLsizei height, GLsizei depth, GLint internalformat, GLenum type) const 156953f4809cdb692da1a906f9de846b6adb22879fcdAlexis Hetu{ 1570f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu GLenum format = GetSizedInternalFormat(internalformat, type); 1571f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu GLsizei inputWidth = (mState.unpackInfo.rowLength == 0) ? width : mState.unpackInfo.rowLength; 1572f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu GLsizei inputPitch = egl::ComputePitch(inputWidth, format, type, mState.unpackInfo.alignment); 1573f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu GLsizei inputHeight = (mState.unpackInfo.imageHeight == 0) ? height : mState.unpackInfo.imageHeight; 1574848aa7fc4f1c71e3d5bdb896c249461d495b248dAlexis Hetu return inputPitch * inputHeight * depth; 1575f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu} 1576f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu 1577848aa7fc4f1c71e3d5bdb896c249461d495b248dAlexis HetuGLenum Context::getPixels(const GLvoid **data, GLenum type, GLsizei imageSize) const 1578f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu{ 1579f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu if(mState.pixelUnpackBuffer) 1580f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu { 1581f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu if(mState.pixelUnpackBuffer->name) 1582f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu { 1583f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu if(mState.pixelUnpackBuffer->isMapped() || 1584b14752c2cab6007619411741a440fb5b15283f34Alexis Hetu (mState.pixelUnpackBuffer->size() < static_cast<size_t>(imageSize)) || 1585848aa7fc4f1c71e3d5bdb896c249461d495b248dAlexis Hetu (static_cast<GLsizei>((ptrdiff_t)(*data)) % GetTypeSize(type))) 1586f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu { 1587f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu return GL_INVALID_OPERATION; 1588f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu } 1589f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu } 1590f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu 1591f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu *data = static_cast<const unsigned char*>(mState.pixelUnpackBuffer->data()) + (ptrdiff_t)(*data); 1592f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu } 1593f97f6e0e2e473e93112fa48a2b675f3f63c10663Alexis Hetu return GL_NONE; 159453f4809cdb692da1a906f9de846b6adb22879fcdAlexis Hetu} 159553f4809cdb692da1a906f9de846b6adb22879fcdAlexis Hetu 15960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::getBuffer(GLenum target, es2::Buffer **buffer) const 15970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 15980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(target) 15990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ARRAY_BUFFER: 16010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *buffer = getArrayBuffer(); 16020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ELEMENT_ARRAY_BUFFER: 16040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *buffer = getElementArrayBuffer(); 16050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COPY_READ_BUFFER: 16070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(clientVersion >= 3) 16080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *buffer = getCopyReadBuffer(); 16100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else return false; 16130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COPY_WRITE_BUFFER: 16140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(clientVersion >= 3) 16150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *buffer = getCopyWriteBuffer(); 16170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else return false; 16200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PIXEL_PACK_BUFFER: 16210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(clientVersion >= 3) 16220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *buffer = getPixelPackBuffer(); 16240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else return false; 16270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PIXEL_UNPACK_BUFFER: 16280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(clientVersion >= 3) 16290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *buffer = getPixelUnpackBuffer(); 16310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else return false; 16340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_BUFFER: 16350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(clientVersion >= 3) 16360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TransformFeedback* transformFeedback = getTransformFeedback(); 16380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *buffer = transformFeedback ? static_cast<es2::Buffer*>(transformFeedback->getGenericBuffer()) : nullptr; 16390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else return false; 16420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNIFORM_BUFFER: 16430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(clientVersion >= 3) 16440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *buffer = getGenericUniformBuffer(); 16460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else return false; 16490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 16500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 16510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 16530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 16540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16550bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTransformFeedback *Context::getTransformFeedback() const 16560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 16570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return getTransformFeedback(mState.transformFeedback); 16580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 16590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16600bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensProgram *Context::getCurrentProgram() const 16610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 16620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getProgram(mState.currentProgram); 16630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 16640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16650bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTexture2D *Context::getTexture2D() const 16660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 16670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return static_cast<Texture2D*>(getSamplerTexture(mState.activeSampler, TEXTURE_2D)); 16680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 16690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16700bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTexture3D *Context::getTexture3D() const 16710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 16720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return static_cast<Texture3D*>(getSamplerTexture(mState.activeSampler, TEXTURE_3D)); 16730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 16740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16750bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTexture2DArray *Context::getTexture2DArray() const 16760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 16770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return static_cast<Texture2DArray*>(getSamplerTexture(mState.activeSampler, TEXTURE_2D_ARRAY)); 16780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 16790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16800bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTextureCubeMap *Context::getTextureCubeMap() const 16810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 16820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return static_cast<TextureCubeMap*>(getSamplerTexture(mState.activeSampler, TEXTURE_CUBE)); 16830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 16840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16850bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTextureExternal *Context::getTextureExternal() const 16860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 16870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return static_cast<TextureExternal*>(getSamplerTexture(mState.activeSampler, TEXTURE_EXTERNAL)); 16880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 16890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16900bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTexture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const 16910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 16920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLuint texid = mState.samplerTexture[type][sampler].name(); 16930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(texid == 0) // Special case: 0 refers to different initial textures based on the target 16950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(type) 16970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case TEXTURE_2D: return mTexture2DZero; 16990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case TEXTURE_3D: return mTexture3DZero; 17000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case TEXTURE_2D_ARRAY: return mTexture2DArrayZero; 17010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case TEXTURE_CUBE: return mTextureCubeMapZero; 17020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case TEXTURE_EXTERNAL: return mTextureExternalZero; 17030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(type); 17040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.samplerTexture[type][sampler]; 17080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 17090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param) 17110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 17120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkSamplerAllocation(sampler); 17130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Sampler *samplerObject = getSampler(sampler); 17150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(samplerObject); 17160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 17180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1719f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(static_cast<GLenum>(param)); break; 1720f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(static_cast<GLenum>(param)); break; 1721f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(static_cast<GLenum>(param)); break; 1722f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(static_cast<GLenum>(param)); break; 1723f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(static_cast<GLenum>(param)); break; 1724f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(static_cast<GLfloat>(param)); break; 1725f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(static_cast<GLfloat>(param)); break; 1726f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(static_cast<GLenum>(param)); break; 1727f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(static_cast<GLenum>(param)); break; 1728f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens default: UNREACHABLE(pname); break; 17290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 17310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param) 17330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 17340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkSamplerAllocation(sampler); 17350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Sampler *samplerObject = getSampler(sampler); 17370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(samplerObject); 17380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 17400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1741f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(static_cast<GLenum>(roundf(param))); break; 1742f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(static_cast<GLenum>(roundf(param))); break; 1743f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(static_cast<GLenum>(roundf(param))); break; 1744f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(static_cast<GLenum>(roundf(param))); break; 1745f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(static_cast<GLenum>(roundf(param))); break; 1746f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(param); break; 1747f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(param); break; 1748f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(static_cast<GLenum>(roundf(param))); break; 1749f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(static_cast<GLenum>(roundf(param))); break; 1750f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens default: UNREACHABLE(pname); break; 17510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 17530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17540bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLint Context::getSamplerParameteri(GLuint sampler, GLenum pname) 17550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 17560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkSamplerAllocation(sampler); 17570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Sampler *samplerObject = getSampler(sampler); 17590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(samplerObject); 17600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 17620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1763f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MIN_FILTER: return static_cast<GLint>(samplerObject->getMinFilter()); 1764f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MAG_FILTER: return static_cast<GLint>(samplerObject->getMagFilter()); 1765f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_WRAP_S: return static_cast<GLint>(samplerObject->getWrapS()); 1766f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_WRAP_T: return static_cast<GLint>(samplerObject->getWrapT()); 1767f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_WRAP_R: return static_cast<GLint>(samplerObject->getWrapR()); 1768f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MIN_LOD: return static_cast<GLint>(roundf(samplerObject->getMinLod())); 1769f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MAX_LOD: return static_cast<GLint>(roundf(samplerObject->getMaxLod())); 1770f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_COMPARE_MODE: return static_cast<GLint>(samplerObject->getCompareMode()); 1771f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLint>(samplerObject->getCompareFunc()); 1772f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens default: UNREACHABLE(pname); return 0; 17730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 17750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17760bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLfloat Context::getSamplerParameterf(GLuint sampler, GLenum pname) 17770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 17780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkSamplerAllocation(sampler); 17790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Sampler *samplerObject = getSampler(sampler); 17810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(samplerObject); 17820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 17840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1785f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MIN_FILTER: return static_cast<GLfloat>(samplerObject->getMinFilter()); 1786f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MAG_FILTER: return static_cast<GLfloat>(samplerObject->getMagFilter()); 1787f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_WRAP_S: return static_cast<GLfloat>(samplerObject->getWrapS()); 1788f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_WRAP_T: return static_cast<GLfloat>(samplerObject->getWrapT()); 1789f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_WRAP_R: return static_cast<GLfloat>(samplerObject->getWrapR()); 1790f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MIN_LOD: return samplerObject->getMinLod(); 1791f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_MAX_LOD: return samplerObject->getMaxLod(); 1792f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_COMPARE_MODE: return static_cast<GLfloat>(samplerObject->getCompareMode()); 1793f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLfloat>(samplerObject->getCompareFunc()); 1794f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens default: UNREACHABLE(pname); return 0; 17950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 17970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::getBooleanv(GLenum pname, GLboolean *params) const 17990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 18000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 18010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SHADER_COMPILER: *params = GL_TRUE; break; 18030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_INVERT: *params = mState.sampleCoverageInvert; break; 18040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_WRITEMASK: *params = mState.depthMask; break; 18050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_WRITEMASK: 18060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.colorMaskRed; 18070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.colorMaskGreen; 18080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.colorMaskBlue; 18090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.colorMaskAlpha; 18100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 18110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CULL_FACE: *params = mState.cullFaceEnabled; break; 18120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FILL: *params = mState.polygonOffsetFillEnabled; break; 18130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mState.sampleAlphaToCoverageEnabled; break; 18140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE: *params = mState.sampleCoverageEnabled; break; 18150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_TEST: *params = mState.scissorTestEnabled; break; 18160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_TEST: *params = mState.stencilTestEnabled; break; 18170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_TEST: *params = mState.depthTestEnabled; break; 18180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND: *params = mState.blendEnabled; break; 18190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DITHER: *params = mState.ditherEnabled; break; 18200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PRIMITIVE_RESTART_FIXED_INDEX: *params = mState.primitiveRestartFixedIndexEnabled; break; 18210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RASTERIZER_DISCARD: *params = mState.rasterizerDiscardEnabled; break; 18220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_ACTIVE: 18230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback); 18250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(transformFeedback) 18260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = transformFeedback->isActive(); 18280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 18290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else return false; 18310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_PAUSED: 18330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback); 18350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(transformFeedback) 18360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = transformFeedback->isPaused(); 18380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 18390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else return false; 18410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 18430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 18440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 18470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 18480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::getFloatv(GLenum pname, GLfloat *params) const 18500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 18510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation 18520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // because it is stored as a float, despite the fact that the GL ES 2.0 spec names 18530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // GetIntegerv as its native query function. As it would require conversion in any 18540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // case, this should make no difference to the calling application. 18550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 18560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_WIDTH: *params = mState.lineWidth; break; 18580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_VALUE: *params = mState.sampleCoverageValue; break; 18590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_CLEAR_VALUE: *params = mState.depthClearValue; break; 18600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FACTOR: *params = mState.polygonOffsetFactor; break; 18610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_UNITS: *params = mState.polygonOffsetUnits; break; 18620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_LINE_WIDTH_RANGE: 18630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = ALIASED_LINE_WIDTH_RANGE_MIN; 18640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = ALIASED_LINE_WIDTH_RANGE_MAX; 18650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 18660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_POINT_SIZE_RANGE: 18670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = ALIASED_POINT_SIZE_RANGE_MIN; 18680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = ALIASED_POINT_SIZE_RANGE_MAX; 18690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 18700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_RANGE: 18710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.zNear; 18720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.zFar; 18730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 18740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_CLEAR_VALUE: 18750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.colorClearValue.red; 18760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.colorClearValue.green; 18770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.colorClearValue.blue; 18780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.colorClearValue.alpha; 18790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 18800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_COLOR: 18810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.blendColor.red; 18820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.blendColor.green; 18830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.blendColor.blue; 18840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.blendColor.alpha; 18850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 18860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: 18870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = MAX_TEXTURE_MAX_ANISOTROPY; 18880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 18890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 18900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 18910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 18940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 18950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenstemplate bool Context::getIntegerv<GLint>(GLenum pname, GLint *params) const; 18970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenstemplate bool Context::getIntegerv<GLint64>(GLenum pname, GLint64 *params) const; 18980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenstemplate<typename T> bool Context::getIntegerv(GLenum pname, T *params) const 19000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 19010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation 19020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // because it is stored as a float, despite the fact that the GL ES 2.0 spec names 19030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // GetIntegerv as its native query function. As it would require conversion in any 19040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // case, this should make no difference to the calling application. You may find it in 19050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Context::getFloatv. 19060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 19070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1908b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_VERTEX_ATTRIBS: *params = MAX_VERTEX_ATTRIBS; return true; 1909b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = MAX_VERTEX_UNIFORM_VECTORS; return true; 1910b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_VARYING_VECTORS: *params = MAX_VARYING_VECTORS; return true; 1911b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = MAX_COMBINED_TEXTURE_IMAGE_UNITS; return true; 1912b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = MAX_VERTEX_TEXTURE_IMAGE_UNITS; return true; 1913b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_TEXTURE_IMAGE_UNITS: *params = MAX_TEXTURE_IMAGE_UNITS; return true; 1914b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = MAX_FRAGMENT_UNIFORM_VECTORS; return true; 1915b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_RENDERBUFFER_SIZE: *params = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE; return true; 1916b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_NUM_SHADER_BINARY_FORMATS: *params = 0; return true; 1917b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_SHADER_BINARY_FORMATS: /* no shader binary formats are supported */ return true; 1918b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_ARRAY_BUFFER_BINDING: *params = getArrayBufferName(); return true; 1919b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_ELEMENT_ARRAY_BUFFER_BINDING: *params = getElementArrayBufferName(); return true; 19200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 1921b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE: *params = mState.drawFramebuffer; return true; 1922b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_READ_FRAMEBUFFER_BINDING_ANGLE: *params = mState.readFramebuffer; return true; 1923b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_RENDERBUFFER_BINDING: *params = mState.renderbuffer.name(); return true; 1924b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_CURRENT_PROGRAM: *params = mState.currentProgram; return true; 1925b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_PACK_ALIGNMENT: *params = mState.packAlignment; return true; 1926b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_UNPACK_ALIGNMENT: *params = mState.unpackInfo.alignment; return true; 1927b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_GENERATE_MIPMAP_HINT: *params = mState.generateMipmapHint; return true; 1928b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mState.fragmentShaderDerivativeHint; return true; 1929010a464878f32daed863edee3fc6ad21920d605bAlexis Hetu case GL_TEXTURE_FILTERING_HINT_CHROMIUM: *params = mState.textureFilteringHint; return true; 1930b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_ACTIVE_TEXTURE: *params = (mState.activeSampler + GL_TEXTURE0); return true; 1931b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_FUNC: *params = mState.stencilFunc; return true; 1932b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_REF: *params = mState.stencilRef; return true; 1933b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_VALUE_MASK: *params = sw::clampToSignedInt(mState.stencilMask); return true; 1934b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_BACK_FUNC: *params = mState.stencilBackFunc; return true; 1935b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_BACK_REF: *params = mState.stencilBackRef; return true; 1936b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_BACK_VALUE_MASK: *params = sw::clampToSignedInt(mState.stencilBackMask); return true; 1937b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_FAIL: *params = mState.stencilFail; return true; 1938b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_PASS_DEPTH_FAIL: *params = mState.stencilPassDepthFail; return true; 1939b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_PASS_DEPTH_PASS: *params = mState.stencilPassDepthPass; return true; 1940b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_BACK_FAIL: *params = mState.stencilBackFail; return true; 1941b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_BACK_PASS_DEPTH_FAIL: *params = mState.stencilBackPassDepthFail; return true; 1942b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_BACK_PASS_DEPTH_PASS: *params = mState.stencilBackPassDepthPass; return true; 1943b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_DEPTH_FUNC: *params = mState.depthFunc; return true; 1944b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_BLEND_SRC_RGB: *params = mState.sourceBlendRGB; return true; 1945b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_BLEND_SRC_ALPHA: *params = mState.sourceBlendAlpha; return true; 1946b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_BLEND_DST_RGB: *params = mState.destBlendRGB; return true; 1947b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_BLEND_DST_ALPHA: *params = mState.destBlendAlpha; return true; 1948b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_BLEND_EQUATION_RGB: *params = mState.blendEquationRGB; return true; 1949b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_BLEND_EQUATION_ALPHA: *params = mState.blendEquationAlpha; return true; 1950b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_WRITEMASK: *params = sw::clampToSignedInt(mState.stencilWritemask); return true; 1951b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_BACK_WRITEMASK: *params = sw::clampToSignedInt(mState.stencilBackWritemask); return true; 1952b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_STENCIL_CLEAR_VALUE: *params = mState.stencilClearValue; return true; 1953b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_SUBPIXEL_BITS: *params = 4; return true; 1954b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_TEXTURE_SIZE: *params = IMPLEMENTATION_MAX_TEXTURE_SIZE; return true; 1955b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_CUBE_MAP_TEXTURE_SIZE: *params = IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE; return true; 1956b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_NUM_COMPRESSED_TEXTURE_FORMATS: *params = NUM_COMPRESSED_TEXTURE_FORMATS; return true; 1957b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_SAMPLES_ANGLE: *params = IMPLEMENTATION_MAX_SAMPLES; return true; 19580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_BUFFERS: 19590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLES: 19600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 19620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int width, height, samples; 19630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(framebuffer->completeness(width, height, samples) == GL_FRAMEBUFFER_COMPLETE) 19650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 19670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_BUFFERS: 19690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(samples > 1) 19700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 1; 19720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 19740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 19760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 19780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLES: 19790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = samples; 19800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 19810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 19840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 19860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1988b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 19890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_TYPE: 19900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getReadFramebuffer(); 19920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = framebuffer->getImplementationColorReadType(); 19930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1994b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 19950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_FORMAT: 19960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getReadFramebuffer(); 19980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = framebuffer->getImplementationColorReadFormat(); 19990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2000b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 20010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VIEWPORT_DIMS: 20020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int maxDimension = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE; 20040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = maxDimension; 20050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = maxDimension; 20060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2007b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 20080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COMPRESSED_TEXTURE_FORMATS: 20090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < NUM_COMPRESSED_TEXTURE_FORMATS; i++) 20110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[i] = compressedTextureFormats[i]; 20130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2015b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 20160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VIEWPORT: 20170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.viewportX; 20180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.viewportY; 20190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.viewportWidth; 20200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.viewportHeight; 2021b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 20220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_BOX: 20230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.scissorX; 20240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.scissorY; 20250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.scissorWidth; 20260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.scissorHeight; 2027b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2028b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_CULL_FACE_MODE: *params = mState.cullMode; return true; 2029b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_FRONT_FACE: *params = mState.frontFace; return true; 20300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RED_BITS: 20310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GREEN_BITS: 20320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLUE_BITS: 20330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALPHA_BITS: 20340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 20360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *colorbuffer = framebuffer->getColorbuffer(0); 20370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(colorbuffer) 20390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 20410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2042b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_RED_BITS: *params = colorbuffer->getRedSize(); return true; 2043b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); return true; 2044b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); return true; 2045b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); return true; 20460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 20490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 20510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2053b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 20540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_BITS: 20550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 20570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *depthbuffer = framebuffer->getDepthbuffer(); 20580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(depthbuffer) 20600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = depthbuffer->getDepthSize(); 20620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 20640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 20660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2068b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 20690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BITS: 20700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 20720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *stencilbuffer = framebuffer->getStencilbuffer(); 20730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(stencilbuffer) 20750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = stencilbuffer->getStencilSize(); 20770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 20790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 20810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2083b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 20840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_2D: 20850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1) 20860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens error(GL_INVALID_OPERATION); 20880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 20890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = mState.samplerTexture[TEXTURE_2D][mState.activeSampler].name(); 2092b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 20930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_CUBE_MAP: 20940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1) 20950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens error(GL_INVALID_OPERATION); 20970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 20980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = mState.samplerTexture[TEXTURE_CUBE][mState.activeSampler].name(); 2101b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 21020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_EXTERNAL_OES: 21030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1) 21040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens error(GL_INVALID_OPERATION); 21060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 21070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = mState.samplerTexture[TEXTURE_EXTERNAL][mState.activeSampler].name(); 2110b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 21110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_3D_OES: 21120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1) 21130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens error(GL_INVALID_OPERATION); 21150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 21160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = mState.samplerTexture[TEXTURE_3D][mState.activeSampler].name(); 2119b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 21200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER0: 21210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER1: 21220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER2: 21230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER3: 21240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER4: 21250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER5: 21260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER6: 21270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER7: 21280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER8: 21290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER9: 21300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER10: 21310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER11: 21320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER12: 21330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER13: 21340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER14: 21350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER15: 2136b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu if((pname - GL_DRAW_BUFFER0) < MAX_DRAW_BUFFERS) 21370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2138b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = getDrawFramebuffer()->getDrawBuffer(pname - GL_DRAW_BUFFER0); 21390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 21410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 21430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2144b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 21450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_DRAW_BUFFERS: 21460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = MAX_DRAW_BUFFERS; 2147b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 21483053bf0a2032ee09b9ee5a2ecea3670afc8fb9d0Alexis Hetu case GL_MAX_COLOR_ATTACHMENTS: // Note: MAX_COLOR_ATTACHMENTS_EXT added by GL_EXT_draw_buffers 21493053bf0a2032ee09b9ee5a2ecea3670afc8fb9d0Alexis Hetu *params = MAX_COLOR_ATTACHMENTS; 21503053bf0a2032ee09b9ee5a2ecea3670afc8fb9d0Alexis Hetu return true; 2151b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu default: 21520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 2153b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu } 2154b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu 2155b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu if(clientVersion >= 3) 2156b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu { 2157b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu switch(pname) 2158ce57a9a5b14a0effc691200145587c1ed8b2660dAlexis Hetu { 2159b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_TEXTURE_BINDING_2D_ARRAY: 2160b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1) 2161b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu { 2162b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu error(GL_INVALID_OPERATION); 2163b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return false; 2164b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu } 2165b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu 2166b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = mState.samplerTexture[TEXTURE_2D_ARRAY][mState.activeSampler].name(); 2167b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2168b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_COPY_READ_BUFFER_BINDING: 2169b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = mState.copyReadBuffer.name(); 2170b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2171b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_COPY_WRITE_BUFFER_BINDING: 2172b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = mState.copyWriteBuffer.name(); 2173b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2174b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAJOR_VERSION: 2175b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = clientVersion; 2176b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2177b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_3D_TEXTURE_SIZE: 2178b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = IMPLEMENTATION_MAX_TEXTURE_SIZE; 2179b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2180b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_ARRAY_TEXTURE_LAYERS: 2181b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = IMPLEMENTATION_MAX_TEXTURE_SIZE; 2182b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2183b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: 2184b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS; 2185b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2186b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_COMBINED_UNIFORM_BLOCKS: 2187b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_VERTEX_UNIFORM_BLOCKS + MAX_FRAGMENT_UNIFORM_BLOCKS; 2188b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2189b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: 2190b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS; 2191b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2192b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_ELEMENT_INDEX: 2193b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_ELEMENT_INDEX; 2194b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2195b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_ELEMENTS_INDICES: 2196b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_ELEMENTS_INDICES; 2197b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2198b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_ELEMENTS_VERTICES: 2199b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_ELEMENTS_VERTICES; 2200b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2201b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_FRAGMENT_INPUT_COMPONENTS: 2202b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_FRAGMENT_INPUT_VECTORS * 4; 2203b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2204b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_FRAGMENT_UNIFORM_BLOCKS: 2205b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_FRAGMENT_UNIFORM_BLOCKS; 2206b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2207b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: 2208b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_FRAGMENT_UNIFORM_COMPONENTS; 2209b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2210b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_PROGRAM_TEXEL_OFFSET: 22110e22d3ac1342803e4f6e99dee0b1bc7638f0acdcAlexis Hetu // Note: SwiftShader has no actual texel offset limit, so this limit can be modified if required. 22120e22d3ac1342803e4f6e99dee0b1bc7638f0acdcAlexis Hetu // In any case, any behavior outside the specified range is valid since the spec mentions: 22133cbeac56e8291c9eb584aecfdf4c9e4e3883473aNicolas Capens // (see OpenGL ES 3.0.5, 3.8.10.1 Scale Factor and Level of Detail, p.153) 22143cbeac56e8291c9eb584aecfdf4c9e4e3883473aNicolas Capens // "If any of the offset values are outside the range of the implementation-defined values 22150e22d3ac1342803e4f6e99dee0b1bc7638f0acdcAlexis Hetu // MIN_PROGRAM_TEXEL_OFFSET and MAX_PROGRAM_TEXEL_OFFSET, results of the texture lookup are 22160e22d3ac1342803e4f6e99dee0b1bc7638f0acdcAlexis Hetu // undefined." 2217b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_PROGRAM_TEXEL_OFFSET; 2218b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2219b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_SERVER_WAIT_TIMEOUT: 2220ce57a9a5b14a0effc691200145587c1ed8b2660dAlexis Hetu *params = 0; 2221b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2222b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_TEXTURE_LOD_BIAS: 22230e22d3ac1342803e4f6e99dee0b1bc7638f0acdcAlexis Hetu *params = MAX_TEXTURE_LOD_BIAS; 2224b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2225b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: 2226b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = sw::MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS; 2227b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2228b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: 2229b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; 2230b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2231b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: 2232b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = sw::MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS; 2233b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2234b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_UNIFORM_BLOCK_SIZE: 2235b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_UNIFORM_BLOCK_SIZE; 2236b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2237b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_UNIFORM_BUFFER_BINDINGS: 2238b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_UNIFORM_BUFFER_BINDINGS; 2239b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2240b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_VARYING_COMPONENTS: 224122be88e5d0cde4ffbcc076cbfcd57aa629ebb9ccAlexis Hetu *params = MAX_VARYING_VECTORS * 4; 2242b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2243b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_VERTEX_OUTPUT_COMPONENTS: 2244b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_VERTEX_OUTPUT_VECTORS * 4; 2245b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2246b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_VERTEX_UNIFORM_BLOCKS: 2247b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_VERTEX_UNIFORM_BLOCKS; 2248b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2249b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MAX_VERTEX_UNIFORM_COMPONENTS: 2250b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MAX_VERTEX_UNIFORM_COMPONENTS; 2251b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2252b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MIN_PROGRAM_TEXEL_OFFSET: 22530e22d3ac1342803e4f6e99dee0b1bc7638f0acdcAlexis Hetu // Note: SwiftShader has no actual texel offset limit, so this limit can be modified if required. 22540e22d3ac1342803e4f6e99dee0b1bc7638f0acdcAlexis Hetu // In any case, any behavior outside the specified range is valid since the spec mentions: 22553cbeac56e8291c9eb584aecfdf4c9e4e3883473aNicolas Capens // (see OpenGL ES 3.0.5, 3.8.10.1 Scale Factor and Level of Detail, p.153) 22563cbeac56e8291c9eb584aecfdf4c9e4e3883473aNicolas Capens // "If any of the offset values are outside the range of the implementation-defined values 22570e22d3ac1342803e4f6e99dee0b1bc7638f0acdcAlexis Hetu // MIN_PROGRAM_TEXEL_OFFSET and MAX_PROGRAM_TEXEL_OFFSET, results of the texture lookup are 22580e22d3ac1342803e4f6e99dee0b1bc7638f0acdcAlexis Hetu // undefined." 2259b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = MIN_PROGRAM_TEXEL_OFFSET; 2260b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2261b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_MINOR_VERSION: 2262b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = 0; 2263b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2264b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_NUM_EXTENSIONS: 2265b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu GLuint numExtensions; 2266b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu getExtensions(0, &numExtensions); 2267b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = numExtensions; 2268b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2269b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_NUM_PROGRAM_BINARY_FORMATS: 2270b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = NUM_PROGRAM_BINARY_FORMATS; 2271b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2272b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_PACK_ROW_LENGTH: 2273b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = mState.packRowLength; 2274b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2275b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_PACK_SKIP_PIXELS: 2276b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = mState.packSkipPixels; 2277b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2278b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_PACK_SKIP_ROWS: 2279b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = mState.packSkipRows; 2280b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2281b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_PIXEL_PACK_BUFFER_BINDING: 22820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = mState.pixelPackBuffer.name(); 2283b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2284b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_PIXEL_UNPACK_BUFFER_BINDING: 22850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = mState.pixelUnpackBuffer.name(); 2286b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2287b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_PROGRAM_BINARY_FORMATS: 2288b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu // Since NUM_PROGRAM_BINARY_FORMATS is 0, the input 2289b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu // should be a 0 sized array, so don't write to params 2290b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2291b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_READ_BUFFER: 2292b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = getReadFramebuffer()->getReadBuffer(); 2293b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2294b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_SAMPLER_BINDING: 2295b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = mState.sampler[mState.activeSampler].name(); 2296b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2297b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_UNIFORM_BUFFER_BINDING: 22980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = mState.genericUniformBuffer.name(); 2299b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2300b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: 2301b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = UNIFORM_BUFFER_OFFSET_ALIGNMENT; 2302b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2303b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_UNIFORM_BUFFER_SIZE: 230405c32b9b014dd9536782fcec3ea96168a97e2e28Alexis Hetu *params = static_cast<T>(mState.genericUniformBuffer->size()); 2305b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2306b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_UNIFORM_BUFFER_START: 2307bffe803cd29475ca68ab1fea8a04276726fa83b7Alexis Hetu *params = static_cast<T>(mState.genericUniformBuffer->offset()); 2308b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2309b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_UNPACK_IMAGE_HEIGHT: 2310b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = mState.unpackInfo.imageHeight; 2311b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2312b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_UNPACK_ROW_LENGTH: 2313b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = mState.unpackInfo.rowLength; 2314b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2315b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_UNPACK_SKIP_IMAGES: 2316b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = mState.unpackInfo.skipImages; 2317b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2318b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_UNPACK_SKIP_PIXELS: 2319b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = mState.unpackInfo.skipPixels; 2320b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2321b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_UNPACK_SKIP_ROWS: 2322b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = mState.unpackInfo.skipRows; 2323b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2324b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_VERTEX_ARRAY_BINDING: 2325b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = getCurrentVertexArray()->name; 2326b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2327b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_TRANSFORM_FEEDBACK_BINDING: 23280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2329b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback); 2330b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu if(transformFeedback) 2331b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu { 2332b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = transformFeedback->name; 2333b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu } 2334b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu else 2335b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu { 2336b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return false; 2337b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu } 23380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2339b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2340b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 23410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2342b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback); 2343b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu if(transformFeedback) 2344b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu { 2345b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu *params = transformFeedback->getGenericBufferName(); 2346b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu } 2347b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu else 2348b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu { 2349b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return false; 2350b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu } 23510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2352b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return true; 2353b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu default: 2354b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu break; 23550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2358b7afead19ffb060c4a88123dcf066ee3726a65ecAlexis Hetu return false; 23590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenstemplate bool Context::getTransformFeedbackiv<GLint>(GLuint index, GLenum pname, GLint *param) const; 23620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenstemplate bool Context::getTransformFeedbackiv<GLint64>(GLuint index, GLenum pname, GLint64 *param) const; 23630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenstemplate<typename T> bool Context::getTransformFeedbackiv(GLuint index, GLenum pname, T *param) const 23650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback); 23670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!transformFeedback) 23680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 23700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 23730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_BINDING: // GLint, initially 0 23750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *param = transformFeedback->name; 23760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_ACTIVE: // boolean, initially GL_FALSE 23780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *param = transformFeedback->isActive(); 23790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: // name, initially 0 23810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *param = transformFeedback->getBufferName(index); 23820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_PAUSED: // boolean, initially GL_FALSE 23840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *param = transformFeedback->isPaused(); 23850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: // indexed[n] 64-bit integer, initially 0 23870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(transformFeedback->getBuffer(index)) 23880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *param = transformFeedback->getSize(index); 23900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else return false; 23930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_BUFFER_START: // indexed[n] 64-bit integer, initially 0 23940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(transformFeedback->getBuffer(index)) 23950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *param = transformFeedback->getOffset(index); 23970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else return false; 24000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 24010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 24020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 24050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 24060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenstemplate bool Context::getUniformBufferiv<GLint>(GLuint index, GLenum pname, GLint *param) const; 24080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenstemplate bool Context::getUniformBufferiv<GLint64>(GLuint index, GLenum pname, GLint64 *param) const; 24090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenstemplate<typename T> bool Context::getUniformBufferiv(GLuint index, GLenum pname, T *param) const 24110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 241248280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu switch(pname) 241348280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu { 241448280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu case GL_UNIFORM_BUFFER_BINDING: 241548280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu case GL_UNIFORM_BUFFER_SIZE: 241648280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu case GL_UNIFORM_BUFFER_START: 241748280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu if(index >= MAX_UNIFORM_BUFFER_BINDINGS) 241848280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu { 241948280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu return error(GL_INVALID_VALUE, true); 242048280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu } 242148280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu break; 242248280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu default: 242348280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu break; 242448280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu } 242548280a4e92c9960cbb501e0ded86f662a03f9ad2Alexis Hetu 24260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const BufferBinding& uniformBuffer = mState.uniformBuffers[index]; 24270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 24290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNIFORM_BUFFER_BINDING: // name, initially 0 24310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *param = uniformBuffer.get().name(); 24320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 24330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNIFORM_BUFFER_SIZE: // indexed[n] 64-bit integer, initially 0 24340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *param = uniformBuffer.getSize(); 24350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 24360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNIFORM_BUFFER_START: // indexed[n] 64-bit integer, initially 0 24370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *param = uniformBuffer.getOffset(); 24380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 24390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 24400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 24410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 24440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 24450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams) const 24470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 24480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation 24490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due 24500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // to the fact that it is stored internally as a float, and so would require conversion 24510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // if returned from Context::getIntegerv. Since this conversion is already implemented 24520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we 24530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling 24540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // application. 24550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 24560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COMPRESSED_TEXTURE_FORMATS: 24580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_INT; 24600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = NUM_COMPRESSED_TEXTURE_FORMATS; 24610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 24630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SHADER_BINARY_FORMATS: 24640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_INT; 24660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 0; 24670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 24690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_ATTRIBS: 24700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_UNIFORM_VECTORS: 24710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VARYING_VECTORS: 24720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: 24730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: 24740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_IMAGE_UNITS: 24750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_FRAGMENT_UNIFORM_VECTORS: 24760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_RENDERBUFFER_SIZE: 24770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NUM_SHADER_BINARY_FORMATS: 24780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NUM_COMPRESSED_TEXTURE_FORMATS: 24790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ARRAY_BUFFER_BINDING: 24800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRAMEBUFFER_BINDING: // Same as GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 24810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_READ_FRAMEBUFFER_BINDING_ANGLE: 24820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RENDERBUFFER_BINDING: 24830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CURRENT_PROGRAM: 24840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PACK_ALIGNMENT: 24850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNPACK_ALIGNMENT: 24860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GENERATE_MIPMAP_HINT: 24870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: 2488010a464878f32daed863edee3fc6ad21920d605bAlexis Hetu case GL_TEXTURE_FILTERING_HINT_CHROMIUM: 24890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RED_BITS: 24900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GREEN_BITS: 24910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLUE_BITS: 24920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALPHA_BITS: 24930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_BITS: 24940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BITS: 24950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ELEMENT_ARRAY_BUFFER_BINDING: 24960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CULL_FACE_MODE: 24970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRONT_FACE: 24980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ACTIVE_TEXTURE: 24990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_FUNC: 25000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_VALUE_MASK: 25010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_REF: 25020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_FAIL: 25030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_PASS_DEPTH_FAIL: 25040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_PASS_DEPTH_PASS: 25050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_FUNC: 25060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_VALUE_MASK: 25070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_REF: 25080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_FAIL: 25090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_PASS_DEPTH_FAIL: 25100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_PASS_DEPTH_PASS: 25110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_FUNC: 25120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_SRC_RGB: 25130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_SRC_ALPHA: 25140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_DST_RGB: 25150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_DST_ALPHA: 25160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_EQUATION_RGB: 25170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_EQUATION_ALPHA: 25180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_WRITEMASK: 25190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_WRITEMASK: 25200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_CLEAR_VALUE: 25210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SUBPIXEL_BITS: 25220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_SIZE: 25230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_CUBE_MAP_TEXTURE_SIZE: 25240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_BUFFERS: 25250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLES: 25260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_TYPE: 25270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_FORMAT: 25280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_2D: 25290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_CUBE_MAP: 25300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_EXTERNAL_OES: 25310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_3D_OES: 25320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COPY_READ_BUFFER_BINDING: 25330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COPY_WRITE_BUFFER_BINDING: 25340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER0: 25350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER1: 25360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER2: 25370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER3: 25380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER4: 25390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER5: 25400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER6: 25410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER7: 25420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER8: 25430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER9: 25440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER10: 25450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER11: 25460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER12: 25470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER13: 25480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER14: 25490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_BUFFER15: 25500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAJOR_VERSION: 25510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_3D_TEXTURE_SIZE: 25520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_ARRAY_TEXTURE_LAYERS: 25530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_COLOR_ATTACHMENTS: 25540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: 25550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_COMBINED_UNIFORM_BLOCKS: 25560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: 25570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_DRAW_BUFFERS: 25580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_ELEMENT_INDEX: 25590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_ELEMENTS_INDICES: 25600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_ELEMENTS_VERTICES: 25610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_FRAGMENT_INPUT_COMPONENTS: 25620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_FRAGMENT_UNIFORM_BLOCKS: 25630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: 25640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_PROGRAM_TEXEL_OFFSET: 25650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_SERVER_WAIT_TIMEOUT: 25660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_LOD_BIAS: 25670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: 25680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: 25690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: 25700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_UNIFORM_BLOCK_SIZE: 25710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_UNIFORM_BUFFER_BINDINGS: 25720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VARYING_COMPONENTS: 25730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_OUTPUT_COMPONENTS: 25740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_UNIFORM_BLOCKS: 25750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_UNIFORM_COMPONENTS: 25760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MIN_PROGRAM_TEXEL_OFFSET: 25770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MINOR_VERSION: 25780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NUM_EXTENSIONS: 25790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NUM_PROGRAM_BINARY_FORMATS: 25800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PACK_ROW_LENGTH: 25810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PACK_SKIP_PIXELS: 25820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PACK_SKIP_ROWS: 25830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PIXEL_PACK_BUFFER_BINDING: 25840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PIXEL_UNPACK_BUFFER_BINDING: 25850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PROGRAM_BINARY_FORMATS: 25860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_READ_BUFFER: 25870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLER_BINDING: 25880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_2D_ARRAY: 25890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNIFORM_BUFFER_BINDING: 25900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: 25910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNIFORM_BUFFER_SIZE: 25920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNIFORM_BUFFER_START: 25930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNPACK_IMAGE_HEIGHT: 25940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNPACK_ROW_LENGTH: 25950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNPACK_SKIP_IMAGES: 25960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNPACK_SKIP_PIXELS: 25970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNPACK_SKIP_ROWS: 25980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VERTEX_ARRAY_BINDING: 25990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_BINDING: 26000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 26010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_INT; 26030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 1; 26040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_SAMPLES_ANGLE: 26070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_INT; 26090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 1; 26100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VIEWPORT_DIMS: 26130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_INT; 26150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 2; 26160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VIEWPORT: 26190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_BOX: 26200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_INT; 26220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 4; 26230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SHADER_COMPILER: 26260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_INVERT: 26270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_WRITEMASK: 26280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled, 26290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries. 26300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as bool-natural 26310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE: 26320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_TEST: 26330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_TEST: 26340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_TEST: 26350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND: 26360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DITHER: 26370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PRIMITIVE_RESTART_FIXED_INDEX: 26380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RASTERIZER_DISCARD: 26390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_ACTIVE: 26400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRANSFORM_FEEDBACK_PAUSED: 26410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_BOOL; 26430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 1; 26440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_WRITEMASK: 26470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_BOOL; 26490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 4; 26500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FACTOR: 26530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_UNITS: 26540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_VALUE: 26550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_CLEAR_VALUE: 26560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_WIDTH: 26570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_FLOAT; 26590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 1; 26600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_LINE_WIDTH_RANGE: 26630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_POINT_SIZE_RANGE: 26640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_RANGE: 26650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_FLOAT; 26670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 2; 26680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_CLEAR_VALUE: 26710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_COLOR: 26720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_FLOAT; 26740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 4; 26750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: 26780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_FLOAT; 26790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 1; 26800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 26820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 26830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 26860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 26870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyScissor(int width, int height) 26890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 26900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.scissorTestEnabled) 26910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Rect scissor = { mState.scissorX, mState.scissorY, mState.scissorX + mState.scissorWidth, mState.scissorY + mState.scissorHeight }; 26930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens scissor.clip(0, 0, width, height); 26940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setScissorRect(scissor); 26960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setScissorEnable(true); 26970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 26990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setScissorEnable(false); 27010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 27030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Applies the render target surface, depth stencil surface, viewport rectangle and scissor rectangle 27050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::applyRenderTarget() 27060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 27070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 27080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int width, height, samples; 27090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!framebuffer || framebuffer->completeness(width, height, samples) != GL_FRAMEBUFFER_COMPLETE) 27110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_FRAMEBUFFER_OPERATION, false); 27130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_DRAW_BUFFERS; i++) 27160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(framebuffer->getDrawBuffer(i) != GL_NONE) 27180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *renderTarget = framebuffer->getRenderTarget(i); 27200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setRenderTarget(i, renderTarget); 27210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(renderTarget) renderTarget->release(); 27220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 27240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setRenderTarget(i, nullptr); 27260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *depthBuffer = framebuffer->getDepthBuffer(); 27300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBuffer(depthBuffer); 27310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(depthBuffer) depthBuffer->release(); 27320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *stencilBuffer = framebuffer->getStencilBuffer(); 27340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilBuffer(stencilBuffer); 27350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(stencilBuffer) stencilBuffer->release(); 27360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Viewport viewport; 27380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float zNear = clamp01(mState.zNear); 27390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float zFar = clamp01(mState.zFar); 27400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.x0 = mState.viewportX; 27420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.y0 = mState.viewportY; 27430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.width = mState.viewportWidth; 27440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.height = mState.viewportHeight; 27450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.minZ = zNear; 27460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.maxZ = zFar; 27470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setViewport(viewport); 27490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyScissor(width, height); 27510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *program = getCurrentProgram(); 27530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(program) 27550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLfloat nearFarDiff[3] = {zNear, zFar, zFar - zNear}; 27570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens program->setUniform1fv(program->getUniformLocation("gl_DepthRange.near"), 1, &nearFarDiff[0]); 27580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens program->setUniform1fv(program->getUniformLocation("gl_DepthRange.far"), 1, &nearFarDiff[1]); 27590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens program->setUniform1fv(program->getUniformLocation("gl_DepthRange.diff"), 1, &nearFarDiff[2]); 27600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 27630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 27640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Applies the fixed-function state (culling, depth test, alpha blending, stenciling, etc) 27660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyState(GLenum drawMode) 27670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 27680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 27690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.cullFaceEnabled) 27710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setCullMode(es2sw::ConvertCullMode(mState.cullMode, mState.frontFace)); 27730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 27750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setCullMode(sw::CULL_NONE); 27770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mDepthStateDirty) 27800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthTestEnabled) 27820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBufferEnable(true); 27840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthCompare(es2sw::ConvertDepthComparison(mState.depthFunc)); 27850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 27870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBufferEnable(false); 27890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDepthStateDirty = false; 27920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mBlendStateDirty) 27950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.blendEnabled) 27970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAlphaBlendEnable(true); 27990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSeparateAlphaBlendEnable(true); 28000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setBlendConstant(es2sw::ConvertColor(mState.blendColor)); 28020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSourceBlendFactor(es2sw::ConvertBlendFunc(mState.sourceBlendRGB)); 28040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDestBlendFactor(es2sw::ConvertBlendFunc(mState.destBlendRGB)); 28050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setBlendOperation(es2sw::ConvertBlendOp(mState.blendEquationRGB)); 28060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSourceBlendFactorAlpha(es2sw::ConvertBlendFunc(mState.sourceBlendAlpha)); 28080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDestBlendFactorAlpha(es2sw::ConvertBlendFunc(mState.destBlendAlpha)); 28090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setBlendOperationAlpha(es2sw::ConvertBlendOp(mState.blendEquationAlpha)); 28100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 28120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAlphaBlendEnable(false); 28140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = false; 28170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mStencilStateDirty || mFrontFaceDirty) 28200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilTestEnabled && framebuffer->hasStencil()) 28220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilEnable(true); 28240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTwoSidedStencil(true); 28250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // get the maximum size of the stencil ref 28270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *stencilbuffer = framebuffer->getStencilbuffer(); 28280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLuint maxStencil = (1 << stencilbuffer->getStencilSize()) - 1; 28290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.frontFace == GL_CCW) 28310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilWriteMask(mState.stencilWritemask); 28330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilCompare(es2sw::ConvertStencilComparison(mState.stencilFunc)); 28340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilReference((mState.stencilRef < (GLint)maxStencil) ? mState.stencilRef : maxStencil); 28360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilMask(mState.stencilMask); 28370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilFailOperation(es2sw::ConvertStencilOp(mState.stencilFail)); 28390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilZFailOperation(es2sw::ConvertStencilOp(mState.stencilPassDepthFail)); 28400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilPassOperation(es2sw::ConvertStencilOp(mState.stencilPassDepthPass)); 28410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilWriteMaskCCW(mState.stencilBackWritemask); 28430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilCompareCCW(es2sw::ConvertStencilComparison(mState.stencilBackFunc)); 28440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilReferenceCCW((mState.stencilBackRef < (GLint)maxStencil) ? mState.stencilBackRef : maxStencil); 28460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilMaskCCW(mState.stencilBackMask); 28470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilFailOperationCCW(es2sw::ConvertStencilOp(mState.stencilBackFail)); 28490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilZFailOperationCCW(es2sw::ConvertStencilOp(mState.stencilBackPassDepthFail)); 28500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilPassOperationCCW(es2sw::ConvertStencilOp(mState.stencilBackPassDepthPass)); 28510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 28530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilWriteMaskCCW(mState.stencilWritemask); 28550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilCompareCCW(es2sw::ConvertStencilComparison(mState.stencilFunc)); 28560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilReferenceCCW((mState.stencilRef < (GLint)maxStencil) ? mState.stencilRef : maxStencil); 28580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilMaskCCW(mState.stencilMask); 28590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilFailOperationCCW(es2sw::ConvertStencilOp(mState.stencilFail)); 28610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilZFailOperationCCW(es2sw::ConvertStencilOp(mState.stencilPassDepthFail)); 28620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilPassOperationCCW(es2sw::ConvertStencilOp(mState.stencilPassDepthPass)); 28630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilWriteMask(mState.stencilBackWritemask); 28650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilCompare(es2sw::ConvertStencilComparison(mState.stencilBackFunc)); 28660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilReference((mState.stencilBackRef < (GLint)maxStencil) ? mState.stencilBackRef : maxStencil); 28680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilMask(mState.stencilBackMask); 28690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilFailOperation(es2sw::ConvertStencilOp(mState.stencilBackFail)); 28710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilZFailOperation(es2sw::ConvertStencilOp(mState.stencilBackPassDepthFail)); 28720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilPassOperation(es2sw::ConvertStencilOp(mState.stencilBackPassDepthPass)); 28730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 28760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilEnable(false); 28780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = false; 28810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFrontFaceDirty = false; 28820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mMaskStateDirty) 28850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_DRAW_BUFFERS; i++) 28870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setColorWriteMask(i, es2sw::ConvertColorMask(mState.colorMaskRed, mState.colorMaskGreen, mState.colorMaskBlue, mState.colorMaskAlpha)); 28890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthWriteEnable(mState.depthMask); 28920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMaskStateDirty = false; 28940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mPolygonOffsetStateDirty) 28970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.polygonOffsetFillEnabled) 28990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *depthbuffer = framebuffer->getDepthbuffer(); 29010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(depthbuffer) 29020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSlopeDepthBias(mState.polygonOffsetFactor); 29043cbeac56e8291c9eb584aecfdf4c9e4e3883473aNicolas Capens float depthBias = ldexp(mState.polygonOffsetUnits, -23); // We use 32-bit floating-point for all depth formats, with 23 mantissa bits. 29050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBias(depthBias); 29060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 29090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSlopeDepthBias(0); 29110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBias(0); 29120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mPolygonOffsetStateDirty = false; 29150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mSampleStateDirty) 29180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleAlphaToCoverageEnabled) 29200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTransparencyAntialiasing(sw::TRANSPARENCY_ALPHA_TO_COVERAGE); 29220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 29240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTransparencyAntialiasing(sw::TRANSPARENCY_NONE); 29260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageEnabled) 29290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int mask = 0; 29310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageValue != 0) 29320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int width, height, samples; 29340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens framebuffer->completeness(width, height, samples); 29350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float threshold = 0.5f; 29370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < samples; i++) 29390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mask <<= 1; 29410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if((i + 1) * mState.sampleCoverageValue >= threshold) 29430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens threshold += 1.0f; 29450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mask |= 1; 29460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageInvert) 29510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mask = ~mask; 29530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMultiSampleMask(mask); 29560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 29580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMultiSampleMask(0xFFFFFFFF); 29600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = false; 29630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mDitherStateDirty) 29660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // UNIMPLEMENTED(); // FIXME 29680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDitherStateDirty = false; 29700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setRasterizerDiscard(mState.rasterizerDiscardEnabled); 29730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 29740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29750bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLenum Context::applyVertexBuffer(GLint base, GLint first, GLsizei count, GLsizei instanceId) 29760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 29770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS]; 29780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum err = mVertexDataManager->prepareVertexData(first, count, attributes, instanceId); 29800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err != GL_NO_ERROR) 29810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return err; 29830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *program = getCurrentProgram(); 29860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->resetInputStreams(false); 29880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_VERTEX_ATTRIBS; i++) 29900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(program->getAttributeStream(i) == -1) 29920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens continue; 29940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Resource *resource = attributes[i].vertexBuffer; 29970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const void *buffer = (char*)resource->data() + attributes[i].offset; 29980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int stride = attributes[i].stride; 30000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens buffer = (char*)buffer + stride * base; 30020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Stream attribute(resource, buffer, stride); 30040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens attribute.type = attributes[i].type; 30060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens attribute.count = attributes[i].count; 30070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens attribute.normalized = attributes[i].normalized; 30080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int stream = program->getAttributeStream(i); 30100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setInputStream(stream, attribute); 30110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_NO_ERROR; 30140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Applies the indices and element array bindings 30170bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLenum Context::applyIndexBuffer(const void *indices, GLuint start, GLuint end, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo) 30180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 301974b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu GLenum err = mIndexDataManager->prepareIndexData(mode, type, start, end, count, getCurrentVertexArray()->getElementArrayBuffer(), indices, indexInfo, isPrimitiveRestartFixedIndexEnabled()); 30200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err == GL_NO_ERROR) 30220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setIndexBuffer(indexInfo->indexBuffer); 30240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return err; 30270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Applies the shaders and shader constants 30300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyShaders() 30310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *programObject = getCurrentProgram(); 30330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::VertexShader *vertexShader = programObject->getVertexShader(); 30340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::PixelShader *pixelShader = programObject->getPixelShader(); 30350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setVertexShader(vertexShader); 30370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setPixelShader(pixelShader); 30380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(programObject->getSerial() != mAppliedProgramSerial) 30400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens programObject->dirtyAllUniforms(); 30420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mAppliedProgramSerial = programObject->getSerial(); 30430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30451fd3b280be7489a0cdeba638fbbda5e96ebbf049Ben Vanik programObject->applyTransformFeedback(device, getTransformFeedback()); 30461fd3b280be7489a0cdeba638fbbda5e96ebbf049Ben Vanik programObject->applyUniformBuffers(device, mState.uniformBuffers); 30471fd3b280be7489a0cdeba638fbbda5e96ebbf049Ben Vanik programObject->applyUniforms(device); 30480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyTextures() 30510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTextures(sw::SAMPLER_PIXEL); 30530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTextures(sw::SAMPLER_VERTEX); 30540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyTextures(sw::SamplerType samplerType) 30570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *programObject = getCurrentProgram(); 30590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int samplerCount = (samplerType == sw::SAMPLER_PIXEL) ? MAX_TEXTURE_IMAGE_UNITS : MAX_VERTEX_TEXTURE_IMAGE_UNITS; // Range of samplers of given sampler type 30610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int samplerIndex = 0; samplerIndex < samplerCount; samplerIndex++) 30630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int textureUnit = programObject->getSamplerMapping(samplerType, samplerIndex); // OpenGL texture image unit index 30650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(textureUnit != -1) 30670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TextureType textureType = programObject->getSamplerTextureType(samplerType, samplerIndex); 30690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Texture *texture = getSamplerTexture(textureUnit, textureType); 30710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(texture->isSamplerComplete()) 30730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3074f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens GLenum wrapS, wrapT, wrapR, minFilter, magFilter, compFunc, compMode; 3075112d81f17f6bfa0733bbd7369679b05e3004bdd7Alexis Hetu GLfloat minLOD, maxLOD; 30760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Sampler *samplerObject = mState.sampler[textureUnit]; 30780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(samplerObject) 30790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens wrapS = samplerObject->getWrapS(); 30810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens wrapT = samplerObject->getWrapT(); 30820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens wrapR = samplerObject->getWrapR(); 30830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens minFilter = samplerObject->getMinFilter(); 30840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens magFilter = samplerObject->getMagFilter(); 3085112d81f17f6bfa0733bbd7369679b05e3004bdd7Alexis Hetu minLOD = samplerObject->getMinLod(); 3086112d81f17f6bfa0733bbd7369679b05e3004bdd7Alexis Hetu maxLOD = samplerObject->getMaxLod(); 3087f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens compFunc = samplerObject->getCompareFunc(); 3088f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens compMode = samplerObject->getCompareMode(); 30890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 30910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens wrapS = texture->getWrapS(); 30930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens wrapT = texture->getWrapT(); 30940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens wrapR = texture->getWrapR(); 30950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens minFilter = texture->getMinFilter(); 30960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens magFilter = texture->getMagFilter(); 3097112d81f17f6bfa0733bbd7369679b05e3004bdd7Alexis Hetu minLOD = texture->getMinLOD(); 3098112d81f17f6bfa0733bbd7369679b05e3004bdd7Alexis Hetu maxLOD = texture->getMaxLOD(); 3099f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens compFunc = texture->getCompareFunc(); 3100f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens compMode = texture->getCompareMode(); 31010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3103f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens GLfloat maxAnisotropy = texture->getMaxAnisotropy(); 310495ac1874dbdc4db63ff18279a1f8590d4b10b647Alexis Hetu GLint baseLevel = texture->getBaseLevel(); 310595ac1874dbdc4db63ff18279a1f8590d4b10b647Alexis Hetu GLint maxLevel = texture->getMaxLevel(); 31060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum swizzleR = texture->getSwizzleR(); 31070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum swizzleG = texture->getSwizzleG(); 31080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum swizzleB = texture->getSwizzleB(); 31090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum swizzleA = texture->getSwizzleA(); 31100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAddressingModeU(samplerType, samplerIndex, es2sw::ConvertTextureWrap(wrapS)); 31120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAddressingModeV(samplerType, samplerIndex, es2sw::ConvertTextureWrap(wrapT)); 31130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAddressingModeW(samplerType, samplerIndex, es2sw::ConvertTextureWrap(wrapR)); 3114f878d50b65d70c883dd8c882e5096b14e2a9ae53Nicolas Capens device->setCompareFunc(samplerType, samplerIndex, es2sw::ConvertCompareFunc(compFunc, compMode)); 31150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSwizzleR(samplerType, samplerIndex, es2sw::ConvertSwizzleType(swizzleR)); 31160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSwizzleG(samplerType, samplerIndex, es2sw::ConvertSwizzleType(swizzleG)); 31170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSwizzleB(samplerType, samplerIndex, es2sw::ConvertSwizzleType(swizzleB)); 31180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSwizzleA(samplerType, samplerIndex, es2sw::ConvertSwizzleType(swizzleA)); 3119112d81f17f6bfa0733bbd7369679b05e3004bdd7Alexis Hetu device->setMinLod(samplerType, samplerIndex, minLOD); 3120112d81f17f6bfa0733bbd7369679b05e3004bdd7Alexis Hetu device->setMaxLod(samplerType, samplerIndex, maxLOD); 312195ac1874dbdc4db63ff18279a1f8590d4b10b647Alexis Hetu device->setBaseLevel(samplerType, samplerIndex, baseLevel); 312295ac1874dbdc4db63ff18279a1f8590d4b10b647Alexis Hetu device->setMaxLevel(samplerType, samplerIndex, maxLevel); 31230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureFilter(samplerType, samplerIndex, es2sw::ConvertTextureFilter(minFilter, magFilter, maxAnisotropy)); 31240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMipmapFilter(samplerType, samplerIndex, es2sw::ConvertMipMapFilter(minFilter)); 31250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMaxAnisotropy(samplerType, samplerIndex, maxAnisotropy); 3126010a464878f32daed863edee3fc6ad21920d605bAlexis Hetu device->setHighPrecisionFiltering(samplerType, samplerIndex, mState.textureFilteringHint == GL_NICEST); 31270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTexture(samplerType, samplerIndex, texture); 31290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 31310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTexture(samplerType, samplerIndex, nullptr); 31330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 31360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTexture(samplerType, samplerIndex, nullptr); 31380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyTexture(sw::SamplerType type, int index, Texture *baseTexture) 31430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *program = getCurrentProgram(); 31450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int sampler = (type == sw::SAMPLER_PIXEL) ? index : 16 + index; 31460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool textureUsed = false; 31470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(type == sw::SAMPLER_PIXEL) 31490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureUsed = program->getPixelShader()->usesSampler(index); 31510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(type == sw::SAMPLER_VERTEX) 31530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureUsed = program->getVertexShader()->usesSampler(index); 31550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNREACHABLE(type); 31570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Resource *resource = 0; 31590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(baseTexture && textureUsed) 31610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens resource = baseTexture->getResource(); 31630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureResource(sampler, resource); 31660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(baseTexture && textureUsed) 31680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int levelCount = baseTexture->getLevelCount(); 31700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(baseTexture->getTarget() == GL_TEXTURE_2D || baseTexture->getTarget() == GL_TEXTURE_EXTERNAL_OES) 31720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Texture2D *texture = static_cast<Texture2D*>(baseTexture); 31740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++) 31760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int surfaceLevel = mipmapLevel; 31780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(surfaceLevel < 0) 31800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens surfaceLevel = 0; 31820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(surfaceLevel >= levelCount) 31840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens surfaceLevel = levelCount - 1; 31860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *surface = texture->getImage(surfaceLevel); 31890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureLevel(sampler, 0, mipmapLevel, surface, sw::TEXTURE_2D); 31900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(baseTexture->getTarget() == GL_TEXTURE_3D_OES) 31930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Texture3D *texture = static_cast<Texture3D*>(baseTexture); 31950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++) 31970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int surfaceLevel = mipmapLevel; 31990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(surfaceLevel < 0) 32010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens surfaceLevel = 0; 32030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(surfaceLevel >= levelCount) 32050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens surfaceLevel = levelCount - 1; 32070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *surface = texture->getImage(surfaceLevel); 32100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureLevel(sampler, 0, mipmapLevel, surface, sw::TEXTURE_3D); 32110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(baseTexture->getTarget() == GL_TEXTURE_2D_ARRAY) 32140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Texture2DArray *texture = static_cast<Texture2DArray*>(baseTexture); 32160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++) 32180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int surfaceLevel = mipmapLevel; 32200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(surfaceLevel < 0) 32220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens surfaceLevel = 0; 32240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(surfaceLevel >= levelCount) 32260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens surfaceLevel = levelCount - 1; 32280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *surface = texture->getImage(surfaceLevel); 32310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureLevel(sampler, 0, mipmapLevel, surface, sw::TEXTURE_2D_ARRAY); 32320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(baseTexture->getTarget() == GL_TEXTURE_CUBE_MAP) 32350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 323673e18c1b726b4b510e703715772f72450d9f8477Nicolas Capens TextureCubeMap *cubeTexture = static_cast<TextureCubeMap*>(baseTexture); 323773e18c1b726b4b510e703715772f72450d9f8477Nicolas Capens 323873e18c1b726b4b510e703715772f72450d9f8477Nicolas Capens for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++) 32390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 324073e18c1b726b4b510e703715772f72450d9f8477Nicolas Capens cubeTexture->updateBorders(mipmapLevel); 32410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 324273e18c1b726b4b510e703715772f72450d9f8477Nicolas Capens for(int face = 0; face < 6; face++) 32430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int surfaceLevel = mipmapLevel; 32450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(surfaceLevel < 0) 32470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens surfaceLevel = 0; 32490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(surfaceLevel >= levelCount) 32510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens surfaceLevel = levelCount - 1; 32530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *surface = cubeTexture->getImage(face, surfaceLevel); 32560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureLevel(sampler, face, mipmapLevel, surface, sw::TEXTURE_CUBE); 32570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNIMPLEMENTED(); 32610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 32630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureLevel(sampler, 0, 0, 0, sw::TEXTURE_NULL); 32650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei *bufSize, void* pixels) 32690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getReadFramebuffer(); 32710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int framebufferWidth, framebufferHeight, framebufferSamples; 32720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(framebuffer->completeness(framebufferWidth, framebufferHeight, framebufferSamples) != GL_FRAMEBUFFER_COMPLETE) 32740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_FRAMEBUFFER_OPERATION); 32760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(getReadFramebufferName() != 0 && framebufferSamples != 0) 32790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 32810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3283492887ad2373092136bb9acfc5a3fc8205230933Nicolas Capens if(!IsValidReadPixelsFormatType(framebuffer, format, type, clientVersion)) 32840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 32860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLsizei outputWidth = (mState.packRowLength > 0) ? mState.packRowLength : width; 32890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLsizei outputPitch = egl::ComputePitch(outputWidth, format, type, mState.packAlignment); 32900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLsizei outputHeight = (mState.packImageHeight == 0) ? height : mState.packImageHeight; 32910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pixels = getPixelPackBuffer() ? (unsigned char*)getPixelPackBuffer()->data() + (ptrdiff_t)pixels : (unsigned char*)pixels; 32920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pixels = ((char*)pixels) + egl::ComputePackingOffset(format, type, outputWidth, outputHeight, mState.packAlignment, mState.packSkipImages, mState.packSkipRows, mState.packSkipPixels); 32930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Sized query sanity check 32950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(bufSize) 32960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int requiredSize = outputPitch * height; 32980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(requiredSize > *bufSize) 32990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 33010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *renderTarget = nullptr; 33050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(format) 33060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_COMPONENT: 33080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens renderTarget = framebuffer->getDepthBuffer(); 33090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 33100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 33110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens renderTarget = framebuffer->getReadRenderTarget(); 33120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 33130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!renderTarget) 33160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 33180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 332010c74a62ed7bcde6e4f48445bd43e2f8707c30d6Alexis Hetu sw::RectF rect((float)x, (float)y, (float)(x + width), (float)(y + height)); 332110c74a62ed7bcde6e4f48445bd43e2f8707c30d6Alexis Hetu sw::Rect dstRect(0, 0, width, height); 332210c74a62ed7bcde6e4f48445bd43e2f8707c30d6Alexis Hetu rect.clip(0.0f, 0.0f, (float)renderTarget->getWidth(), (float)renderTarget->getHeight()); 33230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3324f41f0332bfb9dfbf09253bbf10f3b46e820a4f8eNicolas Capens sw::Surface *externalSurface = sw::Surface::create(width, height, 1, egl::ConvertFormatType(format, type), pixels, outputPitch, outputPitch * outputHeight); 332510c74a62ed7bcde6e4f48445bd43e2f8707c30d6Alexis Hetu sw::SliceRectF sliceRect(rect); 33260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::SliceRect dstSliceRect(dstRect); 3327f41f0332bfb9dfbf09253bbf10f3b46e820a4f8eNicolas Capens device->blit(renderTarget, sliceRect, externalSurface, dstSliceRect, false); 3328f41f0332bfb9dfbf09253bbf10f3b46e820a4f8eNicolas Capens delete externalSurface; 33290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens renderTarget->release(); 33310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::clear(GLbitfield mask) 33340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.rasterizerDiscardEnabled) 33360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 33380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 33410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!framebuffer || framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) 33430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_FRAMEBUFFER_OPERATION); 33450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!applyRenderTarget()) 33480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 33500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_COLOR_BUFFER_BIT) 33530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int rgbaMask = getColorMask(); 33550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(rgbaMask != 0) 33570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->clearColor(mState.colorClearValue.red, mState.colorClearValue.green, mState.colorClearValue.blue, mState.colorClearValue.alpha, rgbaMask); 33590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_DEPTH_BUFFER_BIT) 33630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthMask != 0) 33650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float depth = clamp01(mState.depthClearValue); 33670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->clearDepth(depth); 33680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_STENCIL_BUFFER_BIT) 33720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilWritemask != 0) 33740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int stencil = mState.stencilClearValue & 0x000000FF; 33760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->clearStencil(stencil, mState.stencilWritemask); 33770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::clearColorBuffer(GLint drawbuffer, void *value, sw::Format format) 33820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int rgbaMask = getColorMask(); 33840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(rgbaMask && !mState.rasterizerDiscardEnabled) 33850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 33870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *colorbuffer = framebuffer->getRenderTarget(drawbuffer); 33880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(colorbuffer) 33900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3391426cb5e11112c9a9c3a7f145474a29e5e81463caNicolas Capens sw::Rect clearRect = colorbuffer->getRect(); 33920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.scissorTestEnabled) 33940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens clearRect.clip(mState.scissorX, mState.scissorY, mState.scissorX + mState.scissorWidth, mState.scissorY + mState.scissorHeight); 33960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->clear(value, format, colorbuffer, clearRect, rgbaMask); 33990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens colorbuffer->release(); 34010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::clearColorBuffer(GLint drawbuffer, const GLint *value) 34060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens clearColorBuffer(drawbuffer, (void*)value, sw::FORMAT_A32B32G32R32I); 34080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::clearColorBuffer(GLint drawbuffer, const GLuint *value) 34110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens clearColorBuffer(drawbuffer, (void*)value, sw::FORMAT_A32B32G32R32UI); 34130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::clearColorBuffer(GLint drawbuffer, const GLfloat *value) 34160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens clearColorBuffer(drawbuffer, (void*)value, sw::FORMAT_A32B32G32R32F); 34180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::clearDepthBuffer(const GLfloat value) 34210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthMask && !mState.rasterizerDiscardEnabled) 34230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 34250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *depthbuffer = framebuffer->getDepthBuffer(); 34260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(depthbuffer) 34280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float depth = clamp01(value); 3430426cb5e11112c9a9c3a7f145474a29e5e81463caNicolas Capens sw::Rect clearRect = depthbuffer->getRect(); 34310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.scissorTestEnabled) 34330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens clearRect.clip(mState.scissorX, mState.scissorY, mState.scissorX + mState.scissorWidth, mState.scissorY + mState.scissorHeight); 34350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens depthbuffer->clearDepth(depth, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height()); 34380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens depthbuffer->release(); 34400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::clearStencilBuffer(const GLint value) 34450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilWritemask && !mState.rasterizerDiscardEnabled) 34470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 34490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *stencilbuffer = framebuffer->getStencilBuffer(); 34500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(stencilbuffer) 34520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned char stencil = value < 0 ? 0 : static_cast<unsigned char>(value & 0x000000FF); 3454426cb5e11112c9a9c3a7f145474a29e5e81463caNicolas Capens sw::Rect clearRect = stencilbuffer->getRect(); 34550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.scissorTestEnabled) 34570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens clearRect.clip(mState.scissorX, mState.scissorY, mState.scissorX + mState.scissorWidth, mState.scissorY + mState.scissorHeight); 34590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens stencilbuffer->clearStencil(stencil, static_cast<unsigned char>(mState.stencilWritemask), clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height()); 34620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens stencilbuffer->release(); 34640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount) 34690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::DrawType primitiveType; 34710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int primitiveCount; 34727b2403b10229b4e66b2441cbd863c59de32c5814Alexis Hetu int verticesPerPrimitive; 34730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34747b2403b10229b4e66b2441cbd863c59de32c5814Alexis Hetu if(!es2sw::ConvertPrimitiveType(mode, count, GL_NONE, primitiveType, primitiveCount, verticesPerPrimitive)) 34750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34765815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens return error(GL_INVALID_ENUM); 34770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!applyRenderTarget()) 34800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 34820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyState(mode); 34850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < instanceCount; ++i) 34870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setInstanceID(i); 34890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum err = applyVertexBuffer(0, first, count, i); 34910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err != GL_NO_ERROR) 34920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(err); 34940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34965815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens if(!mState.currentProgram) 34975815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens { 34985815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens return; 34995815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens } 35005815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens 35010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyShaders(); 35020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTextures(); 35030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!getCurrentProgram()->validateSamplers(false)) 35050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 35060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 35070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 35080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35095815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens if(primitiveCount <= 0) 35105815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens { 35115815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens return; 35125815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens } 35135815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens 35147b2403b10229b4e66b2441cbd863c59de32c5814Alexis Hetu TransformFeedback* transformFeedback = getTransformFeedback(); 35157b2403b10229b4e66b2441cbd863c59de32c5814Alexis Hetu if(!cullSkipsDraw(mode) || (transformFeedback->isActive() && !transformFeedback->isPaused())) 35160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 35170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->drawPrimitive(primitiveType, primitiveCount); 35180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 35197b2403b10229b4e66b2441cbd863c59de32c5814Alexis Hetu if(transformFeedback) 35207b2403b10229b4e66b2441cbd863c59de32c5814Alexis Hetu { 35217b2403b10229b4e66b2441cbd863c59de32c5814Alexis Hetu transformFeedback->addVertexOffset(primitiveCount * verticesPerPrimitive); 35227b2403b10229b4e66b2441cbd863c59de32c5814Alexis Hetu } 35230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 35240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 35250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount) 35270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 35280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!indices && !getCurrentVertexArray()->getElementArrayBuffer()) 35290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 35300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 35310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 35320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 353374b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu GLenum internalMode = mode; 353474b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu if(isPrimitiveRestartFixedIndexEnabled()) 353574b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu { 353674b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu switch(mode) 353774b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu { 353874b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu case GL_TRIANGLE_FAN: 353974b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu case GL_TRIANGLE_STRIP: 354074b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu internalMode = GL_TRIANGLES; 354174b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu break; 354274b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu case GL_LINE_LOOP: 354374b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu case GL_LINE_STRIP: 354474b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu internalMode = GL_LINES; 354574b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu break; 354674b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu default: 354774b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu break; 354874b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu } 354974b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu } 355074b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu 35510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::DrawType primitiveType; 35520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int primitiveCount; 35537b2403b10229b4e66b2441cbd863c59de32c5814Alexis Hetu int verticesPerPrimitive; 35540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 355574b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu if(!es2sw::ConvertPrimitiveType(internalMode, count, type, primitiveType, primitiveCount, verticesPerPrimitive)) 35560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 35575815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens return error(GL_INVALID_ENUM); 35580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 35590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!applyRenderTarget()) 35610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 35620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 35630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 35640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 356574b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu TranslatedIndexData indexInfo(primitiveCount); 356674b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu GLenum err = applyIndexBuffer(indices, start, end, count, mode, type, &indexInfo); 356774b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu if(err != GL_NO_ERROR) 356874b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu { 356974b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu return error(err); 357074b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu } 357174b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu 357274b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu applyState(internalMode); 35730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < instanceCount; ++i) 35750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 35760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setInstanceID(i); 35770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLsizei vertexCount = indexInfo.maxIndex - indexInfo.minIndex + 1; 35790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens err = applyVertexBuffer(-(int)indexInfo.minIndex, indexInfo.minIndex, vertexCount, i); 35800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err != GL_NO_ERROR) 35810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 35820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(err); 35830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 35840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35855815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens if(!mState.currentProgram) 35865815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens { 35875815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens return; 35885815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens } 35895815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens 35900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyShaders(); 35910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTextures(); 35920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!getCurrentProgram()->validateSamplers(false)) 35940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 35950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 35960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 35970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35985815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens if(primitiveCount <= 0) 35995815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens { 36005815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens return; 36015815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens } 36025815e125f6e9a8fcec6dd66db8bd263de2474b9cNicolas Capens 36037b2403b10229b4e66b2441cbd863c59de32c5814Alexis Hetu TransformFeedback* transformFeedback = getTransformFeedback(); 360474b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu if(!cullSkipsDraw(internalMode) || (transformFeedback->isActive() && !transformFeedback->isPaused())) 36050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 360674b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu device->drawIndexedPrimitive(primitiveType, indexInfo.indexOffset, indexInfo.primitiveCount); 36070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 36087b2403b10229b4e66b2441cbd863c59de32c5814Alexis Hetu if(transformFeedback) 36097b2403b10229b4e66b2441cbd863c59de32c5814Alexis Hetu { 361074b91b5a9712ba3e09e73ea6981ab689fac4f2ccAlexis Hetu transformFeedback->addVertexOffset(indexInfo.primitiveCount * verticesPerPrimitive); 36117b2403b10229b4e66b2441cbd863c59de32c5814Alexis Hetu } 36120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 36130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 36140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 361581aa97bd20033674ba28d779c05fbcee1539ebf7Nicolas Capensvoid Context::blit(sw::Surface *source, const sw::SliceRect &sRect, sw::Surface *dest, const sw::SliceRect &dRect) 361681aa97bd20033674ba28d779c05fbcee1539ebf7Nicolas Capens{ 361710c74a62ed7bcde6e4f48445bd43e2f8707c30d6Alexis Hetu sw::SliceRectF sRectF((float)sRect.x0, (float)sRect.y0, (float)sRect.x1, (float)sRect.y1, sRect.slice); 361810c74a62ed7bcde6e4f48445bd43e2f8707c30d6Alexis Hetu device->blit(source, sRectF, dest, dRect, false); 361981aa97bd20033674ba28d779c05fbcee1539ebf7Nicolas Capens} 362081aa97bd20033674ba28d779c05fbcee1539ebf7Nicolas Capens 36210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::finish() 36220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 36230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->finish(); 36240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 36250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::flush() 36270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 36280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // We don't queue anything without processing it as fast as possible 36290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 36300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordInvalidEnum() 36320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 36330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidEnum = true; 36340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 36350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordInvalidValue() 36370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 36380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidValue = true; 36390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 36400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordInvalidOperation() 36420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 36430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidOperation = true; 36440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 36450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordOutOfMemory() 36470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 36480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mOutOfMemory = true; 36490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 36500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordInvalidFramebufferOperation() 36520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 36530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidFramebufferOperation = true; 36540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 36550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Get one of the recorded errors and clear its flag, if any. 36570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// [OpenGL ES 2.0.24] section 2.5 page 13. 36580bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLenum Context::getError() 36590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 36600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mInvalidEnum) 36610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 36620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidEnum = false; 36630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_ENUM; 36650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 36660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mInvalidValue) 36680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 36690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidValue = false; 36700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_VALUE; 36720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 36730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mInvalidOperation) 36750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 36760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidOperation = false; 36770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_OPERATION; 36790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 36800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mOutOfMemory) 36820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 36830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mOutOfMemory = false; 36840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_OUT_OF_MEMORY; 36860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 36870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mInvalidFramebufferOperation) 36890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 36900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidFramebufferOperation = false; 36910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_FRAMEBUFFER_OPERATION; 36930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 36940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_NO_ERROR; 36960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 36970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensint Context::getSupportedMultisampleCount(int requested) 36990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 37000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int supported = 0; 37010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = NUM_MULTISAMPLE_COUNTS - 1; i >= 0; i--) 37030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(supported >= requested) 37050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return supported; 37070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens supported = multisampleCount[i]; 37100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return supported; 37130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 37140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::detachBuffer(GLuint buffer) 37160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 37170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 2.9 page 22: 37180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a buffer object is deleted while it is bound, all bindings to that object in the current context 37190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // (i.e. in the thread that called Delete-Buffers) are reset to zero. 37200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.copyReadBuffer.name() == buffer) 37220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.copyReadBuffer = nullptr; 37240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.copyWriteBuffer.name() == buffer) 37270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.copyWriteBuffer = nullptr; 37290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.pixelPackBuffer.name() == buffer) 37320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.pixelPackBuffer = nullptr; 37340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.pixelUnpackBuffer.name() == buffer) 37370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.pixelUnpackBuffer = nullptr; 37390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.genericUniformBuffer.name() == buffer) 37420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.genericUniformBuffer = nullptr; 37440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(getArrayBufferName() == buffer) 37470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.arrayBuffer = nullptr; 37490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Only detach from the current transform feedback 37520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TransformFeedback* currentTransformFeedback = getTransformFeedback(); 37530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(currentTransformFeedback) 37540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentTransformFeedback->detachBuffer(buffer); 37560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Only detach from the current vertex array 37590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens VertexArray* currentVertexArray = getCurrentVertexArray(); 37600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(currentVertexArray) 37610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentVertexArray->detachBuffer(buffer); 37630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int attribute = 0; attribute < MAX_VERTEX_ATTRIBS; attribute++) 37660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.vertexAttribute[attribute].mBoundBuffer.name() == buffer) 37680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribute].mBoundBuffer = nullptr; 37700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 37730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::detachTexture(GLuint texture) 37750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 37760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 3.8 page 84: 37770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a texture object is deleted, it is as if all texture units which are bound to that texture object are 37780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // rebound to texture object zero 37790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int type = 0; type < TEXTURE_TYPE_COUNT; type++) 37810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int sampler = 0; sampler < MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++) 37830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.samplerTexture[type][sampler].name() == texture) 37850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 37860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.samplerTexture[type][sampler] = nullptr; 37870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 37900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 4.4 page 112: 37920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is 37930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // as if FramebufferTexture2D had been called, with a texture of 0, for each attachment point to which this 37940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // image was attached in the currently bound framebuffer. 37950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *readFramebuffer = getReadFramebuffer(); 37970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *drawFramebuffer = getDrawFramebuffer(); 37980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 37990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(readFramebuffer) 38000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 38010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readFramebuffer->detachTexture(texture); 38020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 38030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawFramebuffer && drawFramebuffer != readFramebuffer) 38050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 38060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawFramebuffer->detachTexture(texture); 38070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 38080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 38090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::detachFramebuffer(GLuint framebuffer) 38110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 38120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 4.4 page 107: 38130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though 38140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero. 38150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.readFramebuffer == framebuffer) 38170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 38180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindReadFramebuffer(0); 38190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 38200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.drawFramebuffer == framebuffer) 38220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 38230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindDrawFramebuffer(0); 38240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 38250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 38260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::detachRenderbuffer(GLuint renderbuffer) 38280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 38290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 4.4 page 109: 38300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though BindRenderbuffer 38310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // had been executed with the target RENDERBUFFER and name of zero. 38320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.renderbuffer.name() == renderbuffer) 38340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 38350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindRenderbuffer(0); 38360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 38370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 4.4 page 111: 38390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a renderbuffer object is deleted while its image is attached to the currently bound framebuffer, 38400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment 38410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // point to which this image was attached in the currently bound framebuffer. 38420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *readFramebuffer = getReadFramebuffer(); 38440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *drawFramebuffer = getDrawFramebuffer(); 38450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(readFramebuffer) 38470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 38480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readFramebuffer->detachRenderbuffer(renderbuffer); 38490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 38500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawFramebuffer && drawFramebuffer != readFramebuffer) 38520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 38530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawFramebuffer->detachRenderbuffer(renderbuffer); 38540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 38550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 38560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::detachSampler(GLuint sampler) 38580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 38590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124: 38600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a sampler object that is currently bound to one or more texture units is 38610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // deleted, it is as though BindSampler is called once for each texture unit to 38620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // which the sampler is bound, with unit set to the texture unit and sampler set to zero. 38630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(size_t textureUnit = 0; textureUnit < MAX_COMBINED_TEXTURE_IMAGE_UNITS; ++textureUnit) 38640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 38650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens gl::BindingPointer<Sampler> &samplerBinding = mState.sampler[textureUnit]; 38660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(samplerBinding.name() == sampler) 38670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 38680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens samplerBinding = nullptr; 38690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 38700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 38710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 38720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::cullSkipsDraw(GLenum drawMode) 38740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 38750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.cullFaceEnabled && mState.cullMode == GL_FRONT_AND_BACK && isTriangleMode(drawMode); 38760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 38770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isTriangleMode(GLenum drawMode) 38790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 38800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(drawMode) 38810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 38820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRIANGLES: 38830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRIANGLE_FAN: 38840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRIANGLE_STRIP: 38850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 38860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINTS: 38870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINES: 38880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_LOOP: 38890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_STRIP: 38900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 38910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(drawMode); 38920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 38930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 38950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 38960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 38970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setVertexAttrib(GLuint index, const GLfloat *values) 38980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 38990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(index < MAX_VERTEX_ATTRIBS); 39000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[index].setCurrentValue(values); 39020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mVertexDataManager->dirtyCurrentValue(index); 39040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 39050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setVertexAttrib(GLuint index, const GLint *values) 39070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 39080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(index < MAX_VERTEX_ATTRIBS); 39090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[index].setCurrentValue(values); 39110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mVertexDataManager->dirtyCurrentValue(index); 39130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 39140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setVertexAttrib(GLuint index, const GLuint *values) 39160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 39170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(index < MAX_VERTEX_ATTRIBS); 39180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[index].setCurrentValue(values); 39200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mVertexDataManager->dirtyCurrentValue(index); 39220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 39230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, 39250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, 3926b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu GLbitfield mask, bool filter, bool allowPartialDepthStencilBlit) 39270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 39280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *readFramebuffer = getReadFramebuffer(); 39290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *drawFramebuffer = getDrawFramebuffer(); 39300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int readBufferWidth, readBufferHeight, readBufferSamples; 39320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int drawBufferWidth, drawBufferHeight, drawBufferSamples; 39330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!readFramebuffer || readFramebuffer->completeness(readBufferWidth, readBufferHeight, readBufferSamples) != GL_FRAMEBUFFER_COMPLETE || 39350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens !drawFramebuffer || drawFramebuffer->completeness(drawBufferWidth, drawBufferHeight, drawBufferSamples) != GL_FRAMEBUFFER_COMPLETE) 39360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 39370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_FRAMEBUFFER_OPERATION); 39380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 39390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawBufferSamples > 1) 39410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 39420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 39430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 39440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::SliceRect sourceRect; 39460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::SliceRect destRect; 39470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool flipX = (srcX0 < srcX1) ^ (dstX0 < dstX1); 39480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool flipy = (srcY0 < srcY1) ^ (dstY0 < dstY1); 39490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(srcX0 < srcX1) 39510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 39520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.x0 = srcX0; 39530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.x1 = srcX1; 39540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 39550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 39560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 39570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.x0 = srcX1; 39580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.x1 = srcX0; 39590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 39600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(dstX0 < dstX1) 39620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 39630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.x0 = dstX0; 39640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.x1 = dstX1; 39650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 39660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 39670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 39680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.x0 = dstX1; 39690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.x1 = dstX0; 39700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 39710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(srcY0 < srcY1) 39730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 39740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.y0 = srcY0; 39750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.y1 = srcY1; 39760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 39770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 39780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 39790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.y0 = srcY1; 39800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.y1 = srcY0; 39810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 39820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(dstY0 < dstY1) 39840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 39850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.y0 = dstY0; 39860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.y1 = dstY1; 39870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 39880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 39890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 39900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.y0 = dstY1; 39910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.y1 = dstY0; 39920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 39930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Rect sourceScissoredRect = sourceRect; 39950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Rect destScissoredRect = destRect; 39960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 39970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.scissorTestEnabled) // Only write to parts of the destination framebuffer which pass the scissor test 39980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 39990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destRect.x0 < mState.scissorX) 40000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 40010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int xDiff = mState.scissorX - destRect.x0; 40020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destScissoredRect.x0 = mState.scissorX; 40030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceScissoredRect.x0 += xDiff; 40040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destRect.x1 > mState.scissorX + mState.scissorWidth) 40070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 40080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int xDiff = destRect.x1 - (mState.scissorX + mState.scissorWidth); 40090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destScissoredRect.x1 = mState.scissorX + mState.scissorWidth; 40100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceScissoredRect.x1 -= xDiff; 40110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destRect.y0 < mState.scissorY) 40140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 40150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int yDiff = mState.scissorY - destRect.y0; 40160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destScissoredRect.y0 = mState.scissorY; 40170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceScissoredRect.y0 += yDiff; 40180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destRect.y1 > mState.scissorY + mState.scissorHeight) 40210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 40220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int yDiff = destRect.y1 - (mState.scissorY + mState.scissorHeight); 40230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destScissoredRect.y1 = mState.scissorY + mState.scissorHeight; 40240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceScissoredRect.y1 -= yDiff; 40250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Rect sourceTrimmedRect = sourceScissoredRect; 40290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Rect destTrimmedRect = destScissoredRect; 40300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // The source & destination rectangles also may need to be trimmed if they fall out of the bounds of 40320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // the actual draw and read surfaces. 40330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(sourceTrimmedRect.x0 < 0) 40340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 40350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int xDiff = 0 - sourceTrimmedRect.x0; 40360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.x0 = 0; 40370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.x0 += xDiff; 40380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(sourceTrimmedRect.x1 > readBufferWidth) 40410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 40420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int xDiff = sourceTrimmedRect.x1 - readBufferWidth; 40430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.x1 = readBufferWidth; 40440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.x1 -= xDiff; 40450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(sourceTrimmedRect.y0 < 0) 40480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 40490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int yDiff = 0 - sourceTrimmedRect.y0; 40500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.y0 = 0; 40510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.y0 += yDiff; 40520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(sourceTrimmedRect.y1 > readBufferHeight) 40550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 40560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int yDiff = sourceTrimmedRect.y1 - readBufferHeight; 40570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.y1 = readBufferHeight; 40580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.y1 -= yDiff; 40590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destTrimmedRect.x0 < 0) 40620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 40630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int xDiff = 0 - destTrimmedRect.x0; 40640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.x0 = 0; 40650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.x0 += xDiff; 40660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destTrimmedRect.x1 > drawBufferWidth) 40690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 40700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int xDiff = destTrimmedRect.x1 - drawBufferWidth; 40710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.x1 = drawBufferWidth; 40720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.x1 -= xDiff; 40730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destTrimmedRect.y0 < 0) 40760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 40770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int yDiff = 0 - destTrimmedRect.y0; 40780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.y0 = 0; 40790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.y0 += yDiff; 40800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destTrimmedRect.y1 > drawBufferHeight) 40830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 40840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int yDiff = destTrimmedRect.y1 - drawBufferHeight; 40850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.y1 = drawBufferHeight; 40860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.y1 -= yDiff; 40870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool partialBufferCopy = false; 40900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 40910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(sourceTrimmedRect.y1 - sourceTrimmedRect.y0 < readBufferHeight || 40920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.x1 - sourceTrimmedRect.x0 < readBufferWidth || 40930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.y1 - destTrimmedRect.y0 < drawBufferHeight || 40940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.x1 - destTrimmedRect.x0 < drawBufferWidth || 40950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.y0 != 0 || destTrimmedRect.y0 != 0 || sourceTrimmedRect.x0 != 0 || destTrimmedRect.x0 != 0) 40960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 40970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens partialBufferCopy = true; 40980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 40990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4100166af499d36f7ca1d542bfc46ca37468bf9fbdabAlexis Hetu bool sameBounds = (srcX0 == dstX0 && srcY0 == dstY0 && srcX1 == dstX1 && srcY1 == dstY1); 41010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool blitRenderTarget = false; 4102b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu bool blitDepth = false; 4103b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu bool blitStencil = false; 41040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 41050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_COLOR_BUFFER_BIT) 41060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 41073be576c091d4dd99f8b24f0a8740fe76301de965Nicolas Capens GLenum readColorbufferType = readFramebuffer->getReadBufferType(); 41080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum drawColorbufferType = drawFramebuffer->getColorbufferType(0); 41090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const bool validReadType = readColorbufferType == GL_TEXTURE_2D || Framebuffer::IsRenderbuffer(readColorbufferType); 41100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const bool validDrawType = drawColorbufferType == GL_TEXTURE_2D || Framebuffer::IsRenderbuffer(drawColorbufferType); 41110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!validReadType || !validDrawType) 41120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 41130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 41140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 41150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4116166af499d36f7ca1d542bfc46ca37468bf9fbdabAlexis Hetu if(partialBufferCopy && readBufferSamples > 1 && !sameBounds) 41170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 41180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 41190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 41200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 41211c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu // The GL ES 3.0.2 spec (pg 193) states that: 41221c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu // 1) If the read buffer is fixed point format, the draw buffer must be as well 41231c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu // 2) If the read buffer is an unsigned integer format, the draw buffer must be 41241c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu // as well 41251c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu // 3) If the read buffer is a signed integer format, the draw buffer must be as 41261c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu // well 41271c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu es2::Renderbuffer *readRenderbuffer = readFramebuffer->getReadColorbuffer(); 41281c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu es2::Renderbuffer *drawRenderbuffer = drawFramebuffer->getColorbuffer(0); 4129c61f46b8f057aec5bffb87d4619b2994c0105857Nicolas Capens GLint readFormat = readRenderbuffer->getFormat(); 4130c61f46b8f057aec5bffb87d4619b2994c0105857Nicolas Capens GLint drawFormat = drawRenderbuffer->getFormat(); 4131c61f46b8f057aec5bffb87d4619b2994c0105857Nicolas Capens GLenum readComponentType = GetComponentType(readFormat, GL_COLOR_ATTACHMENT0); 4132c61f46b8f057aec5bffb87d4619b2994c0105857Nicolas Capens GLenum drawComponentType = GetComponentType(drawFormat, GL_COLOR_ATTACHMENT0); 41331c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu bool readFixedPoint = ((readComponentType == GL_UNSIGNED_NORMALIZED) || 41341c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu (readComponentType == GL_SIGNED_NORMALIZED)); 41351c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu bool drawFixedPoint = ((drawComponentType == GL_UNSIGNED_NORMALIZED) || 41361c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu (drawComponentType == GL_SIGNED_NORMALIZED)); 41371c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu bool readFixedOrFloat = (readFixedPoint || (readComponentType == GL_FLOAT)); 41381c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu bool drawFixedOrFloat = (drawFixedPoint || (drawComponentType == GL_FLOAT)); 41391c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu 41401c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu if(readFixedOrFloat != drawFixedOrFloat) 41411c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu { 41421c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu return error(GL_INVALID_OPERATION); 41431c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu } 41441c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu 41451c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu if((readComponentType == GL_UNSIGNED_INT) && (drawComponentType != GL_UNSIGNED_INT)) 41461c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu { 41471c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu return error(GL_INVALID_OPERATION); 41481c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu } 41491c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu 41501c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu if((readComponentType == GL_INT) && (drawComponentType != GL_INT)) 41511c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu { 41521c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu return error(GL_INVALID_OPERATION); 41531c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu } 41541c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu 41551c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu // Cannot filter integer data 41561c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu if(((readComponentType == GL_UNSIGNED_INT) || (readComponentType == GL_INT)) && filter) 41571c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu { 41581c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu return error(GL_INVALID_OPERATION); 41591c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu } 41601c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu 41611c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu if((readRenderbuffer->getSamples() > 0) && 41621c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu (readRenderbuffer->getFormat() != drawRenderbuffer->getFormat())) 41631c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu { 41641c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu return error(GL_INVALID_OPERATION); 41651c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu } 41661c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu 41670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens blitRenderTarget = true; 41680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 41690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 41700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) 41710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 41720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *readDSBuffer = nullptr; 41730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *drawDSBuffer = nullptr; 41740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 41750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_DEPTH_BUFFER_BIT) 41760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 41770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(readFramebuffer->getDepthbuffer() && drawFramebuffer->getDepthbuffer()) 41780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4179166af499d36f7ca1d542bfc46ca37468bf9fbdabAlexis Hetu GLenum readDepthBufferType = readFramebuffer->getDepthbufferType(); 4180166af499d36f7ca1d542bfc46ca37468bf9fbdabAlexis Hetu GLenum drawDepthBufferType = drawFramebuffer->getDepthbufferType(); 4181166af499d36f7ca1d542bfc46ca37468bf9fbdabAlexis Hetu if((readDepthBufferType != drawDepthBufferType) && 4182166af499d36f7ca1d542bfc46ca37468bf9fbdabAlexis Hetu !(Framebuffer::IsRenderbuffer(readDepthBufferType) && Framebuffer::IsRenderbuffer(drawDepthBufferType))) 41830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 41840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 41850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 41860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4187b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu blitDepth = true; 41880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readDSBuffer = readFramebuffer->getDepthbuffer(); 41890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawDSBuffer = drawFramebuffer->getDepthbuffer(); 41901c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu 4191c61f46b8f057aec5bffb87d4619b2994c0105857Nicolas Capens if(readDSBuffer->getFormat() != drawDSBuffer->getFormat()) 41921c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu { 41931c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu return error(GL_INVALID_OPERATION); 41941c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu } 41950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 41960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 41970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 41980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_STENCIL_BUFFER_BIT) 41990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 42000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(readFramebuffer->getStencilbuffer() && drawFramebuffer->getStencilbuffer()) 42010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4202166af499d36f7ca1d542bfc46ca37468bf9fbdabAlexis Hetu GLenum readStencilBufferType = readFramebuffer->getStencilbufferType(); 4203166af499d36f7ca1d542bfc46ca37468bf9fbdabAlexis Hetu GLenum drawStencilBufferType = drawFramebuffer->getStencilbufferType(); 4204166af499d36f7ca1d542bfc46ca37468bf9fbdabAlexis Hetu if((readStencilBufferType != drawStencilBufferType) && 4205166af499d36f7ca1d542bfc46ca37468bf9fbdabAlexis Hetu !(Framebuffer::IsRenderbuffer(readStencilBufferType) && Framebuffer::IsRenderbuffer(drawStencilBufferType))) 42060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 42070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 42080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 42090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4210b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu blitStencil = true; 42110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readDSBuffer = readFramebuffer->getStencilbuffer(); 42120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawDSBuffer = drawFramebuffer->getStencilbuffer(); 42131c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu 4214c61f46b8f057aec5bffb87d4619b2994c0105857Nicolas Capens if(readDSBuffer->getFormat() != drawDSBuffer->getFormat()) 42151c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu { 42161c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu return error(GL_INVALID_OPERATION); 42171c93b6c6a7be42f6bb1f8f759d7cb3fa99dab0b4Alexis Hetu } 42180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 42190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 42200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4221b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu if(partialBufferCopy && !allowPartialDepthStencilBlit) 42220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4223b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu ERR("Only whole-buffer depth and stencil blits are supported by ANGLE_framebuffer_blit."); 42240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); // Only whole-buffer copies are permitted 42250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 42260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 422758ead9eca5847f06bf9c0455b2b85a1a7835dd13Alexis Hetu // OpenGL ES 3.0.4 spec, p.199: 422858ead9eca5847f06bf9c0455b2b85a1a7835dd13Alexis Hetu // ...an INVALID_OPERATION error is generated if the formats of the read 4229492887ad2373092136bb9acfc5a3fc8205230933Nicolas Capens // and draw framebuffers are not identical or if the source and destination 423058ead9eca5847f06bf9c0455b2b85a1a7835dd13Alexis Hetu // rectangles are not defined with the same(X0, Y 0) and (X1, Y 1) bounds. 423158ead9eca5847f06bf9c0455b2b85a1a7835dd13Alexis Hetu // If SAMPLE_BUFFERS for the draw framebuffer is greater than zero, an 423258ead9eca5847f06bf9c0455b2b85a1a7835dd13Alexis Hetu // INVALID_OPERATION error is generated. 42330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if((drawDSBuffer && drawDSBuffer->getSamples() > 1) || 423458ead9eca5847f06bf9c0455b2b85a1a7835dd13Alexis Hetu ((readDSBuffer && readDSBuffer->getSamples() > 1) && 4235166af499d36f7ca1d542bfc46ca37468bf9fbdabAlexis Hetu (!sameBounds || (drawDSBuffer->getFormat() != readDSBuffer->getFormat())))) 42360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 42370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 42380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 42390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 42400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4241b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu if(blitRenderTarget || blitDepth || blitStencil) 42420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 42430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(blitRenderTarget) 42440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 42450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *readRenderTarget = readFramebuffer->getReadRenderTarget(); 42460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *drawRenderTarget = drawFramebuffer->getRenderTarget(0); 42470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 42480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(flipX) 42490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 42500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens swap(destRect.x0, destRect.x1); 42510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 42520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(flipy) 42530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 42540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens swap(destRect.y0, destRect.y1); 42550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 42560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4257b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu bool success = device->stretchRect(readRenderTarget, &sourceRect, drawRenderTarget, &destRect, (filter ? Device::USE_FILTER : 0) | Device::COLOR_BUFFER); 42580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 42590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readRenderTarget->release(); 42600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawRenderTarget->release(); 42610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 42620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!success) 42630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 42640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ERR("BlitFramebuffer failed."); 42650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 42660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 42670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 42680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4269b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu if(blitDepth) 42700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4271b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu egl::Image *readRenderTarget = readFramebuffer->getDepthBuffer(); 4272b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu egl::Image *drawRenderTarget = drawFramebuffer->getDepthBuffer(); 4273b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu 4274b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu bool success = device->stretchRect(readRenderTarget, &sourceRect, drawRenderTarget, &destRect, (filter ? Device::USE_FILTER : 0) | Device::DEPTH_BUFFER); 4275b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu 4276b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu readRenderTarget->release(); 4277b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu drawRenderTarget->release(); 4278b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu 4279b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu if(!success) 4280b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu { 4281b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu ERR("BlitFramebuffer failed."); 4282b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu return; 4283b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu } 4284b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu } 4285b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu 4286b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu if(blitStencil) 4287b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu { 4288b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu egl::Image *readRenderTarget = readFramebuffer->getStencilBuffer(); 4289b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu egl::Image *drawRenderTarget = drawFramebuffer->getStencilBuffer(); 4290b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu 4291b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu bool success = device->stretchRect(readRenderTarget, &sourceRect, drawRenderTarget, &destRect, (filter ? Device::USE_FILTER : 0) | Device::STENCIL_BUFFER); 4292b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu 4293b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu readRenderTarget->release(); 4294b9dda64e0e31dc5ac3eb7a19948062385a097cdbAlexis Hetu drawRenderTarget->release(); 42950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 42960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!success) 42970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 42980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ERR("BlitFramebuffer failed."); 42990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 43000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 43040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 430531c07a304f3247c26ba72eff0cb0a74eb05366e8Nicolas Capensvoid Context::bindTexImage(gl::Surface *surface) 43060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 43070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens es2::Texture2D *textureObject = getTexture2D(); 43080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(textureObject) 43100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 43110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureObject->bindTexImage(surface); 43120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 43140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43150bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensEGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel) 43160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 43170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum textureTarget = GL_NONE; 43180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(target) 43200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 43210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_2D_KHR: 43220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureTarget = GL_TEXTURE_2D; 43230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 43240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR: 43250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR: 43260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR: 43270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR: 43280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR: 43290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR: 43300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureTarget = GL_TEXTURE_CUBE_MAP; 43310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 43320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_RENDERBUFFER_KHR: 43330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 43340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 43350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_PARAMETER; 43360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(textureLevel >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS) 43390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 43400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_MATCH; 43410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(textureTarget != GL_NONE) 43440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 43450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens es2::Texture *texture = getTexture(name); 43460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!texture || texture->getTarget() != textureTarget) 43480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 43490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_PARAMETER; 43500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(texture->isShared(textureTarget, textureLevel)) // Bound to an EGLSurface or already an EGLImage sibling 43530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 43540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_ACCESS; 43550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(textureLevel != 0 && !texture->isSamplerComplete()) 43580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 43590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_PARAMETER; 43600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(textureLevel == 0 && !(texture->isSamplerComplete() && texture->getLevelCount() == 1)) 43630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 43640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_PARAMETER; 43650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(target == EGL_GL_RENDERBUFFER_KHR) 43680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 43690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens es2::Renderbuffer *renderbuffer = getRenderbuffer(name); 43700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!renderbuffer) 43720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 43730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_PARAMETER; 43740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(renderbuffer->isShared()) // Already an EGLImage sibling 43770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 43780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_ACCESS; 43790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 43810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNREACHABLE(target); 43820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_SUCCESS; 43840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 43850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensegl::Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textureLevel) 43870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 43880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum textureTarget = GL_NONE; 43890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 43900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(target) 43910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 43920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_2D_KHR: textureTarget = GL_TEXTURE_2D; break; 43930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X; break; 43940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_NEGATIVE_X; break; 43950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_Y; break; 43960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y; break; 43970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_Z; break; 43980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; break; 43990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 44000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 44010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(textureTarget != GL_NONE) 44020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 44030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens es2::Texture *texture = getTexture(name); 44040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 44050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return texture->createSharedImage(textureTarget, textureLevel); 44060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 44070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(target == EGL_GL_RENDERBUFFER_KHR) 44080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 44090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens es2::Renderbuffer *renderbuffer = getRenderbuffer(name); 44100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 44110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return renderbuffer->createSharedImage(); 44120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 44130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNREACHABLE(target); 44140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 441558df2f60096311b481b5521a571972278a341daeNicolas Capens return nullptr; 441658df2f60096311b481b5521a571972278a341daeNicolas Capens} 441758df2f60096311b481b5521a571972278a341daeNicolas Capens 441858df2f60096311b481b5521a571972278a341daeNicolas Capensegl::Image *Context::getSharedImage(GLeglImageOES image) 441958df2f60096311b481b5521a571972278a341daeNicolas Capens{ 442058df2f60096311b481b5521a571972278a341daeNicolas Capens return display->getSharedImage(image); 44210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 44220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 44230bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensDevice *Context::getDevice() 44240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 44250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return device; 44260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 44270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4428400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capensconst GLubyte *Context::getExtensions(GLuint index, GLuint *numExt) const 44290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 44300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Keep list sorted in following order: 44310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // OES extensions 44320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // EXT extensions 44330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Vendor extensions 4434400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens static const char *es2extensions[] = 4435400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens { 4436400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_compressed_ETC1_RGB8_texture", 4437400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_depth24", 4438400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_depth32", 4439400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_depth_texture", 4440400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_depth_texture_cube_map", 4441400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_EGL_image", 4442400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_EGL_image_external", 4443400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_EGL_sync", 4444400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_element_index_uint", 4445400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_framebuffer_object", 4446400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_packed_depth_stencil", 4447400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_rgb8_rgba8", 4448400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_standard_derivatives", 4449400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_texture_float", 4450400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_texture_float_linear", 4451400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_texture_half_float", 4452400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_texture_half_float_linear", 4453400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_texture_npot", 4454400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_OES_texture_3D", 445584d0e22331ea67a91156ddd57262adc1f0a38596Nicolas Capens "GL_OES_vertex_half_float", 4456400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_EXT_blend_minmax", 4457400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_EXT_color_buffer_half_float", 4458400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_EXT_draw_buffers", 4459400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_EXT_instanced_arrays", 4460400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_EXT_occlusion_query_boolean", 4461400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_EXT_read_format_bgra", 44620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#if (S3TC_SUPPORT) 4463400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_EXT_texture_compression_dxt1", 44640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#endif 4465400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_EXT_texture_filter_anisotropic", 4466400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_EXT_texture_format_BGRA8888", 44671728178cbc541adab6289344dbc8f09a0a147affAlexis Hetu "GL_EXT_texture_rg", 4468fba5b6d7fa0e1597c87c0ec71529c56997290941Alexis Hetu#if (ASTC_SUPPORT) 4469fba5b6d7fa0e1597c87c0ec71529c56997290941Alexis Hetu "GL_KHR_texture_compression_astc_hdr", 4470fba5b6d7fa0e1597c87c0ec71529c56997290941Alexis Hetu "GL_KHR_texture_compression_astc_ldr", 4471fba5b6d7fa0e1597c87c0ec71529c56997290941Alexis Hetu#endif 4472400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_ANGLE_framebuffer_blit", 4473400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_ANGLE_framebuffer_multisample", 4474400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_ANGLE_instanced_arrays", 44750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#if (S3TC_SUPPORT) 4476400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_ANGLE_texture_compression_dxt3", 4477400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_ANGLE_texture_compression_dxt5", 44780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#endif 4479010a464878f32daed863edee3fc6ad21920d605bAlexis Hetu "GL_CHROMIUM_texture_filtering_hint", 4480400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_NV_fence", 4481400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_NV_framebuffer_blit", 4482400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_NV_read_depth", 44830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 4484400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens 4485400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens // Extensions exclusive to OpenGL ES 3.0 and above. 4486400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens static const char *es3extensions[] = 4487400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens { 4488400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens "GL_EXT_color_buffer_float", 4489400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens }; 4490400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens 4491400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens GLuint numES2extensions = sizeof(es2extensions) / sizeof(es2extensions[0]); 4492400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens GLuint numExtensions = numES2extensions; 4493400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens 4494400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens if(clientVersion >= 3) 4495400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens { 4496400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens numExtensions += sizeof(es3extensions) / sizeof(es3extensions[0]); 4497400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens } 44980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 44990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(numExt) 45000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 45010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numExt = numExtensions; 4502400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens 45030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return nullptr; 45040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 45050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 45060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(index == GL_INVALID_INDEX) 45070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4508400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens static std::string extensionsCat; 4509400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens 4510400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens if(extensionsCat.empty() && (numExtensions > 0)) 45110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4512400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens for(const char *extension : es2extensions) 45130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4514400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens extensionsCat += std::string(extension) + " "; 45150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 45164d3efedb10ce60bdb7847336eba0360fdc9af9d3Alexis Hetu 45174d3efedb10ce60bdb7847336eba0360fdc9af9d3Alexis Hetu if(clientVersion >= 3) 45184d3efedb10ce60bdb7847336eba0360fdc9af9d3Alexis Hetu { 45194d3efedb10ce60bdb7847336eba0360fdc9af9d3Alexis Hetu for(const char *extension : es3extensions) 45204d3efedb10ce60bdb7847336eba0360fdc9af9d3Alexis Hetu { 45214d3efedb10ce60bdb7847336eba0360fdc9af9d3Alexis Hetu extensionsCat += std::string(extension) + " "; 45224d3efedb10ce60bdb7847336eba0360fdc9af9d3Alexis Hetu } 45234d3efedb10ce60bdb7847336eba0360fdc9af9d3Alexis Hetu } 45240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4525400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens 4526400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens return (const GLubyte*)extensionsCat.c_str(); 45270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 45280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 45290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(index >= numExtensions) 45300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 45310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return nullptr; 45320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 45330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4534400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens if(index < numES2extensions) 4535400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens { 4536400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens return (const GLubyte*)es2extensions[index]; 4537400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens } 4538400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens else 4539400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens { 4540400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens return (const GLubyte*)es3extensions[index - numES2extensions]; 4541400667e6604eb07e53a2894ede1f492fc3c0b117Nicolas Capens } 45420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 45430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 45440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 45450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4546506cc5e06043ba0819cc8f7c9190826faf47b1d6Nicolas CapensNO_SANITIZE_FUNCTION egl::Context *es2CreateContext(egl::Display *display, const egl::Context *shareContext, int clientVersion, const egl::Config *config) 45470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 45480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(!shareContext || shareContext->getClientVersion() == clientVersion); // Should be checked by eglCreateContext 4549f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas Capens return new es2::Context(display, static_cast<const es2::Context*>(shareContext), clientVersion, config); 45500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4551