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 es1::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 "Framebuffer.h" 260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Renderbuffer.h" 270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Texture.h" 280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "VertexDataManager.h" 290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "IndexDataManager.h" 300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "libEGL/Display.h" 3131c07a304f3247c26ba72eff0cb0a74eb05366e8Nicolas Capens#include "common/Surface.hpp" 320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Common/Half.hpp" 330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <EGL/eglext.h> 350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensusing std::abs; 370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensnamespace es1 390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 40f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas CapensContext::Context(egl::Display *const display, const Context *shareContext, const egl::Config *config) 41f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas Capens : egl::Context(display), config(config), 42e7e70d03ab0831543dfb5c89395ce4bf56298e3cNicolas Capens modelViewStack(MAX_MODELVIEW_STACK_DEPTH), 430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens projectionStack(MAX_PROJECTION_STACK_DEPTH), 440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureStack0(MAX_TEXTURE_STACK_DEPTH), 450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureStack1(MAX_TEXTURE_STACK_DEPTH) 460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Context *context = new sw::Context(); 480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device = new es1::Device(context); 490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mVertexDataManager = new VertexDataManager(this); 510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mIndexDataManager = new IndexDataManager(); 520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setClearColor(0.0f, 0.0f, 0.0f, 0.0f); 540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthClearValue = 1.0f; 560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilClearValue = 0; 570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.cullFaceEnabled = false; 590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.cullMode = GL_BACK; 600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.frontFace = GL_CCW; 610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthTestEnabled = false; 620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthFunc = GL_LESS; 630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEnabled = false; 640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendRGB = GL_ONE; 650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendAlpha = GL_ONE; 660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendRGB = GL_ZERO; 670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendAlpha = GL_ZERO; 680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationRGB = GL_FUNC_ADD_OES; 690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationAlpha = GL_FUNC_ADD_OES; 700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilTestEnabled = false; 710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilFunc = GL_ALWAYS; 720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilRef = 0; 730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilMask = -1; 740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilWritemask = -1; 750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilFail = GL_KEEP; 760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthFail = GL_KEEP; 770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthPass = GL_KEEP; 780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetFillEnabled = false; 790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetFactor = 0.0f; 800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetUnits = 0.0f; 810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleAlphaToCoverageEnabled = false; 820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageEnabled = false; 830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageValue = 1.0f; 840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageInvert = false; 850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorTestEnabled = false; 860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.ditherEnabled = true; 870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.shadeModel = GL_SMOOTH; 880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.generateMipmapHint = GL_DONT_CARE; 890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.perspectiveCorrectionHint = GL_DONT_CARE; 900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.fogHint = GL_DONT_CARE; 910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.lineWidth = 1.0f; 930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportX = 0; 950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportY = 0; 960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportWidth = 0; 970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportHeight = 0; 980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.zNear = 0.0f; 990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.zFar = 1.0f; 1000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorX = 0; 1020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorY = 0; 1030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorWidth = 0; 1040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorHeight = 0; 1050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskRed = true; 1070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskGreen = true; 1080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskBlue = true; 1090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskAlpha = true; 1100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthMask = true; 1110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_TEXTURE_UNITS; i++) 1130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].color = {0, 0, 0, 0}; 1150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].environmentMode = GL_MODULATE; 1160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].combineRGB = GL_MODULATE; 1170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].combineAlpha = GL_MODULATE; 1180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].src0RGB = GL_TEXTURE; 1190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].src1RGB = GL_PREVIOUS; 1200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].src2RGB = GL_CONSTANT; 1210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].src0Alpha = GL_TEXTURE; 1220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].src1Alpha = GL_PREVIOUS; 1230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].src2Alpha = GL_CONSTANT; 1240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].operand0RGB = GL_SRC_COLOR; 1250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].operand1RGB = GL_SRC_COLOR; 1260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].operand2RGB = GL_SRC_ALPHA; 1270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].operand0Alpha = GL_SRC_ALPHA; 1280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].operand1Alpha = GL_SRC_ALPHA; 1290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[i].operand2Alpha = GL_SRC_ALPHA; 1300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(shareContext) 1330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager = shareContext->mResourceManager; 1350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->addRef(); 1360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 1380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager = new ResourceManager(); 1400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 3.7 page 83: 1430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have twodimensional 1440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // and cube map texture state vectors respectively associated with them. 1450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // In order that access to these initial textures not be lost, they are treated as texture 1460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // objects all of whose names are 0. 1470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTexture2DZero = new Texture2D(0); 1490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTextureExternalZero = new TextureExternal(0); 1500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.activeSampler = 0; 1522ce08b140252b43dfb10d4d79acac26a1787dac9Nicolas Capens 1532ce08b140252b43dfb10d4d79acac26a1787dac9Nicolas Capens for(int type = 0; type < TEXTURE_TYPE_COUNT; type++) 1542ce08b140252b43dfb10d4d79acac26a1787dac9Nicolas Capens { 1552ce08b140252b43dfb10d4d79acac26a1787dac9Nicolas Capens bindTexture((TextureType)type, 0); 1562ce08b140252b43dfb10d4d79acac26a1787dac9Nicolas Capens } 1572ce08b140252b43dfb10d4d79acac26a1787dac9Nicolas Capens 1580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindArrayBuffer(0); 1590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindElementArrayBuffer(0); 1600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindFramebuffer(0); 1610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindRenderbuffer(0); 1620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packAlignment = 4; 1640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackAlignment = 4; 1650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidEnum = false; 1670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidValue = false; 1680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidOperation = false; 1690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mOutOfMemory = false; 1700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidFramebufferOperation = false; 1710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMatrixStackOverflow = false; 1720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMatrixStackUnderflow = false; 1730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens lightingEnabled = false; 1750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_LIGHTS; i++) 1770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[i].enabled = false; 1790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[i].ambient = {0.0f, 0.0f, 0.0f, 1.0f}; 1800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[i].diffuse = {0.0f, 0.0f, 0.0f, 1.0f}; 1810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[i].specular = {0.0f, 0.0f, 0.0f, 1.0f}; 1820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[i].position = {0.0f, 0.0f, 1.0f, 0.0f}; 1830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[i].direction = {0.0f, 0.0f, -1.0f}; 1840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[i].attenuation = {1.0f, 0.0f, 0.0f}; 1850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[i].spotExponent = 0.0f; 1860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[i].spotCutoffAngle = 180.0f; 1870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[0].diffuse = {1.0f, 1.0f, 1.0f, 1.0f}; 1900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[0].specular = {1.0f, 1.0f, 1.0f, 1.0f}; 1910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens globalAmbient = {0.2f, 0.2f, 0.2f, 1.0f}; 1930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialAmbient = {0.2f, 0.2f, 0.2f, 1.0f}; 1940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialDiffuse = {0.8f, 0.8f, 0.8f, 1.0f}; 1950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialSpecular = {0.0f, 0.0f, 0.0f, 1.0f}; 1960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialEmission = {0.0f, 0.0f, 0.0f, 1.0f}; 1970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialShininess = 0.0f; 1980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens lightModelTwoSide = false; 1990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens matrixMode = GL_MODELVIEW; 2010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_TEXTURE_UNITS; i++) 2030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens texture2Denabled[i] = false; 2050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureExternalEnabled[i] = false; 2060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens clientTexture = GL_TEXTURE0; 2090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setVertexAttrib(sw::Color0, 1.0f, 1.0f, 1.0f, 1.0f); 2110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_TEXTURE_UNITS; i++) 2130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setVertexAttrib(sw::TexCoord0 + i, 0.0f, 0.0f, 0.0f, 1.0f); 2150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setVertexAttrib(sw::Normal, 0.0f, 0.0f, 1.0f, 1.0f); 2180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setVertexAttrib(sw::PointSize, 1.0f, 1.0f, 1.0f, 1.0f); 2190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens clipFlags = 0; 2210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens alphaTestEnabled = false; 2230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens alphaTestFunc = GL_ALWAYS; 2240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens alphaTestRef = 0; 2250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens fogEnabled = false; 2270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens fogMode = GL_EXP; 2280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens fogDensity = 1.0f; 2290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens fogStart = 0.0f; 2300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens fogEnd = 1.0f; 2310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens fogColor = {0, 0, 0, 0}; 2320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens lineSmoothEnabled = false; 2340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens colorMaterialEnabled = false; 2350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens normalizeEnabled = false; 2360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens rescaleNormalEnabled = false; 2370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens multisampleEnabled = true; 2380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sampleAlphaToOneEnabled = false; 2390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens colorLogicOpEnabled = false; 2410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens logicalOperation = GL_COPY; 2420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pointSpriteEnabled = false; 2440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pointSmoothEnabled = false; 2450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pointSizeMin = 0.0f; 2460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pointSizeMax = 1.0f; 2470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pointDistanceAttenuation = {1.0f, 0.0f, 0.0f}; 2480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pointFadeThresholdSize = 1.0f; 2490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mHasBeenCurrent = false; 2510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens markAllStateDirty(); 2530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 2540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2550bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensContext::~Context() 2560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 2570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens while(!mFramebufferNameSpace.empty()) 2580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens deleteFramebuffer(mFramebufferNameSpace.firstName()); 2600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int type = 0; type < TEXTURE_TYPE_COUNT; type++) 2630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int sampler = 0; sampler < MAX_TEXTURE_UNITS; sampler++) 2650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.samplerTexture[type][sampler] = nullptr; 2670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_VERTEX_ATTRIBS; i++) 2710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[i].mBoundBuffer = nullptr; 2730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.arrayBuffer = nullptr; 2760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.elementArrayBuffer = nullptr; 2770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.renderbuffer = nullptr; 2780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTexture2DZero = nullptr; 2800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTextureExternalZero = nullptr; 2810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete mVertexDataManager; 2830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete mIndexDataManager; 2840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->release(); 2860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete device; 2870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 2880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28931c07a304f3247c26ba72eff0cb0a74eb05366e8Nicolas Capensvoid Context::makeCurrent(gl::Surface *surface) 2900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 2910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!mHasBeenCurrent) 2920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportX = 0; 2940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportY = 0; 2955cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu mState.viewportWidth = surface ? surface->getWidth() : 0; 2965cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu mState.viewportHeight = surface ? surface->getHeight() : 0; 2970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorX = 0; 2990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorY = 0; 3005cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu mState.scissorWidth = surface ? surface->getWidth() : 0; 3015cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu mState.scissorHeight = surface ? surface->getHeight() : 0; 3020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mHasBeenCurrent = true; 3040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 3050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Wrap the existing resources into GL objects and assign them to the '0' names 3075cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu egl::Image *defaultRenderTarget = surface ? surface->getRenderTarget() : nullptr; 3085cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu egl::Image *depthStencil = surface ? surface->getDepthStencil() : nullptr; 3090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Colorbuffer *colorbufferZero = new Colorbuffer(defaultRenderTarget); 3110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens DepthStencilbuffer *depthStencilbufferZero = new DepthStencilbuffer(depthStencil); 3120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebufferZero = new DefaultFramebuffer(colorbufferZero, depthStencilbufferZero); 3130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setFramebufferZero(framebufferZero); 3150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(defaultRenderTarget) 3170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens defaultRenderTarget->release(); 3190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 3200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(depthStencil) 3220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens depthStencil->release(); 3240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 3250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens markAllStateDirty(); 3270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 329f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas CapensEGLint Context::getClientVersion() const 3300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 1; 3320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 334f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas CapensEGLint Context::getConfigID() const 335f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas Capens{ 336f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas Capens return config->mConfigID; 337f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas Capens} 338f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas Capens 3390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// This function will set all of the state-related dirty flags, so that all state is set during next pre-draw. 3400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::markAllStateDirty() 3410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDepthStateDirty = true; 3430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMaskStateDirty = true; 3440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 3450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 3460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mPolygonOffsetStateDirty = true; 3470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = true; 3480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDitherStateDirty = true; 3490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFrontFaceDirty = true; 3500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setClearColor(float red, float green, float blue, float alpha) 3530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorClearValue.red = red; 3550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorClearValue.green = green; 3560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorClearValue.blue = blue; 3570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorClearValue.alpha = alpha; 3580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setClearDepth(float depth) 3610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthClearValue = depth; 3630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setClearStencil(int stencil) 3660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilClearValue = stencil; 3680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setCullFaceEnabled(bool enabled) 3710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.cullFaceEnabled = enabled; 3730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isCullFaceEnabled() const 3760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.cullFaceEnabled; 3780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setCullMode(GLenum mode) 3810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.cullMode = mode; 3830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFrontFace(GLenum front) 3860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.frontFace != front) 3880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.frontFace = front; 3900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFrontFaceDirty = true; 3910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 3920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDepthTestEnabled(bool enabled) 3950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthTestEnabled != enabled) 3970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthTestEnabled = enabled; 3990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDepthStateDirty = true; 4000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isDepthTestEnabled() const 4040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.depthTestEnabled; 4060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDepthFunc(GLenum depthFunc) 4090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthFunc != depthFunc) 4110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthFunc = depthFunc; 4130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDepthStateDirty = true; 4140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDepthRange(float zNear, float zFar) 4180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.zNear = zNear; 4200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.zFar = zFar; 4210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setAlphaTestEnabled(bool enabled) 4240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens alphaTestEnabled = enabled; 4260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isAlphaTestEnabled() const 4290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return alphaTestEnabled; 4310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setAlphaFunc(GLenum alphaFunc, GLclampf reference) 4340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens alphaTestFunc = alphaFunc; 4360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens alphaTestRef = reference; 4370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setBlendEnabled(bool enabled) 4400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.blendEnabled != enabled) 4420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEnabled = enabled; 4440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 4450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isBlendEnabled() const 4490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.blendEnabled; 4510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha) 4540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sourceBlendRGB != sourceRGB || 4560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendAlpha != sourceAlpha || 4570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendRGB != destRGB || 4580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendAlpha != destAlpha) 4590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendRGB = sourceRGB; 4610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendRGB = destRGB; 4620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendAlpha = sourceAlpha; 4630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendAlpha = destAlpha; 4640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 4650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation) 4690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.blendEquationRGB != rgbEquation || 4710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationAlpha != alphaEquation) 4720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationRGB = rgbEquation; 4740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationAlpha = alphaEquation; 4750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 4760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilTestEnabled(bool enabled) 4800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilTestEnabled != enabled) 4820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilTestEnabled = enabled; 4840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 4850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isStencilTestEnabled() const 4890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.stencilTestEnabled; 4910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask) 4940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilFunc != stencilFunc || 4960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilRef != stencilRef || 4970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilMask != stencilMask) 4980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilFunc = stencilFunc; 5000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilRef = (stencilRef > 0) ? stencilRef : 0; 5010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilMask = stencilMask; 5020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 5030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilWritemask(GLuint stencilWritemask) 5070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilWritemask != stencilWritemask) 5090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilWritemask = stencilWritemask; 5110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 5120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass) 5160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilFail != stencilFail || 5180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthFail != stencilPassDepthFail || 5190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthPass != stencilPassDepthPass) 5200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilFail = stencilFail; 5220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthFail = stencilPassDepthFail; 5230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthPass = stencilPassDepthPass; 5240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 5250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPolygonOffsetFillEnabled(bool enabled) 5290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.polygonOffsetFillEnabled != enabled) 5310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetFillEnabled = enabled; 5330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mPolygonOffsetStateDirty = true; 5340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isPolygonOffsetFillEnabled() const 5380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.polygonOffsetFillEnabled; 5400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPolygonOffsetParams(GLfloat factor, GLfloat units) 5430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.polygonOffsetFactor != factor || 5450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetUnits != units) 5460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetFactor = factor; 5480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetUnits = units; 5490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mPolygonOffsetStateDirty = true; 5500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSampleAlphaToCoverageEnabled(bool enabled) 5540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleAlphaToCoverageEnabled != enabled) 5560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleAlphaToCoverageEnabled = enabled; 5580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = true; 5590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isSampleAlphaToCoverageEnabled() const 5630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.sampleAlphaToCoverageEnabled; 5650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSampleCoverageEnabled(bool enabled) 5680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageEnabled != enabled) 5700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageEnabled = enabled; 5720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = true; 5730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isSampleCoverageEnabled() const 5770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.sampleCoverageEnabled; 5790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSampleCoverageParams(GLclampf value, bool invert) 5820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageValue != value || 5840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageInvert != invert) 5850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageValue = value; 5870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageInvert = invert; 5880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = true; 5890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setScissorTestEnabled(bool enabled) 5930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorTestEnabled = enabled; 5950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isScissorTestEnabled() const 5980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.scissorTestEnabled; 6000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setShadeModel(GLenum mode) 6030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.shadeModel = mode; 6050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDitherEnabled(bool enabled) 6080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.ditherEnabled != enabled) 6100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 6110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.ditherEnabled = enabled; 6120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDitherStateDirty = true; 6130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 6140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isDitherEnabled() const 6170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.ditherEnabled; 6190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLightingEnabled(bool enable) 6220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens lightingEnabled = enable; 6240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isLightingEnabled() const 6270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return lightingEnabled; 6290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLightEnabled(int index, bool enable) 6320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[index].enabled = enable; 6340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isLightEnabled(int index) const 6370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return light[index].enabled; 6390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLightAmbient(int index, float r, float g, float b, float a) 6420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[index].ambient = {r, g, b, a}; 6440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLightDiffuse(int index, float r, float g, float b, float a) 6470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[index].diffuse = {r, g, b, a}; 6490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLightSpecular(int index, float r, float g, float b, float a) 6520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[index].specular = {r, g, b, a}; 6540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLightPosition(int index, float x, float y, float z, float w) 6570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::float4 v = {x, y, z, w}; 6590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Transform from object coordinates to eye coordinates 6610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v = modelViewStack.current() * v; 6620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[index].position = {v.x, v.y, v.z, v.w}; 6640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLightDirection(int index, float x, float y, float z) 6670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // FIXME: Transform by inverse of 3x3 model-view matrix 6690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[index].direction = {x, y, z}; 6700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLightAttenuationConstant(int index, float constant) 6730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[index].attenuation.constant = constant; 6750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLightAttenuationLinear(int index, float linear) 6780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[index].attenuation.linear = linear; 6800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLightAttenuationQuadratic(int index, float quadratic) 6830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[index].attenuation.quadratic = quadratic; 6850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSpotLightExponent(int index, float exponent) 6880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[index].spotExponent = exponent; 6900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSpotLightCutoff(int index, float cutoff) 6930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens light[index].spotCutoffAngle = cutoff; 6950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setGlobalAmbient(float red, float green, float blue, float alpha) 6980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens globalAmbient.red = red; 7000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens globalAmbient.green = green; 7010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens globalAmbient.blue = blue; 7020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens globalAmbient.alpha = alpha; 7030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setMaterialAmbient(float red, float green, float blue, float alpha) 7060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialAmbient.red = red; 7080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialAmbient.green = green; 7090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialAmbient.blue = blue; 7100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialAmbient.alpha = alpha; 7110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setMaterialDiffuse(float red, float green, float blue, float alpha) 7140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialDiffuse.red = red; 7160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialDiffuse.green = green; 7170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialDiffuse.blue = blue; 7180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialDiffuse.alpha = alpha; 7190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setMaterialSpecular(float red, float green, float blue, float alpha) 7220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialSpecular.red = red; 7240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialSpecular.green = green; 7250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialSpecular.blue = blue; 7260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialSpecular.alpha = alpha; 7270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setMaterialEmission(float red, float green, float blue, float alpha) 7300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialEmission.red = red; 7320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialEmission.green = green; 7330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialEmission.blue = blue; 7340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialEmission.alpha = alpha; 7350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setMaterialShininess(float shininess) 7380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens materialShininess = shininess; 7400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLightModelTwoSide(bool enable) 7430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens lightModelTwoSide = enable; 7450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFogEnabled(bool enable) 7480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens fogEnabled = enable; 7500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isFogEnabled() const 7530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return fogEnabled; 7550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFogMode(GLenum mode) 7580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens fogMode = mode; 7600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFogDensity(float fogDensity) 7630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens this->fogDensity = fogDensity; 7650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFogStart(float fogStart) 7680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens this->fogStart = fogStart; 7700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFogEnd(float fogEnd) 7730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens this->fogEnd = fogEnd; 7750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFogColor(float r, float g, float b, float a) 7780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens this->fogColor = {r, g, b, a}; 7800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setTexture2Denabled(bool enable) 7830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens texture2Denabled[mState.activeSampler] = enable; 7850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isTexture2Denabled() const 7880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return texture2Denabled[mState.activeSampler]; 7900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setTextureExternalEnabled(bool enable) 7930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureExternalEnabled[mState.activeSampler] = enable; 7950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isTextureExternalEnabled() const 7980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return textureExternalEnabled[mState.activeSampler]; 8000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLineWidth(GLfloat width) 8030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.lineWidth = width; 8050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLineWidth(clamp(width, ALIASED_LINE_WIDTH_RANGE_MIN, ALIASED_LINE_WIDTH_RANGE_MAX)); 8060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setGenerateMipmapHint(GLenum hint) 8090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.generateMipmapHint = hint; 8110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPerspectiveCorrectionHint(GLenum hint) 8140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.perspectiveCorrectionHint = hint; 8160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFogHint(GLenum hint) 8190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.fogHint = hint; 8210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height) 8240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportX = x; 8260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportY = y; 8270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportWidth = width; 8280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportHeight = height; 8290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height) 8320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorX = x; 8340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorY = y; 8350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorWidth = width; 8360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorHeight = height; 8370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setColorMask(bool red, bool green, bool blue, bool alpha) 8400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.colorMaskRed != red || mState.colorMaskGreen != green || 8420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskBlue != blue || mState.colorMaskAlpha != alpha) 8430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 8440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskRed = red; 8450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskGreen = green; 8460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskBlue = blue; 8470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskAlpha = alpha; 8480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMaskStateDirty = true; 8490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 8500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDepthMask(bool mask) 8530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthMask != mask) 8550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 8560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthMask = mask; 8570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMaskStateDirty = true; 8580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 8590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setActiveSampler(unsigned int active) 8620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.activeSampler = active; 8640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8660bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getFramebufferName() const 8670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.framebuffer; 8690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8710bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getRenderbufferName() const 8720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.renderbuffer.name(); 8740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8760bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getArrayBufferName() const 8770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.arrayBuffer.name(); 8790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setVertexAttribArrayEnabled(unsigned int attribNum, bool enabled) 8820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mArrayEnabled = enabled; 8840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensconst VertexAttribute &Context::getVertexAttribState(unsigned int attribNum) 8870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.vertexAttribute[attribNum]; 8890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type, bool normalized, 8920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLsizei stride, const void *pointer) 8930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mBoundBuffer = boundBuffer; 8950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mSize = size; 8960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mType = type; 8970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mNormalized = normalized; 8980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mStride = stride; 8990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mPointer = pointer; 9000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensconst void *Context::getVertexAttribPointer(unsigned int attribNum) const 9030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.vertexAttribute[attribNum].mPointer; 9050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensconst VertexAttributeArray &Context::getVertexAttributes() 9080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.vertexAttribute; 9100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPackAlignment(GLint alignment) 9130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packAlignment = alignment; 9150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9170bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLint Context::getPackAlignment() const 9180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.packAlignment; 9200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setUnpackAlignment(GLint alignment) 9230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackAlignment = alignment; 9250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9270bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLint Context::getUnpackAlignment() const 9280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.unpackAlignment; 9300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9320bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createBuffer() 9330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createBuffer(); 9350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9370bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createTexture() 9380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createTexture(); 9400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9420bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createRenderbuffer() 9430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createRenderbuffer(); 9450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Returns an unused framebuffer name 9480bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createFramebuffer() 9490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mFramebufferNameSpace.allocate(); 9510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteBuffer(GLuint buffer) 9540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens detachBuffer(buffer); 9560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteBuffer(buffer); 9580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteTexture(GLuint texture) 9610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens detachTexture(texture); 9630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteTexture(texture); 9650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteRenderbuffer(GLuint renderbuffer) 9680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens detachRenderbuffer(renderbuffer); 9700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteRenderbuffer(renderbuffer); 9720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteFramebuffer(GLuint framebuffer) 9750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens detachFramebuffer(framebuffer); 9770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebufferObject = mFramebufferNameSpace.remove(framebuffer); 9790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(framebufferObject) 9810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 9820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete framebufferObject; 9830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 9840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9860bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getBuffer(GLuint handle) 9870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getBuffer(handle); 9890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9910bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTexture *Context::getTexture(GLuint handle) 9920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getTexture(handle); 9940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9960bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensRenderbuffer *Context::getRenderbuffer(GLuint handle) 9970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getRenderbuffer(handle); 9990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10010bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensFramebuffer *Context::getFramebuffer() 10020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return getFramebuffer(mState.framebuffer); 10040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindArrayBuffer(unsigned int buffer) 10070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 10090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.arrayBuffer = getBuffer(buffer); 10110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindElementArrayBuffer(unsigned int buffer) 10140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 10160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.elementArrayBuffer = getBuffer(buffer); 10180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10202ce08b140252b43dfb10d4d79acac26a1787dac9Nicolas Capensvoid Context::bindTexture(TextureType type, GLuint texture) 10210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10222ce08b140252b43dfb10d4d79acac26a1787dac9Nicolas Capens mResourceManager->checkTextureAllocation(texture, type); 10230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10242ce08b140252b43dfb10d4d79acac26a1787dac9Nicolas Capens mState.samplerTexture[type][mState.activeSampler] = getTexture(texture); 10250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindFramebuffer(GLuint framebuffer) 10280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!getFramebuffer(framebuffer)) 10300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFramebufferNameSpace.insert(framebuffer, new Framebuffer()); 10320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.framebuffer = framebuffer; 10350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindRenderbuffer(GLuint renderbuffer) 10380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkRenderbufferAllocation(renderbuffer); 10400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.renderbuffer = getRenderbuffer(renderbuffer); 10420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFramebufferZero(Framebuffer *buffer) 10450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete mFramebufferNameSpace.remove(0); 10470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFramebufferNameSpace.insert(0, buffer); 10480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setRenderbufferStorage(RenderbufferStorage *renderbuffer) 10510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *renderbufferObject = mState.renderbuffer; 10530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens renderbufferObject->setStorage(renderbuffer); 10540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10560bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensFramebuffer *Context::getFramebuffer(unsigned int handle) 10570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mFramebufferNameSpace.find(handle); 10590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10610bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getArrayBuffer() 10620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.arrayBuffer; 10640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10660bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getElementArrayBuffer() 10670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.elementArrayBuffer; 10690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10710bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTexture2D *Context::getTexture2D() 10720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return static_cast<Texture2D*>(getSamplerTexture(mState.activeSampler, TEXTURE_2D)); 10740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10760bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTextureExternal *Context::getTextureExternal() 10770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return static_cast<TextureExternal*>(getSamplerTexture(mState.activeSampler, TEXTURE_EXTERNAL)); 10790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10810bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTexture *Context::getSamplerTexture(unsigned int sampler, TextureType type) 10820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLuint texid = mState.samplerTexture[type][sampler].name(); 10840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(texid == 0) // Special case: 0 refers to different initial textures based on the target 10860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(type) 10880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case TEXTURE_2D: return mTexture2DZero; 10900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case TEXTURE_EXTERNAL: return mTextureExternalZero; 10910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(type); 10920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.samplerTexture[type][sampler]; 10960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::getBooleanv(GLenum pname, GLboolean *params) 10990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 11010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 11020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_INVERT: *params = mState.sampleCoverageInvert; break; 11030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_WRITEMASK: *params = mState.depthMask; break; 11040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_WRITEMASK: 11050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.colorMaskRed; 11060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.colorMaskGreen; 11070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.colorMaskBlue; 11080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.colorMaskAlpha; 11090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 11100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CULL_FACE: *params = mState.cullFaceEnabled; break; 11110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FILL: *params = mState.polygonOffsetFillEnabled; break; 11120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mState.sampleAlphaToCoverageEnabled; break; 11130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE: *params = mState.sampleCoverageEnabled; break; 11140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_TEST: *params = mState.scissorTestEnabled; break; 11150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_TEST: *params = mState.stencilTestEnabled; break; 11160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_TEST: *params = mState.depthTestEnabled; break; 11170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND: *params = mState.blendEnabled; break; 11180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DITHER: *params = mState.ditherEnabled; break; 11190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LIGHT_MODEL_TWO_SIDE: *params = lightModelTwoSide; break; 11200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 11210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 11220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 11230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 11250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::getFloatv(GLenum pname, GLfloat *params) 11280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation 11300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // because it is stored as a float, despite the fact that the GL ES 2.0 spec names 11310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // GetIntegerv as its native query function. As it would require conversion in any 11320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // case, this should make no difference to the calling application. 11330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 11340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 11350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_WIDTH: *params = mState.lineWidth; break; 11360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_VALUE: *params = mState.sampleCoverageValue; break; 11370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_CLEAR_VALUE: *params = mState.depthClearValue; break; 11380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FACTOR: *params = mState.polygonOffsetFactor; break; 11390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_UNITS: *params = mState.polygonOffsetUnits; break; 11400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_LINE_WIDTH_RANGE: 11410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = ALIASED_LINE_WIDTH_RANGE_MIN; 11420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = ALIASED_LINE_WIDTH_RANGE_MAX; 11430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 11440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_POINT_SIZE_RANGE: 11450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = ALIASED_POINT_SIZE_RANGE_MIN; 11460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = ALIASED_POINT_SIZE_RANGE_MAX; 11470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 11480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SMOOTH_LINE_WIDTH_RANGE: 11490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = SMOOTH_LINE_WIDTH_RANGE_MIN; 11500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = SMOOTH_LINE_WIDTH_RANGE_MAX; 11510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 11520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SMOOTH_POINT_SIZE_RANGE: 11530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = SMOOTH_POINT_SIZE_RANGE_MIN; 11540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = SMOOTH_POINT_SIZE_RANGE_MAX; 11550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 11560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_RANGE: 11570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.zNear; 11580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.zFar; 11590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 11600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_CLEAR_VALUE: 11610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.colorClearValue.red; 11620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.colorClearValue.green; 11630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.colorClearValue.blue; 11640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.colorClearValue.alpha; 11650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 11660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: 11670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = MAX_TEXTURE_MAX_ANISOTROPY; 11680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 11690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MODELVIEW_MATRIX: 11700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < 16; i++) 11710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 11720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[i] = modelViewStack.current()[i % 4][i / 4]; 11730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 11740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 11750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PROJECTION_MATRIX: 11760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < 16; i++) 11770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 11780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[i] = projectionStack.current()[i % 4][i / 4]; 11790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 11800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 118159dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens case GL_CURRENT_COLOR: 118259dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens for(int i = 0; i < 4; i++) 118359dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens { 118459dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens params[i] = mState.vertexAttribute[sw::Color0].mCurrentValue[i]; 118559dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens } 118659dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens break; 118759dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens case GL_CURRENT_NORMAL: 118859dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens for(int i = 0; i < 3; i++) 118959dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens { 119059dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens params[i] = mState.vertexAttribute[sw::Normal].mCurrentValue[i]; 119159dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens } 119259dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens break; 119359dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens case GL_CURRENT_TEXTURE_COORDS: 119459dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens for(int i = 0; i < 4; i++) 119559dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens { 119659dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens params[i] = mState.vertexAttribute[sw::TexCoord0].mCurrentValue[i]; 119759dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens } 119859dca946c7ffe8b170c3886d4cdca2af7c68428cNicolas Capens break; 11990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 12000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 12010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 12040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::getIntegerv(GLenum pname, GLint *params) 12070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation 12090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // because it is stored as a float, despite the fact that the GL ES 2.0 spec names 12100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // GetIntegerv as its native query function. As it would require conversion in any 12110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // case, this should make no difference to the calling application. You may find it in 12120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Context::getFloatv. 12130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 12140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ARRAY_BUFFER_BINDING: *params = mState.arrayBuffer.name(); break; 12160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ELEMENT_ARRAY_BUFFER_BINDING: *params = mState.elementArrayBuffer.name(); break; 12170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRAMEBUFFER_BINDING_OES: *params = mState.framebuffer; break; 12180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RENDERBUFFER_BINDING_OES: *params = mState.renderbuffer.name(); break; 12190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PACK_ALIGNMENT: *params = mState.packAlignment; break; 12200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNPACK_ALIGNMENT: *params = mState.unpackAlignment; break; 12210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GENERATE_MIPMAP_HINT: *params = mState.generateMipmapHint; break; 12220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PERSPECTIVE_CORRECTION_HINT: *params = mState.perspectiveCorrectionHint; break; 12230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ACTIVE_TEXTURE: *params = (mState.activeSampler + GL_TEXTURE0); break; 12240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_FUNC: *params = mState.stencilFunc; break; 12250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_REF: *params = mState.stencilRef; break; 12260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_VALUE_MASK: *params = mState.stencilMask; break; 12270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_FAIL: *params = mState.stencilFail; break; 12280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_PASS_DEPTH_FAIL: *params = mState.stencilPassDepthFail; break; 12290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_PASS_DEPTH_PASS: *params = mState.stencilPassDepthPass; break; 12300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_FUNC: *params = mState.depthFunc; break; 12310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_SRC_RGB_OES: *params = mState.sourceBlendRGB; break; 12320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_SRC_ALPHA_OES: *params = mState.sourceBlendAlpha; break; 12330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_DST_RGB_OES: *params = mState.destBlendRGB; break; 12340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_DST_ALPHA_OES: *params = mState.destBlendAlpha; break; 12350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_EQUATION_RGB_OES: *params = mState.blendEquationRGB; break; 12360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_EQUATION_ALPHA_OES: *params = mState.blendEquationAlpha; break; 12370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_WRITEMASK: *params = mState.stencilWritemask; break; 12380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_CLEAR_VALUE: *params = mState.stencilClearValue; break; 12390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SUBPIXEL_BITS: *params = 4; break; 12400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_SIZE: *params = IMPLEMENTATION_MAX_TEXTURE_SIZE; break; 12410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NUM_COMPRESSED_TEXTURE_FORMATS: *params = NUM_COMPRESSED_TEXTURE_FORMATS; break; 12420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_BUFFERS: 12430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLES: 12440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getFramebuffer(); 12460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int width, height, samples; 12470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12485cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu if(framebuffer && (framebuffer->completeness(width, height, samples) == GL_FRAMEBUFFER_COMPLETE_OES)) 12490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 12510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_BUFFERS: 12530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(samples > 1) 12540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 1; 12560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 12580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 12600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 12620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLES: 12630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = samples; 12640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 12650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 12680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 12700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 12730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES: 12740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getFramebuffer(); 12765cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu if(framebuffer) 12775cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu { 12785cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu *params = framebuffer->getImplementationColorReadType(); 12795cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu } 12805cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu else 12815cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu { 12825cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu return error(GL_INVALID_OPERATION, true); 12835cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu } 12840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 12860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES: 12870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getFramebuffer(); 12895cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu if(framebuffer) 12905cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu { 12915cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu *params = framebuffer->getImplementationColorReadFormat(); 12925cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu } 12935cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu else 12945cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu { 12955cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu return error(GL_INVALID_OPERATION, true); 12965cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu } 12970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 12990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VIEWPORT_DIMS: 13000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int maxDimension = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE; 13020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = maxDimension; 13030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = maxDimension; 13040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COMPRESSED_TEXTURE_FORMATS: 13070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < NUM_COMPRESSED_TEXTURE_FORMATS; i++) 13090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[i] = compressedTextureFormats[i]; 13110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VIEWPORT: 13150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.viewportX; 13160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.viewportY; 13170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.viewportWidth; 13180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.viewportHeight; 13190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_BOX: 13210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.scissorX; 13220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.scissorY; 13230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.scissorWidth; 13240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.scissorHeight; 13250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CULL_FACE_MODE: *params = mState.cullMode; break; 13270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRONT_FACE: *params = mState.frontFace; break; 13280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RED_BITS: 13290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GREEN_BITS: 13300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLUE_BITS: 13310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALPHA_BITS: 13320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getFramebuffer(); 13345cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu Renderbuffer *colorbuffer = framebuffer ? framebuffer->getColorbuffer() : nullptr; 13350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(colorbuffer) 13370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 13390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RED_BITS: *params = colorbuffer->getRedSize(); break; 13410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break; 13420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); break; 13430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break; 13440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 13470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 13490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_BITS: 13530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getFramebuffer(); 13555cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu Renderbuffer *depthbuffer = framebuffer ? framebuffer->getDepthbuffer() : nullptr; 13560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(depthbuffer) 13580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = depthbuffer->getDepthSize(); 13600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 13620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 13640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BITS: 13680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getFramebuffer(); 13705cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu Renderbuffer *stencilbuffer = framebuffer ? framebuffer->getStencilbuffer() : nullptr; 13710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(stencilbuffer) 13730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = stencilbuffer->getStencilSize(); 13750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 13770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 13790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_2D: *params = mState.samplerTexture[TEXTURE_2D][mState.activeSampler].name(); break; 13830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_EXTERNAL_OES: *params = mState.samplerTexture[TEXTURE_EXTERNAL][mState.activeSampler].name(); break; 13840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_LIGHTS: *params = MAX_LIGHTS; break; 13850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_MODELVIEW_STACK_DEPTH: *params = MAX_MODELVIEW_STACK_DEPTH; break; 13860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_PROJECTION_STACK_DEPTH: *params = MAX_PROJECTION_STACK_DEPTH; break; 13870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_STACK_DEPTH: *params = MAX_TEXTURE_STACK_DEPTH; break; 13880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_UNITS: *params = MAX_TEXTURE_UNITS; break; 13890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_CLIP_PLANES: *params = MAX_CLIP_PLANES; break; 13900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_ARRAY_TYPE_OES: *params = mState.vertexAttribute[sw::PointSize].mType; break; 13910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_ARRAY_STRIDE_OES: *params = mState.vertexAttribute[sw::PointSize].mStride; break; 13920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES: *params = mState.vertexAttribute[sw::PointSize].mBoundBuffer.name(); break; 13930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VERTEX_ARRAY_SIZE: *params = mState.vertexAttribute[sw::Position].mSize; break; 13940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VERTEX_ARRAY_TYPE: *params = mState.vertexAttribute[sw::Position].mType; break; 13950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VERTEX_ARRAY_STRIDE: *params = mState.vertexAttribute[sw::Position].mStride; break; 13960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VERTEX_ARRAY_BUFFER_BINDING: *params = mState.vertexAttribute[sw::Position].mBoundBuffer.name(); break; 13970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NORMAL_ARRAY_TYPE: *params = mState.vertexAttribute[sw::Normal].mType; break; 13980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NORMAL_ARRAY_STRIDE: *params = mState.vertexAttribute[sw::Normal].mStride; break; 13990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NORMAL_ARRAY_BUFFER_BINDING: *params = mState.vertexAttribute[sw::Normal].mBoundBuffer.name(); break; 14000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_ARRAY_SIZE: *params = mState.vertexAttribute[sw::Color0].mSize; break; 14010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_ARRAY_TYPE: *params = mState.vertexAttribute[sw::Color0].mType; break; 14020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_ARRAY_STRIDE: *params = mState.vertexAttribute[sw::Color0].mStride; break; 14030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_ARRAY_BUFFER_BINDING: *params = mState.vertexAttribute[sw::Color0].mBoundBuffer.name(); break; 14040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_COORD_ARRAY_SIZE: *params = mState.vertexAttribute[sw::TexCoord0 + mState.activeSampler].mSize; break; 14050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_COORD_ARRAY_TYPE: *params = mState.vertexAttribute[sw::TexCoord0 + mState.activeSampler].mType; break; 14060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_COORD_ARRAY_STRIDE: *params = mState.vertexAttribute[sw::TexCoord0 + mState.activeSampler].mStride; break; 14070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING: *params = mState.vertexAttribute[sw::TexCoord0 + mState.activeSampler].mBoundBuffer.name(); break; 14080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 14090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 14100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 14130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::getPointerv(GLenum pname, const GLvoid **params) 14160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 14180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VERTEX_ARRAY_POINTER: *params = mState.vertexAttribute[sw::Position].mPointer; break; 14200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NORMAL_ARRAY_POINTER: *params = mState.vertexAttribute[sw::Normal].mPointer; break; 14210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_ARRAY_POINTER: *params = mState.vertexAttribute[sw::Color0].mPointer; break; 14220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_ARRAY_POINTER_OES: *params = mState.vertexAttribute[sw::PointSize].mPointer; break; 14230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_COORD_ARRAY_POINTER: *params = mState.vertexAttribute[sw::TexCoord0 + mState.activeSampler].mPointer; break; 14240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 14250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 14260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 14290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensint Context::getQueryParameterNum(GLenum pname) 14320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation 14340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due 14350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // to the fact that it is stored internally as a float, and so would require conversion 14360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // if returned from Context::getIntegerv. Since this conversion is already implemented 14370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we 14380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling 14390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // application. 14400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 14410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COMPRESSED_TEXTURE_FORMATS: 14430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return NUM_COMPRESSED_TEXTURE_FORMATS; 14440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NUM_COMPRESSED_TEXTURE_FORMATS: 14450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ARRAY_BUFFER_BINDING: 14460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRAMEBUFFER_BINDING_OES: 14470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RENDERBUFFER_BINDING_OES: 14480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PACK_ALIGNMENT: 14490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNPACK_ALIGNMENT: 14500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GENERATE_MIPMAP_HINT: 14510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RED_BITS: 14520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GREEN_BITS: 14530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLUE_BITS: 14540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALPHA_BITS: 14550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_BITS: 14560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BITS: 14570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ELEMENT_ARRAY_BUFFER_BINDING: 14580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CULL_FACE_MODE: 14590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRONT_FACE: 14600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ACTIVE_TEXTURE: 14610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_FUNC: 14620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_VALUE_MASK: 14630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_REF: 14640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_FAIL: 14650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_PASS_DEPTH_FAIL: 14660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_PASS_DEPTH_PASS: 14670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_FUNC: 14680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_SRC_RGB_OES: 14690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_SRC_ALPHA_OES: 14700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_DST_RGB_OES: 14710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_DST_ALPHA_OES: 14720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_EQUATION_RGB_OES: 14730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_EQUATION_ALPHA_OES: 14740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_WRITEMASK: 14750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_CLEAR_VALUE: 14760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SUBPIXEL_BITS: 14770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_SIZE: 14780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES: 14790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_BUFFERS: 14800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLES: 14810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES: 14820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES: 14830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_2D: 14840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_CUBE_MAP_OES: 14850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_EXTERNAL_OES: 14860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 1; 14870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VIEWPORT_DIMS: 14880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 2; 14890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VIEWPORT: 14900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_BOX: 14910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 4; 14920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_INVERT: 14930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_WRITEMASK: 14940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled, 14950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries. 14960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as bool-natural 14970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE: 14980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_TEST: 14990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_TEST: 15000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_TEST: 15010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND: 15020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DITHER: 15030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 1; 15040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_WRITEMASK: 15050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 4; 15060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FACTOR: 15070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_UNITS: 15080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_VALUE: 15090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_CLEAR_VALUE: 15100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_WIDTH: 15110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 1; 15120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_LINE_WIDTH_RANGE: 15130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_POINT_SIZE_RANGE: 15140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_RANGE: 15150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 2; 15160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_CLEAR_VALUE: 15170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 4; 15180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: 15190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_LIGHTS: 15200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_MODELVIEW_STACK_DEPTH: 15210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_PROJECTION_STACK_DEPTH: 15220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_STACK_DEPTH: 15230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_UNITS: 15240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_CLIP_PLANES: 15250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_ARRAY_TYPE_OES: 15260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_ARRAY_STRIDE_OES: 15270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES: 15280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 1; 15290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CURRENT_COLOR: 15300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 4; 15310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CURRENT_NORMAL: 15320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 3; 15330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CURRENT_TEXTURE_COORDS: 15340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 4; 15350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE: 15360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_MIN: 15370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_MAX: 15380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_FADE_THRESHOLD_SIZE: 15390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 1; 15400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_DISTANCE_ATTENUATION: 15410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 3; 15420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SMOOTH_POINT_SIZE_RANGE: 15430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SMOOTH_LINE_WIDTH_RANGE: 15440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 2; 15450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SHADE_MODEL: 15460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MATRIX_MODE: 15470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MODELVIEW_STACK_DEPTH: 15480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PROJECTION_STACK_DEPTH: 15490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_STACK_DEPTH: 15500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 1; 15510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MODELVIEW_MATRIX: 15520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PROJECTION_MATRIX: 15530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_MATRIX: 15540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 16; 15550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALPHA_TEST_FUNC: 15560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALPHA_TEST_REF: 15570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_DST: 15580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_SRC: 15590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LOGIC_OP_MODE: 15600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VERTEX_ARRAY_SIZE: 15610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VERTEX_ARRAY_TYPE: 15620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VERTEX_ARRAY_STRIDE: 15630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NORMAL_ARRAY_TYPE: 15640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NORMAL_ARRAY_STRIDE: 15650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_ARRAY_SIZE: 15660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_ARRAY_TYPE: 15670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_ARRAY_STRIDE: 15680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_COORD_ARRAY_SIZE: 15690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_COORD_ARRAY_TYPE: 15700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_COORD_ARRAY_STRIDE: 15710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VERTEX_ARRAY_POINTER: 15720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NORMAL_ARRAY_POINTER: 15730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_ARRAY_POINTER: 15740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_COORD_ARRAY_POINTER: 15750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LIGHT_MODEL_TWO_SIDE: 15760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 1; 15770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 15780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNREACHABLE(pname); 15790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 15800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 15810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return -1; 15820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 15830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 15840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isQueryParameterInt(GLenum pname) 15850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 15860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation 15870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due 15880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // to the fact that it is stored internally as a float, and so would require conversion 15890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // if returned from Context::getIntegerv. Since this conversion is already implemented 15900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we 15910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling 15920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // application. 15930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 15940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 15950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COMPRESSED_TEXTURE_FORMATS: 15960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NUM_COMPRESSED_TEXTURE_FORMATS: 15970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ARRAY_BUFFER_BINDING: 15980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRAMEBUFFER_BINDING_OES: 15990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RENDERBUFFER_BINDING_OES: 16000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PACK_ALIGNMENT: 16010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNPACK_ALIGNMENT: 16020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GENERATE_MIPMAP_HINT: 16030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RED_BITS: 16040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GREEN_BITS: 16050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLUE_BITS: 16060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALPHA_BITS: 16070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_BITS: 16080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BITS: 16090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ELEMENT_ARRAY_BUFFER_BINDING: 16100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CULL_FACE_MODE: 16110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRONT_FACE: 16120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ACTIVE_TEXTURE: 16130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_FUNC: 16140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_VALUE_MASK: 16150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_REF: 16160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_FAIL: 16170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_PASS_DEPTH_FAIL: 16180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_PASS_DEPTH_PASS: 16190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_FUNC: 16200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_SRC_RGB_OES: 16210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_SRC_ALPHA_OES: 16220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_DST_RGB_OES: 16230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_DST_ALPHA_OES: 16240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_EQUATION_RGB_OES: 16250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_EQUATION_ALPHA_OES: 16260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_WRITEMASK: 16270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_CLEAR_VALUE: 16280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SUBPIXEL_BITS: 16290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_SIZE: 16300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES: 16310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_BUFFERS: 16320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLES: 16330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES: 16340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES: 16350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_2D: 16360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_CUBE_MAP_OES: 16370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_EXTERNAL_OES: 16380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VIEWPORT_DIMS: 16390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VIEWPORT: 16400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_BOX: 16410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_LIGHTS: 16420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_MODELVIEW_STACK_DEPTH: 16430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_PROJECTION_STACK_DEPTH: 16440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_STACK_DEPTH: 16450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_UNITS: 16460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_CLIP_PLANES: 16470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_ARRAY_TYPE_OES: 16480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_ARRAY_STRIDE_OES: 16490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES: 16500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 16510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 16540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 16550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isQueryParameterFloat(GLenum pname) 16570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 16580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation 16590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due 16600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // to the fact that it is stored internally as a float, and so would require conversion 16610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // if returned from Context::getIntegerv. Since this conversion is already implemented 16620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we 16630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling 16640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // application. 16650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 16660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FACTOR: 16680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_UNITS: 16690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_VALUE: 16700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_CLEAR_VALUE: 16710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_WIDTH: 16720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_LINE_WIDTH_RANGE: 16730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_POINT_SIZE_RANGE: 16740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SMOOTH_LINE_WIDTH_RANGE: 16750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SMOOTH_POINT_SIZE_RANGE: 16760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_RANGE: 16770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_CLEAR_VALUE: 16780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: 16790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LIGHT_MODEL_AMBIENT: 16800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_MIN: 16810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_MAX: 16820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_DISTANCE_ATTENUATION: 16830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_FADE_THRESHOLD_SIZE: 16840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 16850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 16880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 16890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isQueryParameterBool(GLenum pname) 16910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 16920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 16930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_INVERT: 16950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_WRITEMASK: 16960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled, 16970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries. 16980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as bool-natural 16990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE: 17000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_TEST: 17010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_TEST: 17020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_TEST: 17030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND: 17040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DITHER: 17050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_WRITEMASK: 17060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LIGHT_MODEL_TWO_SIDE: 17070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 17080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 17110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 17120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isQueryParameterPointer(GLenum pname) 17140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 17150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 17160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VERTEX_ARRAY_POINTER: 17180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NORMAL_ARRAY_POINTER: 17190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_ARRAY_POINTER: 17200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_COORD_ARRAY_POINTER: 17210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINT_SIZE_ARRAY_POINTER_OES: 17220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 17230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 17260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 17270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Applies the render target surface, depth stencil surface, viewport rectangle and scissor rectangle 17290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::applyRenderTarget() 17300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 17310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getFramebuffer(); 17320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int width, height, samples; 17330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!framebuffer || framebuffer->completeness(width, height, samples) != GL_FRAMEBUFFER_COMPLETE_OES) 17350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_FRAMEBUFFER_OPERATION_OES, false); 17370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *renderTarget = framebuffer->getRenderTarget(); 17400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setRenderTarget(0, renderTarget); 17410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(renderTarget) renderTarget->release(); 17420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *depthBuffer = framebuffer->getDepthBuffer(); 17440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBuffer(depthBuffer); 17450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(depthBuffer) depthBuffer->release(); 17460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *stencilBuffer = framebuffer->getStencilBuffer(); 17480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilBuffer(stencilBuffer); 17490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(stencilBuffer) stencilBuffer->release(); 17500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Viewport viewport; 17520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float zNear = clamp01(mState.zNear); 17530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float zFar = clamp01(mState.zFar); 17540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.x0 = mState.viewportX; 17560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.y0 = mState.viewportY; 17570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.width = mState.viewportWidth; 17580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.height = mState.viewportHeight; 17590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.minZ = zNear; 17600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.maxZ = zFar; 17610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setViewport(viewport); 17630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.scissorTestEnabled) 17650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Rect scissor = {mState.scissorX, mState.scissorY, mState.scissorX + mState.scissorWidth, mState.scissorY + mState.scissorHeight}; 17670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens scissor.clip(0, 0, width, height); 17680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setScissorRect(scissor); 17700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setScissorEnable(true); 17710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 17730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setScissorEnable(false); 17750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 17780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 17790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Applies the fixed-function state (culling, depth test, alpha blending, stenciling, etc) 17810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyState(GLenum drawMode) 17820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 17830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getFramebuffer(); 17840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.cullFaceEnabled) 17860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setCullMode(es2sw::ConvertCullMode(mState.cullMode, mState.frontFace)); 17880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 17900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setCullMode(sw::CULL_NONE); 17920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mDepthStateDirty) 17950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthTestEnabled) 17970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBufferEnable(true); 17990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthCompare(es2sw::ConvertDepthComparison(mState.depthFunc)); 18000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 18020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBufferEnable(false); 18040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDepthStateDirty = false; 18070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mBlendStateDirty) 18100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.blendEnabled) 18120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAlphaBlendEnable(true); 18140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSeparateAlphaBlendEnable(true); 18150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSourceBlendFactor(es2sw::ConvertBlendFunc(mState.sourceBlendRGB)); 18170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDestBlendFactor(es2sw::ConvertBlendFunc(mState.destBlendRGB)); 18180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setBlendOperation(es2sw::ConvertBlendOp(mState.blendEquationRGB)); 18190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSourceBlendFactorAlpha(es2sw::ConvertBlendFunc(mState.sourceBlendAlpha)); 18210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDestBlendFactorAlpha(es2sw::ConvertBlendFunc(mState.destBlendAlpha)); 18220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setBlendOperationAlpha(es2sw::ConvertBlendOp(mState.blendEquationAlpha)); 18230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 18250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAlphaBlendEnable(false); 18270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = false; 18300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mStencilStateDirty || mFrontFaceDirty) 18330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilTestEnabled && framebuffer->hasStencil()) 18350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilEnable(true); 18370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTwoSidedStencil(true); 18380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // get the maximum size of the stencil ref 18400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *stencilbuffer = framebuffer->getStencilbuffer(); 18410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLuint maxStencil = (1 << stencilbuffer->getStencilSize()) - 1; 18420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilWriteMask(mState.stencilWritemask); 18440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilCompare(es2sw::ConvertStencilComparison(mState.stencilFunc)); 18450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilReference((mState.stencilRef < (GLint)maxStencil) ? mState.stencilRef : maxStencil); 18470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilMask(mState.stencilMask); 18480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilFailOperation(es2sw::ConvertStencilOp(mState.stencilFail)); 18500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilZFailOperation(es2sw::ConvertStencilOp(mState.stencilPassDepthFail)); 18510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilPassOperation(es2sw::ConvertStencilOp(mState.stencilPassDepthPass)); 18520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilWriteMaskCCW(mState.stencilWritemask); 18540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilCompareCCW(es2sw::ConvertStencilComparison(mState.stencilFunc)); 18550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilReferenceCCW((mState.stencilRef < (GLint)maxStencil) ? mState.stencilRef : maxStencil); 18570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilMaskCCW(mState.stencilMask); 18580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilFailOperationCCW(es2sw::ConvertStencilOp(mState.stencilFail)); 18600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilZFailOperationCCW(es2sw::ConvertStencilOp(mState.stencilPassDepthFail)); 18610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilPassOperationCCW(es2sw::ConvertStencilOp(mState.stencilPassDepthPass)); 18620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 18640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilEnable(false); 18660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = false; 18690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFrontFaceDirty = false; 18700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mMaskStateDirty) 18730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setColorWriteMask(0, es2sw::ConvertColorMask(mState.colorMaskRed, mState.colorMaskGreen, mState.colorMaskBlue, mState.colorMaskAlpha)); 18750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthWriteEnable(mState.depthMask); 18760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMaskStateDirty = false; 18780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mPolygonOffsetStateDirty) 18810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.polygonOffsetFillEnabled) 18830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *depthbuffer = framebuffer->getDepthbuffer(); 18850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(depthbuffer) 18860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSlopeDepthBias(mState.polygonOffsetFactor); 18880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float depthBias = ldexp(mState.polygonOffsetUnits, -(int)(depthbuffer->getDepthSize())); 18890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBias(depthBias); 18900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 18930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSlopeDepthBias(0); 18950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBias(0); 18960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mPolygonOffsetStateDirty = false; 18990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mSampleStateDirty) 19020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleAlphaToCoverageEnabled) 19040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTransparencyAntialiasing(sw::TRANSPARENCY_ALPHA_TO_COVERAGE); 19060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 19080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTransparencyAntialiasing(sw::TRANSPARENCY_NONE); 19100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageEnabled) 19130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int mask = 0; 19150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageValue != 0) 19160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int width, height, samples; 19180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens framebuffer->completeness(width, height, samples); 19190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float threshold = 0.5f; 19210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < samples; i++) 19230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mask <<= 1; 19250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if((i + 1) * mState.sampleCoverageValue >= threshold) 19270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens threshold += 1.0f; 19290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mask |= 1; 19300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageInvert) 19350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mask = ~mask; 19370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMultiSampleMask(mask); 19400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 19420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMultiSampleMask(0xFFFFFFFF); 19440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = false; 19470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mDitherStateDirty) 19500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // UNIMPLEMENTED(); // FIXME 19520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDitherStateDirty = false; 19540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(mState.shadeModel) 19570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(mState.shadeModel); 19590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SMOOTH: device->setShadingMode(sw::SHADING_GOURAUD); break; 19600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FLAT: device->setShadingMode(sw::SHADING_FLAT); break; 19610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLightingEnable(lightingEnabled); 19640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setGlobalAmbient(sw::Color<float>(globalAmbient.red, globalAmbient.green, globalAmbient.blue, globalAmbient.alpha)); 19650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_LIGHTS; i++) 19670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLightEnable(i, light[i].enabled); 19690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLightAmbient(i, sw::Color<float>(light[i].ambient.red, light[i].ambient.green, light[i].ambient.blue, light[i].ambient.alpha)); 19700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLightDiffuse(i, sw::Color<float>(light[i].diffuse.red, light[i].diffuse.green, light[i].diffuse.blue, light[i].diffuse.alpha)); 19710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLightSpecular(i, sw::Color<float>(light[i].specular.red, light[i].specular.green, light[i].specular.blue, light[i].specular.alpha)); 19720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLightAttenuation(i, light[i].attenuation.constant, light[i].attenuation.linear, light[i].attenuation.quadratic); 19730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(light[i].position.w != 0.0f) 19750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLightPosition(i, sw::Point(light[i].position.x / light[i].position.w, light[i].position.y / light[i].position.w, light[i].position.z / light[i].position.w)); 19770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else // Directional light 19790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Hack: set the position far way 19810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float max = sw::max(abs(light[i].position.x), abs(light[i].position.y), abs(light[i].position.z)); 19820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLightPosition(i, sw::Point(1e10f * (light[i].position.x / max), 1e10f * (light[i].position.y / max), 1e10f * (light[i].position.z / max))); 19830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMaterialAmbient(sw::Color<float>(materialAmbient.red, materialAmbient.green, materialAmbient.blue, materialAmbient.alpha)); 19870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMaterialDiffuse(sw::Color<float>(materialDiffuse.red, materialDiffuse.green, materialDiffuse.blue, materialDiffuse.alpha)); 19880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMaterialSpecular(sw::Color<float>(materialSpecular.red, materialSpecular.green, materialSpecular.blue, materialSpecular.alpha)); 19890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMaterialEmission(sw::Color<float>(materialEmission.red, materialEmission.green, materialEmission.blue, materialEmission.alpha)); 19900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMaterialShininess(materialShininess); 19910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDiffuseMaterialSource(sw::MATERIAL_MATERIAL); 19930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSpecularMaterialSource(sw::MATERIAL_MATERIAL); 19940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAmbientMaterialSource(sw::MATERIAL_MATERIAL); 19950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setEmissiveMaterialSource(sw::MATERIAL_MATERIAL); 19960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 199700bfa189ce055ff6cf1197b8ce9af503dcf0e65cNicolas Capens device->setProjectionMatrix(projectionStack.current()); 19980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setModelMatrix(modelViewStack.current()); 19990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureMatrix(0, textureStack0.current()); 20000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureMatrix(1, textureStack1.current()); 20010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureTransform(0, textureStack0.isIdentity() ? 0 : 4, false); 20020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureTransform(1, textureStack1.isIdentity() ? 0 : 4, false); 20030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTexGen(0, sw::TEXGEN_NONE); 20040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTexGen(1, sw::TEXGEN_NONE); 20050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAlphaTestEnable(alphaTestEnabled); 20070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAlphaCompare(es2sw::ConvertAlphaComparison(alphaTestFunc)); 20080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAlphaReference(alphaTestRef * 0xFF); 20090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFogEnable(fogEnabled); 20110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFogColor(sw::Color<float>(fogColor.red, fogColor.green, fogColor.blue, fogColor.alpha)); 20120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFogDensity(fogDensity); 20130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFogStart(fogStart); 20140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFogEnd(fogEnd); 20150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(fogMode) 20170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINEAR: device->setVertexFogMode(sw::FOG_LINEAR); break; 20190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_EXP: device->setVertexFogMode(sw::FOG_EXP); break; 20200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_EXP2: device->setVertexFogMode(sw::FOG_EXP2); break; 20210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(fogMode); 20220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setColorLogicOpEnabled(colorLogicOpEnabled); 20250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLogicalOperation(es2sw::ConvertLogicalOperation(logicalOperation)); 20260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setNormalizeNormals(normalizeEnabled || rescaleNormalEnabled); 20280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 20290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20300bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLenum Context::applyVertexBuffer(GLint base, GLint first, GLsizei count) 20310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 20320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS]; 20330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum err = mVertexDataManager->prepareVertexData(first, count, attributes); 20350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err != GL_NO_ERROR) 20360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return err; 20380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->resetInputStreams(false); 20410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_VERTEX_ATTRIBS; i++) 20430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Resource *resource = attributes[i].vertexBuffer; 20450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const void *buffer = (char*)resource->data() + attributes[i].offset; 20460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int stride = attributes[i].stride; 20480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens buffer = (char*)buffer + stride * base; 20500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Stream attribute(resource, buffer, stride); 20520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens attribute.type = attributes[i].type; 20540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens attribute.count = attributes[i].count; 20550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens attribute.normalized = attributes[i].normalized; 20560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setInputStream(i, attribute); 20580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_NO_ERROR; 20610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 20620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Applies the indices and element array bindings 20640bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLenum Context::applyIndexBuffer(const void *indices, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo) 20650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 20660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum err = mIndexDataManager->prepareIndexData(type, count, mState.elementArrayBuffer, indices, indexInfo); 20670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err == GL_NO_ERROR) 20690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setIndexBuffer(indexInfo->indexBuffer); 20710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return err; 20740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 20750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyTextures() 20770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 20780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int unit = 0; unit < MAX_TEXTURE_UNITS; unit++) 20790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Texture *texture = nullptr; 20810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(textureExternalEnabled[unit]) 20830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens texture = getSamplerTexture(unit, TEXTURE_EXTERNAL); 20850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(texture2Denabled[unit]) 20870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens texture = getSamplerTexture(unit, TEXTURE_2D); 20890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(texture && texture->isSamplerComplete()) 20920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens texture->autoGenerateMipmaps(); 20940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum wrapS = texture->getWrapS(); 20960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum wrapT = texture->getWrapT(); 20970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum minFilter = texture->getMinFilter(); 20980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum magFilter = texture->getMagFilter(); 20990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLfloat maxAnisotropy = texture->getMaxAnisotropy(); 21000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAddressingModeU(sw::SAMPLER_PIXEL, unit, es2sw::ConvertTextureWrap(wrapS)); 21020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAddressingModeV(sw::SAMPLER_PIXEL, unit, es2sw::ConvertTextureWrap(wrapT)); 21030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureFilter(sw::SAMPLER_PIXEL, unit, es2sw::ConvertTextureFilter(minFilter, magFilter, maxAnisotropy)); 21050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMipmapFilter(sw::SAMPLER_PIXEL, unit, es2sw::ConvertMipMapFilter(minFilter)); 21060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMaxAnisotropy(sw::SAMPLER_PIXEL, unit, maxAnisotropy); 21070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTexture(unit, texture); 21090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setConstantColor(unit, sw::Color<float>(mState.textureUnit[unit].color.red, mState.textureUnit[unit].color.green, mState.textureUnit[unit].color.blue, mState.textureUnit[unit].color.alpha)); 21110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.textureUnit[unit].environmentMode != GL_COMBINE) 21130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstArgument(unit, sw::TextureStage::SOURCE_TEXTURE); // Cs 21150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstModifier(unit, sw::TextureStage::MODIFIER_COLOR); 21160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSecondArgument(unit, sw::TextureStage::SOURCE_CURRENT); // Cp 21170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSecondModifier(unit, sw::TextureStage::MODIFIER_COLOR); 21180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setThirdArgument(unit, sw::TextureStage::SOURCE_CONSTANT); // Cc 21190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setThirdModifier(unit, sw::TextureStage::MODIFIER_COLOR); 21200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstArgumentAlpha(unit, sw::TextureStage::SOURCE_TEXTURE); // As 21220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstModifierAlpha(unit, sw::TextureStage::MODIFIER_ALPHA); 21230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSecondArgumentAlpha(unit, sw::TextureStage::SOURCE_CURRENT); // Ap 21240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSecondModifierAlpha(unit, sw::TextureStage::MODIFIER_ALPHA); 21250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setThirdArgumentAlpha(unit, sw::TextureStage::SOURCE_CONSTANT); // Ac 21260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setThirdModifierAlpha(unit, sw::TextureStage::MODIFIER_ALPHA); 21270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum texFormat = texture->getFormat(GL_TEXTURE_2D, 0); 21290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(mState.textureUnit[unit].environmentMode) 21310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_REPLACE: 21330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(IsAlpha(texFormat)) // GL_ALPHA 21340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = Cp, Av = As 21360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2); 21370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG1); 21380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(IsRGB(texFormat)) // GL_LUMINANCE (or 1) / GL_RGB (or 3) 21400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = Cs, Av = Ap 21420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG1); 21430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); 21440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(IsRGBA(texFormat)) // GL_LUMINANCE_ALPHA (or 2) / GL_RGBA (or 4) 21460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = Cs, Av = As 21480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG1); 21490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG1); 21500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNREACHABLE(texFormat); 21520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 21530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MODULATE: 21540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(IsAlpha(texFormat)) // GL_ALPHA 21550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = Cp, Av = ApAs 21570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2); 21580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE); 21590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(IsRGB(texFormat)) // GL_LUMINANCE (or 1) / GL_RGB (or 3) 21610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = CpCs, Av = Ap 21630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_MODULATE); 21640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); 21650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(IsRGBA(texFormat)) // GL_LUMINANCE_ALPHA (or 2) / GL_RGBA (or 4) 21670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = CpCs, Av = ApAs 21690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_MODULATE); 21700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE); 21710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNREACHABLE(texFormat); 21730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 21740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DECAL: 21750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(texFormat == GL_ALPHA || 21760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens texFormat == GL_LUMINANCE || 21770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens texFormat == GL_LUMINANCE_ALPHA) 21780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // undefined // FIXME: Log 21800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2); 21810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); 21820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(IsRGB(texFormat)) // GL_LUMINANCE (or 1) / GL_RGB (or 3) 21840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = Cs, Av = Ap 21860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG1); 21870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); 21880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(IsRGBA(texFormat)) // GL_LUMINANCE_ALPHA (or 2) / GL_RGBA (or 4) 21900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = Cp(1 - As) + CsAs, Av = Ap 21920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_BLENDTEXTUREALPHA); // Alpha * (Arg1 - Arg2) + Arg2 21930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); 21940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNREACHABLE(texFormat); 21960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 21970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND: 21980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(IsAlpha(texFormat)) // GL_ALPHA 21990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = Cp, Av = ApAs 22010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2); 22020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE); 22030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(IsRGB(texFormat)) // GL_LUMINANCE (or 1) / GL_RGB (or 3) 22050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = Cp(1 - Cs) + CcCs, Av = Ap 22070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_LERP); // Arg3 * (Arg1 - Arg2) + Arg2 22080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); 22090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(IsRGBA(texFormat)) // GL_LUMINANCE_ALPHA (or 2) / GL_RGBA (or 4) 22110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = Cp(1 - Cs) + CcCs, Av = ApAs 22130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_LERP); // Arg3 * (Arg1 - Arg2) + Arg2 22140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE); 22150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNREACHABLE(texFormat); 22170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 22180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ADD: 22190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(IsAlpha(texFormat)) // GL_ALPHA 22200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = Cp, Av = ApAs 22220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG2); 22230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE); 22240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(IsRGB(texFormat)) // GL_LUMINANCE (or 1) / GL_RGB (or 3) 22260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = Cp + Cs, Av = Ap 22280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_ADD); 22290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG2); 22300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(IsRGBA(texFormat)) // GL_LUMINANCE_ALPHA (or 2) / GL_RGBA (or 4) 22320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Cv = Cp + Cs, Av = ApAs 22340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_ADD); 22350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_MODULATE); 22360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNREACHABLE(texFormat); 22380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 22390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 22400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNREACHABLE(mState.textureUnit[unit].environmentMode); 22410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else // GL_COMBINE 22440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstArgument(unit, es2sw::ConvertSourceArgument(mState.textureUnit[unit].src0RGB)); 22460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstModifier(unit, es2sw::ConvertSourceOperand(mState.textureUnit[unit].operand0RGB)); 22470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSecondArgument(unit, es2sw::ConvertSourceArgument(mState.textureUnit[unit].src1RGB)); 22480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSecondModifier(unit, es2sw::ConvertSourceOperand(mState.textureUnit[unit].operand1RGB)); 22490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setThirdArgument(unit, es2sw::ConvertSourceArgument(mState.textureUnit[unit].src2RGB)); 22500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setThirdModifier(unit, es2sw::ConvertSourceOperand(mState.textureUnit[unit].operand2RGB)); 22510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, es2sw::ConvertCombineOperation(mState.textureUnit[unit].combineRGB)); 22530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstArgumentAlpha(unit, es2sw::ConvertSourceArgument(mState.textureUnit[unit].src0Alpha)); 22550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstModifierAlpha(unit, es2sw::ConvertSourceOperand(mState.textureUnit[unit].operand0Alpha)); 22560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSecondArgumentAlpha(unit, es2sw::ConvertSourceArgument(mState.textureUnit[unit].src1Alpha)); 22570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSecondModifierAlpha(unit, es2sw::ConvertSourceOperand(mState.textureUnit[unit].operand1Alpha)); 22580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setThirdArgumentAlpha(unit, es2sw::ConvertSourceArgument(mState.textureUnit[unit].src2Alpha)); 22590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setThirdModifierAlpha(unit, es2sw::ConvertSourceOperand(mState.textureUnit[unit].operand2Alpha)); 22600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, es2sw::ConvertCombineOperation(mState.textureUnit[unit].combineAlpha)); 22620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 22650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTexture(unit, nullptr); 22670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstArgument(unit, sw::TextureStage::SOURCE_CURRENT); 22690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstModifier(unit, sw::TextureStage::MODIFIER_COLOR); 22700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(unit, sw::TextureStage::STAGE_SELECTARG1); 22710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstArgumentAlpha(unit, sw::TextureStage::SOURCE_CURRENT); 22730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstModifierAlpha(unit, sw::TextureStage::MODIFIER_ALPHA); 22740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(unit, sw::TextureStage::STAGE_SELECTARG1); 22750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 22780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setTextureEnvMode(GLenum texEnvMode) 22800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 22810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].environmentMode = texEnvMode; 22820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 22830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setTextureEnvColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) 22850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 22860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].color = {red, green, blue, alpha}; 22870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 22880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setCombineRGB(GLenum combineRGB) 22900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 22910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].combineRGB = combineRGB; 22920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 22930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setCombineAlpha(GLenum combineAlpha) 22950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 22960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].combineAlpha = combineAlpha; 22970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 22980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setOperand0RGB(GLenum operand) 23000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].operand0RGB = operand; 23020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setOperand1RGB(GLenum operand) 23050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].operand1RGB = operand; 23070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setOperand2RGB(GLenum operand) 23100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].operand2RGB = operand; 23120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setOperand0Alpha(GLenum operand) 23150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].operand0Alpha = operand; 23170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setOperand1Alpha(GLenum operand) 23200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].operand1Alpha = operand; 23220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setOperand2Alpha(GLenum operand) 23250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].operand2Alpha = operand; 23270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSrc0RGB(GLenum src) 23300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].src0RGB = src; 23320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSrc1RGB(GLenum src) 23350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].src1RGB = src; 23370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSrc2RGB(GLenum src) 23400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].src2RGB = src; 23420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSrc0Alpha(GLenum src) 23450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].src0Alpha = src; 23470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSrc1Alpha(GLenum src) 23500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].src1Alpha = src; 23520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSrc2Alpha(GLenum src) 23550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.textureUnit[mState.activeSampler].src2Alpha = src; 23570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyTexture(int index, Texture *baseTexture) 23600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Resource *resource = 0; 23620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(baseTexture) 23640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens resource = baseTexture->getResource(); 23660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureResource(index, resource); 23690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(baseTexture) 23710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2372b3f54e844c7bb9bc7b070ede7b574c373d4f67f1Nicolas Capens int topLevel = baseTexture->getTopLevel(); 23730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(baseTexture->getTarget() == GL_TEXTURE_2D || baseTexture->getTarget() == GL_TEXTURE_EXTERNAL_OES) 23750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Texture2D *texture = static_cast<Texture2D*>(baseTexture); 23770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++) 23790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int surfaceLevel = mipmapLevel; 23810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(surfaceLevel < 0) 23830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens surfaceLevel = 0; 23850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2386b3f54e844c7bb9bc7b070ede7b574c373d4f67f1Nicolas Capens else if(surfaceLevel > topLevel) 23870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2388b3f54e844c7bb9bc7b070ede7b574c373d4f67f1Nicolas Capens surfaceLevel = topLevel; 23890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *surface = texture->getImage(surfaceLevel); 23920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureLevel(index, 0, mipmapLevel, surface, sw::TEXTURE_2D); 23930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNIMPLEMENTED(); 23960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 23980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureLevel(index, 0, 0, 0, sw::TEXTURE_NULL); 24000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 24020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, 24040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum format, GLenum type, GLsizei *bufSize, void* pixels) 24050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 24060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getFramebuffer(); 24070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int framebufferWidth, framebufferHeight, framebufferSamples; 24080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24095cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu if(!framebuffer || (framebuffer->completeness(framebufferWidth, framebufferHeight, framebufferSamples) != GL_FRAMEBUFFER_COMPLETE_OES)) 24100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_FRAMEBUFFER_OPERATION_OES); 24120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(getFramebufferName() != 0 && framebufferSamples != 0) 24150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 24170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(format != GL_RGBA || type != GL_UNSIGNED_BYTE) 24200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(format != framebuffer->getImplementationColorReadFormat() || type != framebuffer->getImplementationColorReadType()) 24220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 24240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24273b4a25c5365486981157f8ba9a2aee539c162a0dNicolas Capens GLsizei outputPitch = gl::ComputePitch(width, format, type, mState.packAlignment); 24280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Sized query sanity check 24300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(bufSize) 24310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int requiredSize = outputPitch * height; 24330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(requiredSize > *bufSize) 24340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 24360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens egl::Image *renderTarget = framebuffer->getRenderTarget(); 24400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!renderTarget) 24420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_OUT_OF_MEMORY); 24440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Rect rect = {x, y, x + width, y + height}; 24470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens rect.clip(0, 0, renderTarget->getWidth(), renderTarget->getHeight()); 24480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2449e5a57888fa26096a57b0b6eac6fb5cf82d7da94eNicolas Capens unsigned char *source = (unsigned char*)renderTarget->lock(rect.x0, rect.y0, 0, sw::LOCK_READONLY); 24500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned char *dest = (unsigned char*)pixels; 24510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int inputPitch = (int)renderTarget->getPitch(); 24520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int j = 0; j < rect.y1 - rect.y0; j++) 24540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned short *dest16 = (unsigned short*)dest; 24560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int *dest32 = (unsigned int*)dest; 24570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24583e5f6fd5e3a17562a85df3b4b0efced78a5b2129Nicolas Capens if(renderTarget->getExternalFormat() == sw::FORMAT_A8B8G8R8 && 24590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens format == GL_RGBA && type == GL_UNSIGNED_BYTE) 24600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens memcpy(dest, source, (rect.x1 - rect.x0) * 4); 24620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24633e5f6fd5e3a17562a85df3b4b0efced78a5b2129Nicolas Capens else if(renderTarget->getExternalFormat() == sw::FORMAT_A8R8G8B8 && 24640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens format == GL_RGBA && type == GL_UNSIGNED_BYTE) 24650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < rect.x1 - rect.x0; i++) 24670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int argb = *(unsigned int*)(source + 4 * i); 24690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest32[i] = (argb & 0xFF00FF00) | ((argb & 0x000000FF) << 16) | ((argb & 0x00FF0000) >> 16); 24710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24733e5f6fd5e3a17562a85df3b4b0efced78a5b2129Nicolas Capens else if(renderTarget->getExternalFormat() == sw::FORMAT_X8R8G8B8 && 24740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens format == GL_RGBA && type == GL_UNSIGNED_BYTE) 24750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < rect.x1 - rect.x0; i++) 24770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int xrgb = *(unsigned int*)(source + 4 * i); 24790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest32[i] = (xrgb & 0xFF00FF00) | ((xrgb & 0x000000FF) << 16) | ((xrgb & 0x00FF0000) >> 16) | 0xFF000000; 24810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24833e5f6fd5e3a17562a85df3b4b0efced78a5b2129Nicolas Capens else if(renderTarget->getExternalFormat() == sw::FORMAT_X8R8G8B8 && 24840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens format == GL_BGRA_EXT && type == GL_UNSIGNED_BYTE) 24850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < rect.x1 - rect.x0; i++) 24870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int xrgb = *(unsigned int*)(source + 4 * i); 24890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest32[i] = xrgb | 0xFF000000; 24910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24933e5f6fd5e3a17562a85df3b4b0efced78a5b2129Nicolas Capens else if(renderTarget->getExternalFormat() == sw::FORMAT_A8R8G8B8 && 24940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens format == GL_BGRA_EXT && type == GL_UNSIGNED_BYTE) 24950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens memcpy(dest, source, (rect.x1 - rect.x0) * 4); 24970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24983e5f6fd5e3a17562a85df3b4b0efced78a5b2129Nicolas Capens else if(renderTarget->getExternalFormat() == sw::FORMAT_A1R5G5B5 && 24990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens format == GL_BGRA_EXT && type == GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT) 25000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens memcpy(dest, source, (rect.x1 - rect.x0) * 2); 25020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25033e5f6fd5e3a17562a85df3b4b0efced78a5b2129Nicolas Capens else if(renderTarget->getExternalFormat() == sw::FORMAT_R5G6B5 && 25040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens format == 0x80E0 && type == GL_UNSIGNED_SHORT_5_6_5) // GL_BGR_EXT 25050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens memcpy(dest, source, (rect.x1 - rect.x0) * 2); 25070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 25090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < rect.x1 - rect.x0; i++) 25110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float r; 25130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float g; 25140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float b; 25150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float a; 25160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25173e5f6fd5e3a17562a85df3b4b0efced78a5b2129Nicolas Capens switch(renderTarget->getExternalFormat()) 25180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_R5G6B5: 25200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned short rgb = *(unsigned short*)(source + 2 * i); 25220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = 1.0f; 25240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = (rgb & 0x001F) * (1.0f / 0x001F); 25250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = (rgb & 0x07E0) * (1.0f / 0x07E0); 25260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = (rgb & 0xF800) * (1.0f / 0xF800); 25270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 25290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_A1R5G5B5: 25300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned short argb = *(unsigned short*)(source + 2 * i); 25320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = (argb & 0x8000) ? 1.0f : 0.0f; 25340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = (argb & 0x001F) * (1.0f / 0x001F); 25350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = (argb & 0x03E0) * (1.0f / 0x03E0); 25360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = (argb & 0x7C00) * (1.0f / 0x7C00); 25370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 25390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_A8R8G8B8: 25400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int argb = *(unsigned int*)(source + 4 * i); 25420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = (argb & 0xFF000000) * (1.0f / 0xFF000000); 25440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = (argb & 0x000000FF) * (1.0f / 0x000000FF); 25450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = (argb & 0x0000FF00) * (1.0f / 0x0000FF00); 25460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = (argb & 0x00FF0000) * (1.0f / 0x00FF0000); 25470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 25490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_A8B8G8R8: 25500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int abgr = *(unsigned int*)(source + 4 * i); 25520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = (abgr & 0xFF000000) * (1.0f / 0xFF000000); 25540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = (abgr & 0x00FF0000) * (1.0f / 0x00FF0000); 25550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = (abgr & 0x0000FF00) * (1.0f / 0x0000FF00); 25560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = (abgr & 0x000000FF) * (1.0f / 0x000000FF); 25570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 25590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_X8R8G8B8: 25600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int xrgb = *(unsigned int*)(source + 4 * i); 25620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = 1.0f; 25640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = (xrgb & 0x000000FF) * (1.0f / 0x000000FF); 25650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = (xrgb & 0x0000FF00) * (1.0f / 0x0000FF00); 25660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = (xrgb & 0x00FF0000) * (1.0f / 0x00FF0000); 25670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 25690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_X8B8G8R8: 25700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int xbgr = *(unsigned int*)(source + 4 * i); 25720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = 1.0f; 25740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = (xbgr & 0x00FF0000) * (1.0f / 0x00FF0000); 25750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = (xbgr & 0x0000FF00) * (1.0f / 0x0000FF00); 25760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = (xbgr & 0x000000FF) * (1.0f / 0x000000FF); 25770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 25790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_A2R10G10B10: 25800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int argb = *(unsigned int*)(source + 4 * i); 25820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = (argb & 0xC0000000) * (1.0f / 0xC0000000); 25840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = (argb & 0x000003FF) * (1.0f / 0x000003FF); 25850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = (argb & 0x000FFC00) * (1.0f / 0x000FFC00); 25860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = (argb & 0x3FF00000) * (1.0f / 0x3FF00000); 25870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 25890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 25900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNIMPLEMENTED(); // FIXME 25913e5f6fd5e3a17562a85df3b4b0efced78a5b2129Nicolas Capens UNREACHABLE(renderTarget->getExternalFormat()); 25920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(format) 25950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RGBA: 25970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(type) 25980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNSIGNED_BYTE: 26000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + 0] = (unsigned char)(255 * r + 0.5f); 26010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + 1] = (unsigned char)(255 * g + 0.5f); 26020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + 2] = (unsigned char)(255 * b + 0.5f); 26030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + 3] = (unsigned char)(255 * a + 0.5f); 26040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(type); 26060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BGRA_EXT: 26090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(type) 26100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNSIGNED_BYTE: 26120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + 0] = (unsigned char)(255 * b + 0.5f); 26130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + 1] = (unsigned char)(255 * g + 0.5f); 26140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + 2] = (unsigned char)(255 * r + 0.5f); 26150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + 3] = (unsigned char)(255 * a + 0.5f); 26160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: 26180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // According to the desktop GL spec in the "Transfer of Pixel Rectangles" section 26190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // this type is packed as follows: 26200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 26210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // -------------------------------------------------------------------------------- 26220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // | 4th | 3rd | 2nd | 1st component | 26230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // -------------------------------------------------------------------------------- 26240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // in the case of BGRA_EXT, B is the first component, G the second, and so forth. 26250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest16[i] = 26260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(15 * a + 0.5f) << 12)| 26270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(15 * r + 0.5f) << 8) | 26280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(15 * g + 0.5f) << 4) | 26290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(15 * b + 0.5f) << 0); 26300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: 26320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // According to the desktop GL spec in the "Transfer of Pixel Rectangles" section 26330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // this type is packed as follows: 26340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 26350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // -------------------------------------------------------------------------------- 26360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // | 4th | 3rd | 2nd | 1st component | 26370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // -------------------------------------------------------------------------------- 26380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // in the case of BGRA_EXT, B is the first component, G the second, and so forth. 26390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest16[i] = 26400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)( a + 0.5f) << 15) | 26410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(31 * r + 0.5f) << 10) | 26420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(31 * g + 0.5f) << 5) | 26430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(31 * b + 0.5f) << 0); 26440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(type); 26460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RGB: 26490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(type) 26500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNSIGNED_SHORT_5_6_5: 26520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest16[i] = 26530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(31 * b + 0.5f) << 0) | 26540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(63 * g + 0.5f) << 5) | 26550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(31 * r + 0.5f) << 11); 26560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(type); 26580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 26600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(format); 26610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens source += inputPitch; 26660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest += outputPitch; 26670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens renderTarget->unlock(); 26700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens renderTarget->release(); 26710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 26720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::clear(GLbitfield mask) 26740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 26750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getFramebuffer(); 26760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!framebuffer || framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE_OES) 26780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_FRAMEBUFFER_OPERATION_OES); 26800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!applyRenderTarget()) 26830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 26850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float depth = clamp01(mState.depthClearValue); 26880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int stencil = mState.stencilClearValue & 0x000000FF; 26890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_COLOR_BUFFER_BIT) 26910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int rgbaMask = (mState.colorMaskRed ? 0x1 : 0) | 26930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens (mState.colorMaskGreen ? 0x2 : 0) | 26940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens (mState.colorMaskBlue ? 0x4 : 0) | 26950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens (mState.colorMaskAlpha ? 0x8 : 0); 26960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(rgbaMask != 0) 26980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->clearColor(mState.colorClearValue.red, mState.colorClearValue.green, mState.colorClearValue.blue, mState.colorClearValue.alpha, rgbaMask); 27000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_DEPTH_BUFFER_BIT) 27040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthMask != 0) 27060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->clearDepth(depth); 27080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_STENCIL_BUFFER_BIT) 27120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilWritemask != 0) 27140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->clearStencil(stencil, mState.stencilWritemask); 27160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 27190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::drawArrays(GLenum mode, GLint first, GLsizei count) 27210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 27220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::DrawType primitiveType; 27230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int primitiveCount; 27240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!es2sw::ConvertPrimitiveType(mode, count, GL_NONE, primitiveType, primitiveCount)) 27260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_ENUM); 27270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(primitiveCount <= 0) 27290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 27310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!applyRenderTarget()) 27340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 27360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyState(mode); 27390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum err = applyVertexBuffer(0, first, count); 27410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err != GL_NO_ERROR) 27420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(err); 27440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTextures(); 27470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!cullSkipsDraw(mode)) 27490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->drawPrimitive(primitiveType, primitiveCount); 27510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 27530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices) 27550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 27560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!indices && !mState.elementArrayBuffer) 27570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 27590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::DrawType primitiveType; 27620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int primitiveCount; 27630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!es2sw::ConvertPrimitiveType(mode, count, type, primitiveType, primitiveCount)) 27650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_ENUM); 27660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(primitiveCount <= 0) 27680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 27700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!applyRenderTarget()) 27730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 27750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyState(mode); 27780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TranslatedIndexData indexInfo; 27800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum err = applyIndexBuffer(indices, count, mode, type, &indexInfo); 27810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err != GL_NO_ERROR) 27820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(err); 27840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLsizei vertexCount = indexInfo.maxIndex - indexInfo.minIndex + 1; 27870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens err = applyVertexBuffer(-(int)indexInfo.minIndex, indexInfo.minIndex, vertexCount); 27880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err != GL_NO_ERROR) 27890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(err); 27910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTextures(); 27940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!cullSkipsDraw(mode)) 27960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->drawIndexedPrimitive(primitiveType, indexInfo.indexOffset, primitiveCount); 27980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 28000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::drawTexture(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height) 28020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 28030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens es1::Framebuffer *framebuffer = getFramebuffer(); 28045cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu es1::Renderbuffer *renderbuffer = framebuffer ? framebuffer->getColorbuffer() : nullptr; 28055cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu if(!renderbuffer) 28065cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu { 28075cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu return; 28085cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu } 28095cd502b4ba6b04f5b2e50c19e94c75f472b620c6Alexis Hetu 28100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float targetWidth = (float)renderbuffer->getWidth(); 28110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float targetHeight = (float)renderbuffer->getHeight(); 28120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float x0 = 2.0f * x / targetWidth - 1.0f; 28130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float y0 = 2.0f * y / targetHeight - 1.0f; 28140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float x1 = 2.0f * (x + width) / targetWidth - 1.0f; 28150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float y1 = 2.0f * (y + height) / targetHeight - 1.0f; 28160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float Zw = sw::clamp(mState.zNear + z * (mState.zFar - mState.zNear), mState.zNear, mState.zFar); 28170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float vertices[][3] = {{x0, y0, Zw}, 28190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens {x0, y1, Zw}, 28200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens {x1, y0, Zw}, 28210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens {x1, y1, Zw}}; 28220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(mState.samplerTexture[TEXTURE_2D][1].name() == 0); // Multi-texturing unimplemented 28240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens es1::Texture *texture = getSamplerTexture(0, TEXTURE_2D); 28250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float textureWidth = (float)texture->getWidth(GL_TEXTURE_2D, 0); 28260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float textureHeight = (float)texture->getHeight(GL_TEXTURE_2D, 0); 28270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int Ucr = texture->getCropRectU(); 28280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int Vcr = texture->getCropRectV(); 28290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int Wcr = texture->getCropRectW(); 28300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int Hcr = texture->getCropRectH(); 28310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float texCoords[][2] = {{Ucr / textureWidth, Vcr / textureHeight}, 28330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens {Ucr / textureWidth, (Vcr + Hcr) / textureHeight}, 28340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens {(Ucr + Wcr) / textureWidth, Vcr / textureHeight}, 28350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens {(Ucr + Wcr) / textureWidth, (Vcr + Hcr) / textureHeight}}; 28360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens VertexAttribute oldPositionAttribute = mState.vertexAttribute[sw::Position]; 28380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens VertexAttribute oldTexCoord0Attribute = mState.vertexAttribute[sw::TexCoord0]; 28390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens gl::BindingPointer<Buffer> oldArrayBuffer = mState.arrayBuffer; 28400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.arrayBuffer = nullptr; 28410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), vertices); 28430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens glEnableClientState(GL_VERTEX_ARRAY); 28440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens glTexCoordPointer(2, GL_FLOAT, 2 * sizeof(float), texCoords); 28450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens glEnableClientState(GL_TEXTURE_COORD_ARRAY); 28460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Matrix P = projectionStack.current(); 28480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Matrix M = modelViewStack.current(); 28490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Matrix T = textureStack0.current(); 28500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens projectionStack.identity(); 28520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens modelViewStack.identity(); 28530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureStack0.identity(); 28540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawArrays(GL_TRIANGLE_STRIP, 0, 4); 28560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Restore state 28580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Position] = oldPositionAttribute; 28590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::TexCoord0] = oldTexCoord0Attribute; 28600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.arrayBuffer = oldArrayBuffer; 28610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens oldArrayBuffer = nullptr; 28620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens oldPositionAttribute.mBoundBuffer = nullptr; 28630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens oldTexCoord0Attribute.mBoundBuffer = nullptr; 28640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureStack0.load(T); 28650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens modelViewStack.load(M); 28660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens projectionStack.load(P); 28670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 28680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 286981aa97bd20033674ba28d779c05fbcee1539ebf7Nicolas Capensvoid Context::blit(sw::Surface *source, const sw::SliceRect &sRect, sw::Surface *dest, const sw::SliceRect &dRect) 287081aa97bd20033674ba28d779c05fbcee1539ebf7Nicolas Capens{ 287110c74a62ed7bcde6e4f48445bd43e2f8707c30d6Alexis Hetu sw::SliceRectF sRectF((float)sRect.x0, (float)sRect.y0, (float)sRect.x1, (float)sRect.y1, sRect.slice); 287210c74a62ed7bcde6e4f48445bd43e2f8707c30d6Alexis Hetu device->blit(source, sRectF, dest, dRect, false); 287381aa97bd20033674ba28d779c05fbcee1539ebf7Nicolas Capens} 287481aa97bd20033674ba28d779c05fbcee1539ebf7Nicolas Capens 28750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::finish() 28760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 28770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->finish(); 28780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 28790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::flush() 28810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 28820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // We don't queue anything without processing it as fast as possible 28830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 28840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordInvalidEnum() 28860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 28870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidEnum = true; 28880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 28890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordInvalidValue() 28910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 28920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidValue = true; 28930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 28940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordInvalidOperation() 28960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 28970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidOperation = true; 28980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 28990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordOutOfMemory() 29010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 29020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mOutOfMemory = true; 29030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 29040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordInvalidFramebufferOperation() 29060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 29070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidFramebufferOperation = true; 29080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 29090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordMatrixStackOverflow() 29110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 29120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMatrixStackOverflow = true; 29130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 29140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordMatrixStackUnderflow() 29160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 29170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMatrixStackUnderflow = true; 29180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 29190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Get one of the recorded errors and clear its flag, if any. 29210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// [OpenGL ES 2.0.24] section 2.5 page 13. 29220bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLenum Context::getError() 29230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 29240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mInvalidEnum) 29250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidEnum = false; 29270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_ENUM; 29290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mInvalidValue) 29320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidValue = false; 29340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_VALUE; 29360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mInvalidOperation) 29390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidOperation = false; 29410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_OPERATION; 29430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mOutOfMemory) 29460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mOutOfMemory = false; 29480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_OUT_OF_MEMORY; 29500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mInvalidFramebufferOperation) 29530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidFramebufferOperation = false; 29550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_FRAMEBUFFER_OPERATION_OES; 29570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mMatrixStackOverflow) 29600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMatrixStackOverflow = false; 29620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_FRAMEBUFFER_OPERATION_OES; 29640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mMatrixStackUnderflow) 29670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMatrixStackUnderflow = false; 29690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_FRAMEBUFFER_OPERATION_OES; 29710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_NO_ERROR; 29740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 29750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensint Context::getSupportedMultisampleCount(int requested) 29770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 29780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int supported = 0; 29790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = NUM_MULTISAMPLE_COUNTS - 1; i >= 0; i--) 29810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(supported >= requested) 29830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return supported; 29850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens supported = multisampleCount[i]; 29880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return supported; 29910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 29920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::detachBuffer(GLuint buffer) 29940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 29950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 2.9 page 22: 29960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a buffer object is deleted while it is bound, all bindings to that object in the current context 29970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // (i.e. in the thread that called Delete-Buffers) are reset to zero. 29980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.arrayBuffer.name() == buffer) 30000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.arrayBuffer = nullptr; 30020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.elementArrayBuffer.name() == buffer) 30050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.elementArrayBuffer = nullptr; 30070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int attribute = 0; attribute < MAX_VERTEX_ATTRIBS; attribute++) 30100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.vertexAttribute[attribute].mBoundBuffer.name() == buffer) 30120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribute].mBoundBuffer = nullptr; 30140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::detachTexture(GLuint texture) 30190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 3.8 page 84: 30210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a texture object is deleted, it is as if all texture units which are bound to that texture object are 30220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // rebound to texture object zero 30230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int type = 0; type < TEXTURE_TYPE_COUNT; type++) 30250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int sampler = 0; sampler < MAX_TEXTURE_UNITS; sampler++) 30270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.samplerTexture[type][sampler].name() == texture) 30290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.samplerTexture[type][sampler] = nullptr; 30310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 4.4 page 112: 30360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is 30370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // as if FramebufferTexture2D had been called, with a texture of 0, for each attachment point to which this 30380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // image was attached in the currently bound framebuffer. 30390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getFramebuffer(); 30410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(framebuffer) 30430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens framebuffer->detachTexture(texture); 30450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::detachFramebuffer(GLuint framebuffer) 30490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 4.4 page 107: 30510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though 30520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero. 30530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.framebuffer == framebuffer) 30550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindFramebuffer(0); 30570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::detachRenderbuffer(GLuint renderbuffer) 30610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 4.4 page 109: 30630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though BindRenderbuffer 30640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // had been executed with the target RENDERBUFFER and name of zero. 30650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.renderbuffer.name() == renderbuffer) 30670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindRenderbuffer(0); 30690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // [OpenGL ES 2.0.24] section 4.4 page 111: 30720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a renderbuffer object is deleted while its image is attached to the currently bound framebuffer, 30730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment 30740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // point to which this image was attached in the currently bound framebuffer. 30750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getFramebuffer(); 30770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(framebuffer) 30790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens framebuffer->detachRenderbuffer(renderbuffer); 30810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::cullSkipsDraw(GLenum drawMode) 30850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.cullFaceEnabled && mState.cullMode == GL_FRONT_AND_BACK && isTriangleMode(drawMode); 30870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isTriangleMode(GLenum drawMode) 30900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(drawMode) 30920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRIANGLES: 30940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRIANGLE_FAN: 30950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRIANGLE_STRIP: 30960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 30970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINTS: 30980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINES: 30990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_LOOP: 31000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_STRIP: 31010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 31020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(drawMode); 31030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 31060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setVertexAttrib(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) 31090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(index < MAX_VERTEX_ATTRIBS); 31110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[index].mCurrentValue[0] = x; 31130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[index].mCurrentValue[1] = y; 31140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[index].mCurrentValue[2] = z; 31150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[index].mCurrentValue[3] = w; 31160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mVertexDataManager->dirtyCurrentValue(index); 31180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 312031c07a304f3247c26ba72eff0cb0a74eb05366e8Nicolas Capensvoid Context::bindTexImage(gl::Surface *surface) 31210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens es1::Texture2D *textureObject = getTexture2D(); 31230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(textureObject) 31250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureObject->bindTexImage(surface); 31270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31300bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensEGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel) 31310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(target) 31330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_TEXTURE_2D_KHR: 31350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 31360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EGL_GL_RENDERBUFFER_KHR: 31370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 31380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 31390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_PARAMETER; 31400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(textureLevel >= IMPLEMENTATION_MAX_TEXTURE_LEVELS) 31430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_MATCH; 31450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(target == EGL_GL_TEXTURE_2D_KHR) 31480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Texture *texture = getTexture(name); 31500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!texture || texture->getTarget() != GL_TEXTURE_2D) 31520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_PARAMETER; 31540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(texture->isShared(GL_TEXTURE_2D, textureLevel)) // Bound to an EGLSurface or already an EGLImage sibling 31570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_ACCESS; 31590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(textureLevel != 0 && !texture->isSamplerComplete()) 31620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_PARAMETER; 31640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3166b3f54e844c7bb9bc7b070ede7b574c373d4f67f1Nicolas Capens if(textureLevel == 0 && !(texture->isSamplerComplete() && texture->getTopLevel() == 0)) 31670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_PARAMETER; 31690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(target == EGL_GL_RENDERBUFFER_KHR) 31720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *renderbuffer = getRenderbuffer(name); 31740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!renderbuffer) 31760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_PARAMETER; 31780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(renderbuffer->isShared()) // Already an EGLImage sibling 31810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_BAD_ACCESS; 31830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNREACHABLE(target); 31860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return EGL_SUCCESS; 31880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensegl::Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textureLevel) 31910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(target == EGL_GL_TEXTURE_2D_KHR) 31930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens es1::Texture *texture = getTexture(name); 31950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return texture->createSharedImage(GL_TEXTURE_2D, textureLevel); 31970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(target == EGL_GL_RENDERBUFFER_KHR) 31990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens es1::Renderbuffer *renderbuffer = getRenderbuffer(name); 32010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return renderbuffer->createSharedImage(); 32030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNREACHABLE(target); 32050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 320658df2f60096311b481b5521a571972278a341daeNicolas Capens return nullptr; 320758df2f60096311b481b5521a571972278a341daeNicolas Capens} 320858df2f60096311b481b5521a571972278a341daeNicolas Capens 320958df2f60096311b481b5521a571972278a341daeNicolas Capensegl::Image *Context::getSharedImage(GLeglImageOES image) 321058df2f60096311b481b5521a571972278a341daeNicolas Capens{ 321158df2f60096311b481b5521a571972278a341daeNicolas Capens return display->getSharedImage(image); 32120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32140bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensDevice *Context::getDevice() 32150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return device; 32170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setMatrixMode(GLenum mode) 32200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens matrixMode = mode; 32220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenssw::MatrixStack &Context::currentMatrixStack() 32250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(matrixMode) 32270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MODELVIEW: 32290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return modelViewStack; 32300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PROJECTION: 32310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return projectionStack; 32320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE: 32330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(mState.activeSampler) 32340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case 0: return textureStack0; 32360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case 1: return textureStack1; 32370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 32390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNREACHABLE(matrixMode); 32420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return textureStack0; 32430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::loadIdentity() 32460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().identity(); 32480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::load(const GLfloat *m) 32510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().load(m); 32530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::pushMatrix() 32560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!currentMatrixStack().push()) 32580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_STACK_OVERFLOW); 32600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::popMatrix() 32640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!currentMatrixStack().pop()) 32660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_STACK_OVERFLOW); 32680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::rotate(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) 32720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().rotate(angle, x, y, z); 32740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::translate(GLfloat x, GLfloat y, GLfloat z) 32770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().translate(x, y, z); 32790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::scale(GLfloat x, GLfloat y, GLfloat z) 32820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().scale(x, y, z); 32840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::multiply(const GLfloat *m) 32870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().multiply(m); 32890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::frustum(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) 32920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().frustum(left, right, bottom, top, zNear, zFar); 32940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::ortho(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) 32970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().ortho(left, right, bottom, top, zNear, zFar); 32990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setClipPlane(int index, const float plane[4]) 33020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Plane clipPlane = modelViewStack.current() * sw::Plane(plane); 33040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setClipPlane(index, &clipPlane.A); 33050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setClipPlaneEnabled(int index, bool enable) 33080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens clipFlags = (clipFlags & ~((int)!enable << index)) | ((int)enable << index); 33100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setClipFlags(clipFlags); 33110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isClipPlaneEnabled(int index) const 33140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return (clipFlags & (1 << index)) != 0; 33160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setColorLogicOpEnabled(bool enable) 33190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens colorLogicOpEnabled = enable; 33210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isColorLogicOpEnabled() const 33240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return colorLogicOpEnabled; 33260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLogicalOperation(GLenum logicOp) 33290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens logicalOperation = logicOp; 33310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLineSmoothEnabled(bool enable) 33340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens lineSmoothEnabled = enable; 33360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isLineSmoothEnabled() const 33390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return lineSmoothEnabled; 33410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setColorMaterialEnabled(bool enable) 33440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens colorMaterialEnabled = enable; 33460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isColorMaterialEnabled() const 33490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return colorMaterialEnabled; 33510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setNormalizeEnabled(bool enable) 33540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens normalizeEnabled = enable; 33560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isNormalizeEnabled() const 33590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return normalizeEnabled; 33610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setRescaleNormalEnabled(bool enable) 33640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens rescaleNormalEnabled = enable; 33660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isRescaleNormalEnabled() const 33690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return rescaleNormalEnabled; 33710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setVertexArrayEnabled(bool enable) 33740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Position].mArrayEnabled = enable; 33760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isVertexArrayEnabled() const 33790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.vertexAttribute[sw::Position].mArrayEnabled; 33810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setNormalArrayEnabled(bool enable) 33840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Normal].mArrayEnabled = enable; 33860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isNormalArrayEnabled() const 33890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.vertexAttribute[sw::Normal].mArrayEnabled; 33910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setColorArrayEnabled(bool enable) 33940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Color0].mArrayEnabled = enable; 33960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isColorArrayEnabled() const 33990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.vertexAttribute[sw::Color0].mArrayEnabled; 34010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPointSizeArrayEnabled(bool enable) 34040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::PointSize].mArrayEnabled = enable; 34060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isPointSizeArrayEnabled() const 34090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.vertexAttribute[sw::PointSize].mArrayEnabled; 34110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setTextureCoordArrayEnabled(bool enable) 34140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::TexCoord0 + clientTexture].mArrayEnabled = enable; 34160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isTextureCoordArrayEnabled() const 34190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.vertexAttribute[sw::TexCoord0 + clientTexture].mArrayEnabled; 34210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setMultisampleEnabled(bool enable) 34240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens multisampleEnabled = enable; 34260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isMultisampleEnabled() const 34290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return multisampleEnabled; 34310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSampleAlphaToOneEnabled(bool enable) 34340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sampleAlphaToOneEnabled = enable; 34360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isSampleAlphaToOneEnabled() const 34390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return sampleAlphaToOneEnabled; 34410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPointSpriteEnabled(bool enable) 34440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pointSpriteEnabled = enable; 34460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isPointSpriteEnabled() const 34490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return pointSpriteEnabled; 34510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPointSmoothEnabled(bool enable) 34540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pointSmoothEnabled = enable; 34560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isPointSmoothEnabled() const 34590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return pointSmoothEnabled; 34610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPointSizeMin(float min) 34640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pointSizeMin = min; 34660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPointSizeMax(float max) 34690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pointSizeMax = max; 34710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPointDistanceAttenuation(float a, float b, float c) 34740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pointDistanceAttenuation = {a, b, c}; 34760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPointFadeThresholdSize(float threshold) 34790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens pointFadeThresholdSize = threshold; 34810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::clientActiveTexture(GLenum texture) 34840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens clientTexture = texture; 34860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34880bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLenum Context::getClientActiveTexture() const 34890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return clientTexture; 34910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensunsigned int Context::getActiveTexture() const 34940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.activeSampler; 34960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3500f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas Capensegl::Context *es1CreateContext(egl::Display *display, const egl::Context *shareContext, const egl::Config *config) 35010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 35020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(!shareContext || shareContext->getClientVersion() == 1); // Should be checked by eglCreateContext 3503f6a377b0e6e4bbfcc958abd2fc1bc0aacc9bbef3Nicolas Capens return new es1::Context(display, static_cast<const es1::Context*>(shareContext), config); 35040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3505