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 gl::Context class, managing all GL state and performing 160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// rendering operations. 170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Context.h" 190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "main.h" 210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "mathutil.h" 220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "utilities.h" 230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "ResourceManager.h" 240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Buffer.h" 250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Fence.h" 260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Framebuffer.h" 270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Program.h" 280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Query.h" 290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Renderbuffer.h" 300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Shader.h" 310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Texture.h" 320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "VertexDataManager.h" 330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "IndexDataManager.h" 340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Display.h" 350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Surface.h" 360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Common/Half.hpp" 370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#define _GDI32_ 390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <windows.h> 400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <GL/GL.h> 410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <GL/glext.h> 420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensnamespace gl 440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 450bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensContext::Context(const Context *shareContext) 460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens : modelView(32), 470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens projection(2) 480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Context *context = new sw::Context(); 500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device = new gl::Device(context); 510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setClearColor(0.0f, 0.0f, 0.0f, 0.0f); 530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthClearValue = 1.0f; 550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilClearValue = 0; 560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.cullFaceEnabled = false; 580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.cullMode = GL_BACK; 590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.frontFace = GL_CCW; 600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthTestEnabled = false; 610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthFunc = GL_LESS; 620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEnabled = false; 630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendRGB = GL_ONE; 640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendAlpha = GL_ONE; 650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendRGB = GL_ZERO; 660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendAlpha = GL_ZERO; 670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationRGB = GL_FUNC_ADD; 680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationAlpha = GL_FUNC_ADD; 690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.red = 0; 700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.green = 0; 710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.blue = 0; 720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.alpha = 0; 730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilTestEnabled = false; 740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilFunc = GL_ALWAYS; 750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilRef = 0; 760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilMask = -1; 770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilWritemask = -1; 780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackFunc = GL_ALWAYS; 790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackRef = 0; 800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackMask = - 1; 810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackWritemask = -1; 820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilFail = GL_KEEP; 830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthFail = GL_KEEP; 840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthPass = GL_KEEP; 850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackFail = GL_KEEP; 860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackPassDepthFail = GL_KEEP; 870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackPassDepthPass = GL_KEEP; 880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetFillEnabled = false; 890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetFactor = 0.0f; 900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetUnits = 0.0f; 910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleAlphaToCoverageEnabled = false; 920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageEnabled = false; 930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageValue = 1.0f; 940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageInvert = false; 950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorTestEnabled = false; 960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.ditherEnabled = true; 970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.generateMipmapHint = GL_DONT_CARE; 980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.fragmentShaderDerivativeHint = GL_DONT_CARE; 990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorLogicOpEnabled = false; 1000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.logicalOperation = GL_COPY; 1010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.lineWidth = 1.0f; 1030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportX = 0; 1050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportY = 0; 1060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportWidth = 0; 1070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportHeight = 0; 1080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.zNear = 0.0f; 1090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.zFar = 1.0f; 1100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorX = 0; 1120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorY = 0; 1130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorWidth = 0; 1140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorHeight = 0; 1150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskRed = true; 1170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskGreen = true; 1180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskBlue = true; 1190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskAlpha = true; 1200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthMask = true; 1210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(shareContext) 1230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager = shareContext->mResourceManager; 1250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->addRef(); 1260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 1280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 1290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager = new ResourceManager(); 1300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 1310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have twodimensional 1330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // and cube map texture state vectors respectively associated with them. 1340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // In order that access to these initial textures not be lost, they are treated as texture 1350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // objects all of whose names are 0. 1360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTexture2DZero = new Texture2D(0); 1380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mProxyTexture2DZero = new Texture2D(0); 1390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTextureCubeMapZero = new TextureCubeMap(0); 1400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.activeSampler = 0; 1420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindArrayBuffer(0); 1430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindElementArrayBuffer(0); 1440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindTextureCubeMap(0); 1450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindTexture2D(0); 1460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindReadFramebuffer(0); 1470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindDrawFramebuffer(0); 1480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindRenderbuffer(0); 1490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.currentProgram = 0; 1510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packAlignment = 4; 1530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackAlignment = 4; 1540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mVertexDataManager = nullptr; 1560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mIndexDataManager = nullptr; 1570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidEnum = false; 1590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidValue = false; 1600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidOperation = false; 1610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mOutOfMemory = false; 1620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidFramebufferOperation = false; 1630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mHasBeenCurrent = false; 1650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens markAllStateDirty(); 1670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens matrixMode = GL_MODELVIEW; 1690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens listMode = 0; 1710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //memset(displayList, 0, sizeof(displayList)); 1720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens listIndex = 0; 1730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens list = 0; 1740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens firstFreeIndex = 1; 1750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens clientTexture = GL_TEXTURE0; 1770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawing = false; 1790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawMode = 0; // FIXME 1800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Color0].mCurrentValue[0] = 1.0f; 1820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Color0].mCurrentValue[1] = 1.0f; 1830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Color0].mCurrentValue[2] = 1.0f; 1840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Color0].mCurrentValue[3] = 1.0f; 1850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Normal].mCurrentValue[0] = 0.0f; 1860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Normal].mCurrentValue[1] = 0.0f; 1870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Normal].mCurrentValue[2] = 1.0f; 1880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Normal].mCurrentValue[3] = 0.0f; 1890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::TexCoord0].mCurrentValue[0] = 0.0f; 1900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::TexCoord0].mCurrentValue[1] = 0.0f; 1910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::TexCoord0].mCurrentValue[2] = 0.0f; 1920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::TexCoord0].mCurrentValue[3] = 1.0f; 1930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::TexCoord1].mCurrentValue[0] = 0.0f; 1940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::TexCoord1].mCurrentValue[1] = 0.0f; 1950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::TexCoord1].mCurrentValue[2] = 0.0f; 1960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::TexCoord1].mCurrentValue[3] = 1.0f; 1970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < 8; i++) 1990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens envEnable[i] = true; 2010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 2030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2040bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensContext::~Context() 2050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 2060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.currentProgram != 0) 2070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *programObject = mResourceManager->getProgram(mState.currentProgram); 2090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(programObject) 2100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens programObject->release(); 2120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.currentProgram = 0; 2140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens while(!mFramebufferNameSpace.empty()) 2170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens deleteFramebuffer(mFramebufferNameSpace.firstName()); 2190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens while(!mFenceNameSpace.empty()) 2220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens deleteFence(mFenceNameSpace.firstName()); 2240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens while(!mQueryNameSpace.empty()) 2270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens deleteQuery(mQueryNameSpace.firstName()); 2290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int type = 0; type < TEXTURE_TYPE_COUNT; type++) 2320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int sampler = 0; sampler < MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++) 2340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.samplerTexture[type][sampler] = nullptr; 2360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_VERTEX_ATTRIBS; i++) 2400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[i].mBoundBuffer = nullptr; 2420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < QUERY_TYPE_COUNT; i++) 2450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.activeQuery[i] = nullptr; 2470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.arrayBuffer = nullptr; 2500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.elementArrayBuffer = nullptr; 2510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.renderbuffer = nullptr; 2520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTexture2DZero = nullptr; 2540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mProxyTexture2DZero = nullptr; 2550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mTextureCubeMapZero = nullptr; 2560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete mVertexDataManager; 2580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete mIndexDataManager; 2590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->release(); 2610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete device; 2620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 2630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::makeCurrent(Surface *surface) 2650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 2660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!mHasBeenCurrent) 2670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mVertexDataManager = new VertexDataManager(this); 2690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mIndexDataManager = new IndexDataManager(); 2700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportX = 0; 2720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportY = 0; 2730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportWidth = surface->getWidth(); 2740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportHeight = surface->getHeight(); 2750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorX = 0; 2770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorY = 0; 2780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorWidth = surface->getWidth(); 2790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorHeight = surface->getHeight(); 2800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mHasBeenCurrent = true; 2820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Wrap the existing resources into GL objects and assign them to the '0' names 2850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Image *defaultRenderTarget = surface->getRenderTarget(); 2860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Image *depthStencil = surface->getDepthStencil(); 2870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Colorbuffer *colorbufferZero = new Colorbuffer(defaultRenderTarget); 2890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens DepthStencilbuffer *depthStencilbufferZero = new DepthStencilbuffer(depthStencil); 2900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebufferZero = new DefaultFramebuffer(colorbufferZero, depthStencilbufferZero); 2910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setFramebufferZero(framebufferZero); 2930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(defaultRenderTarget) 2950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens defaultRenderTarget->release(); 2970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(depthStencil) 3000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens depthStencil->release(); 3020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 3030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens markAllStateDirty(); 3050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// This function will set all of the state-related dirty flags, so that all state is set during next pre-draw. 3080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::markAllStateDirty() 3090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mAppliedProgramSerial = 0; 3110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDepthStateDirty = true; 3130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMaskStateDirty = true; 3140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 3150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 3160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mPolygonOffsetStateDirty = true; 3170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = true; 3180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDitherStateDirty = true; 3190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFrontFaceDirty = true; 3200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mColorLogicOperatorDirty = true; 3210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setClearColor(float red, float green, float blue, float alpha) 3240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorClearValue.red = red; 3260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorClearValue.green = green; 3270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorClearValue.blue = blue; 3280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorClearValue.alpha = alpha; 3290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setClearDepth(float depth) 3320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthClearValue = depth; 3340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setClearStencil(int stencil) 3370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilClearValue = stencil; 3390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setCullFaceEnabled(bool enabled) 3420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.cullFaceEnabled = enabled; 3440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isCullFaceEnabled() const 3470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.cullFaceEnabled; 3490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setCullMode(GLenum mode) 3520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.cullMode = mode; 3540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFrontFace(GLenum front) 3570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.frontFace != front) 3590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.frontFace = front; 3610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFrontFaceDirty = true; 3620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 3630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDepthTestEnabled(bool enabled) 3660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthTestEnabled != enabled) 3680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthTestEnabled = enabled; 3700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDepthStateDirty = true; 3710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 3720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isDepthTestEnabled() const 3750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.depthTestEnabled; 3770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDepthFunc(GLenum depthFunc) 3800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthFunc != depthFunc) 3820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthFunc = depthFunc; 3840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDepthStateDirty = true; 3850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 3860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDepthRange(float zNear, float zFar) 3890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.zNear = zNear; 3910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.zFar = zFar; 3920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 3940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setBlendEnabled(bool enabled) 3950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 3960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.blendEnabled != enabled) 3970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 3980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEnabled = enabled; 3990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 4000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isBlendEnabled() const 4040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.blendEnabled; 4060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha) 4090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sourceBlendRGB != sourceRGB || 4110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendAlpha != sourceAlpha || 4120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendRGB != destRGB || 4130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendAlpha != destAlpha) 4140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendRGB = sourceRGB; 4160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendRGB = destRGB; 4170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sourceBlendAlpha = sourceAlpha; 4180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.destBlendAlpha = destAlpha; 4190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 4200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setBlendColor(float red, float green, float blue, float alpha) 4240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.blendColor.red != red || 4260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.green != green || 4270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.blue != blue || 4280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.alpha != alpha) 4290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.red = red; 4310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.green = green; 4320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.blue = blue; 4330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendColor.alpha = alpha; 4340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 4350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation) 4390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.blendEquationRGB != rgbEquation || 4410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationAlpha != alphaEquation) 4420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationRGB = rgbEquation; 4440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.blendEquationAlpha = alphaEquation; 4450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = true; 4460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilTestEnabled(bool enabled) 4500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilTestEnabled != enabled) 4520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilTestEnabled = enabled; 4540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 4550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isStencilTestEnabled() const 4590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.stencilTestEnabled; 4610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask) 4640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilFunc != stencilFunc || 4660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilRef != stencilRef || 4670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilMask != stencilMask) 4680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilFunc = stencilFunc; 4700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilRef = (stencilRef > 0) ? stencilRef : 0; 4710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilMask = stencilMask; 4720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 4730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask) 4770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilBackFunc != stencilBackFunc || 4790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackRef != stencilBackRef || 4800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackMask != stencilBackMask) 4810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackFunc = stencilBackFunc; 4830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0; 4840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackMask = stencilBackMask; 4850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 4860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilWritemask(GLuint stencilWritemask) 4900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 4910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilWritemask != stencilWritemask) 4920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 4930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilWritemask = stencilWritemask; 4940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 4950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 4970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 4980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilBackWritemask(GLuint stencilBackWritemask) 4990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilBackWritemask != stencilBackWritemask) 5010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackWritemask = stencilBackWritemask; 5030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 5040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass) 5080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilFail != stencilFail || 5100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthFail != stencilPassDepthFail || 5110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthPass != stencilPassDepthPass) 5120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilFail = stencilFail; 5140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthFail = stencilPassDepthFail; 5150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilPassDepthPass = stencilPassDepthPass; 5160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 5170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass) 5210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilBackFail != stencilBackFail || 5230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackPassDepthFail != stencilBackPassDepthFail || 5240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackPassDepthPass != stencilBackPassDepthPass) 5250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackFail = stencilBackFail; 5270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackPassDepthFail = stencilBackPassDepthFail; 5280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilBackPassDepthPass = stencilBackPassDepthPass; 5290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = true; 5300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPolygonOffsetFillEnabled(bool enabled) 5340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.polygonOffsetFillEnabled != enabled) 5360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetFillEnabled = enabled; 5380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mPolygonOffsetStateDirty = true; 5390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isPolygonOffsetFillEnabled() const 5430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.polygonOffsetFillEnabled; 5450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPolygonOffsetParams(GLfloat factor, GLfloat units) 5480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.polygonOffsetFactor != factor || 5500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetUnits != units) 5510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetFactor = factor; 5530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.polygonOffsetUnits = units; 5540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mPolygonOffsetStateDirty = true; 5550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSampleAlphaToCoverageEnabled(bool enabled) 5590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleAlphaToCoverageEnabled != enabled) 5610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleAlphaToCoverageEnabled = enabled; 5630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = true; 5640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isSampleAlphaToCoverageEnabled() const 5680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.sampleAlphaToCoverageEnabled; 5700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSampleCoverageEnabled(bool enabled) 5730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageEnabled != enabled) 5750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageEnabled = enabled; 5770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = true; 5780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isSampleCoverageEnabled() const 5820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.sampleCoverageEnabled; 5840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setSampleCoverageParams(GLclampf value, bool invert) 5870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageValue != value || 5890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageInvert != invert) 5900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 5910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageValue = value; 5920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.sampleCoverageInvert = invert; 5930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = true; 5940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 5950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 5960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 5970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setScissorTestEnabled(bool enabled) 5980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 5990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorTestEnabled = enabled; 6000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isScissorTestEnabled() const 6030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.scissorTestEnabled; 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::setLineWidth(GLfloat width) 6220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.lineWidth = width; 6240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLineWidth(clamp(width, ALIASED_LINE_WIDTH_RANGE_MIN, ALIASED_LINE_WIDTH_RANGE_MAX)); 6250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setGenerateMipmapHint(GLenum hint) 6280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.generateMipmapHint = hint; 6300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFragmentShaderDerivativeHint(GLenum hint) 6330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.fragmentShaderDerivativeHint = hint; 6350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // TODO: Propagate the hint to shader translator so we can write 6360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // ddx, ddx_coarse, or ddx_fine depending on the hint. 6370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Ignore for now. It is valid for implementations to ignore hint. 6380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height) 6410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportX = x; 6430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportY = y; 6440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportWidth = width; 6450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.viewportHeight = height; 6460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height) 6490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorX = x; 6510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorY = y; 6520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorWidth = width; 6530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.scissorHeight = height; 6540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setColorMask(bool red, bool green, bool blue, bool alpha) 6570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.colorMaskRed != red || mState.colorMaskGreen != green || 6590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskBlue != blue || mState.colorMaskAlpha != alpha) 6600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 6610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskRed = red; 6620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskGreen = green; 6630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskBlue = blue; 6640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorMaskAlpha = alpha; 6650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMaskStateDirty = true; 6660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 6670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setDepthMask(bool mask) 6700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthMask != mask) 6720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 6730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.depthMask = mask; 6740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMaskStateDirty = true; 6750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 6760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setActiveSampler(unsigned int active) 6790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.activeSampler = active; 6810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6830bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getReadFramebufferName() const 6840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.readFramebuffer; 6860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6880bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getDrawFramebufferName() const 6890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.drawFramebuffer; 6910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6930bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getRenderbufferName() const 6940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 6950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.renderbuffer.name(); 6960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 6970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 6980bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getArrayBufferName() const 6990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.arrayBuffer.name(); 7010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7030bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::getActiveQuery(GLenum target) const 7040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Query *queryObject = nullptr; 7060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(target) 7080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 7090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ANY_SAMPLES_PASSED: 7100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens queryObject = mState.activeQuery[QUERY_ANY_SAMPLES_PASSED]; 7110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 7120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ANY_SAMPLES_PASSED_CONSERVATIVE: 7130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens queryObject = mState.activeQuery[QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE]; 7140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 7150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 7160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(false); 7170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 7180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(queryObject) 7200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 7210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return queryObject->name; 7220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 7230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 0; 7250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setVertexAttribArrayEnabled(unsigned int attribNum, bool enabled) 7280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mArrayEnabled = enabled; 7300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensconst VertexAttribute &Context::getVertexAttribState(unsigned int attribNum) 7330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.vertexAttribute[attribNum]; 7350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type, bool normalized, 7380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLsizei stride, const void *pointer) 7390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mBoundBuffer = boundBuffer; 7410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mSize = size; 7420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mType = type; 7430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mNormalized = normalized; 7440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mStride = stride; 7450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribNum].mPointer = pointer; 7460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensconst void *Context::getVertexAttribPointer(unsigned int attribNum) const 7490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.vertexAttribute[attribNum].mPointer; 7510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensconst VertexAttributeArray &Context::getVertexAttributes() 7540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.vertexAttribute; 7560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setPackAlignment(GLint alignment) 7590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.packAlignment = alignment; 7610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7630bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLint Context::getPackAlignment() const 7640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.packAlignment; 7660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setUnpackAlignment(GLint alignment) 7690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.unpackAlignment = alignment; 7710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7730bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLint Context::getUnpackAlignment() const 7740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.unpackAlignment; 7760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7780bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createBuffer() 7790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createBuffer(); 7810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7830bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createProgram() 7840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createProgram(); 7860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7880bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createShader(GLenum type) 7890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createShader(type); 7910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7930bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createTexture() 7940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 7950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createTexture(); 7960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 7970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 7980bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createRenderbuffer() 7990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->createRenderbuffer(); 8010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Returns an unused framebuffer name 8040bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createFramebuffer() 8050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mFramebufferNameSpace.allocate(); 8070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8090bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createFence() 8100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mFenceNameSpace.allocate(new Fence()); 8120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Returns an unused query name 8150bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::createQuery() 8160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mQueryNameSpace.allocate(); 8180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteBuffer(GLuint buffer) 8210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mResourceManager->getBuffer(buffer)) 8230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 8240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens detachBuffer(buffer); 8250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 8260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteBuffer(buffer); 8280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteShader(GLuint shader) 8310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteShader(shader); 8330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteProgram(GLuint program) 8360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteProgram(program); 8380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteTexture(GLuint texture) 8410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mResourceManager->getTexture(texture)) 8430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 8440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens detachTexture(texture); 8450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 8460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteTexture(texture); 8480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteRenderbuffer(GLuint renderbuffer) 8510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mResourceManager->getRenderbuffer(renderbuffer)) 8530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 8540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens detachRenderbuffer(renderbuffer); 8550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 8560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->deleteRenderbuffer(renderbuffer); 8580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteFramebuffer(GLuint framebuffer) 8610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebufferObject = mFramebufferNameSpace.remove(framebuffer); 8630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(framebufferObject) 8650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 8660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens detachFramebuffer(framebuffer); 8670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete framebufferObject; 8690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 8700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteFence(GLuint fence) 8730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Fence *fenceObject = mFenceNameSpace.remove(fence); 8750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(fenceObject) 8770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 8780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete fenceObject; 8790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 8800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteQuery(GLuint query) 8830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Query *queryObject = mQueryNameSpace.remove(query); 8850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(queryObject) 8870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 8880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens queryObject->release(); 8890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 8900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8920bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getBuffer(GLuint handle) 8930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getBuffer(handle); 8950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 8960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 8970bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensShader *Context::getShader(GLuint handle) 8980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 8990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getShader(handle); 9000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9020bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensProgram *Context::getProgram(GLuint handle) 9030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getProgram(handle); 9050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9070bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTexture *Context::getTexture(GLuint handle) 9080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getTexture(handle); 9100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9120bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensRenderbuffer *Context::getRenderbuffer(GLuint handle) 9130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getRenderbuffer(handle); 9150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9170bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensFramebuffer *Context::getReadFramebuffer() 9180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return getFramebuffer(mState.readFramebuffer); 9200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9220bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensFramebuffer *Context::getDrawFramebuffer() 9230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return getFramebuffer(mState.drawFramebuffer); 9250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindArrayBuffer(unsigned int buffer) 9280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 9300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.arrayBuffer = getBuffer(buffer); 9320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindElementArrayBuffer(unsigned int buffer) 9350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkBufferAllocation(buffer); 9370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.elementArrayBuffer = getBuffer(buffer); 9390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindTexture2D(GLuint texture) 9420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkTextureAllocation(texture, TEXTURE_2D); 9440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.samplerTexture[TEXTURE_2D][mState.activeSampler] = getTexture(texture); 9460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindTextureCubeMap(GLuint texture) 9490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkTextureAllocation(texture, TEXTURE_CUBE); 9510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.samplerTexture[TEXTURE_CUBE][mState.activeSampler] = getTexture(texture); 9530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindReadFramebuffer(GLuint framebuffer) 9560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!getFramebuffer(framebuffer)) 9580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 9590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFramebufferNameSpace.insert(framebuffer, new Framebuffer()); 9600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 9610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.readFramebuffer = framebuffer; 9630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindDrawFramebuffer(GLuint framebuffer) 9660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!getFramebuffer(framebuffer)) 9680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 9690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFramebufferNameSpace.insert(framebuffer, new Framebuffer()); 9700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 9710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.drawFramebuffer = framebuffer; 9730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::bindRenderbuffer(GLuint renderbuffer) 9760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mResourceManager->checkRenderbufferAllocation(renderbuffer); 9780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.renderbuffer = getRenderbuffer(renderbuffer); 9800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 9810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::useProgram(GLuint program) 9830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 9840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLuint priorProgram = mState.currentProgram; 9850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.currentProgram = program; // Must switch before trying to delete, otherwise it only gets flagged. 9860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(priorProgram != program) 9880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 9890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *newProgram = mResourceManager->getProgram(program); 9900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *oldProgram = mResourceManager->getProgram(priorProgram); 9910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(newProgram) 9930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 9940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens newProgram->addRef(); 9950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 9960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 9970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(oldProgram) 9980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 9990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens oldProgram->release(); 10000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::beginQuery(GLenum target, GLuint query) 10050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // From EXT_occlusion_query_boolean: If BeginQueryEXT is called with an <id> 10070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // of zero, if the active query object name for <target> is non-zero (for the 10080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // targets ANY_SAMPLES_PASSED_EXT and ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, if 10090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // the active query for either target is non-zero), if <id> is the name of an 10100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // existing query object whose type does not match <target>, or if <id> is the 10110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // active query object name for any query type, the error INVALID_OPERATION is 10120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // generated. 10130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Ensure no other queries are active 10150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // NOTE: If other queries than occlusion are supported, we will need to check 10160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // separately that: 10170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // a) The query ID passed is not the current active query for any target/type 10180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // b) There are no active queries for the requested target (and in the case 10190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // of GL_ANY_SAMPLES_PASSED_EXT and GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, 10200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // no query may be active for either if glBeginQuery targets either. 10210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < QUERY_TYPE_COUNT; i++) 10220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.activeQuery[i]) 10240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 10260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens QueryType qType; 10300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(target) 10310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ANY_SAMPLES_PASSED: 10330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens qType = QUERY_ANY_SAMPLES_PASSED; 10340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 10350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ANY_SAMPLES_PASSED_CONSERVATIVE: 10360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens qType = QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE; 10370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 10380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 10390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(false); 10400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Query *queryObject = getQuery(query, true, target); 10430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Check that name was obtained with glGenQueries 10450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!queryObject) 10460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 10480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Check for type mismatch 10510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(queryObject->getType() != target) 10520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 10540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Set query as active for specified target 10570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.activeQuery[qType] = queryObject; 10580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Begin query 10600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens queryObject->begin(); 10610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::endQuery(GLenum target) 10640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens QueryType qType; 10660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(target) 10680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ANY_SAMPLES_PASSED: 10700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens qType = QUERY_ANY_SAMPLES_PASSED; 10710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 10720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ANY_SAMPLES_PASSED_CONSERVATIVE: 10730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens qType = QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE; 10740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 10750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 10760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(false); 10770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Query *queryObject = mState.activeQuery[qType]; 10800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!queryObject) 10820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 10830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 10840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 10850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens queryObject->end(); 10870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.activeQuery[qType] = nullptr; 10890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFramebufferZero(Framebuffer *buffer) 10920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete mFramebufferNameSpace.remove(0); 10940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFramebufferNameSpace.insert(0, buffer); 10950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 10960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 10970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setRenderbufferStorage(RenderbufferStorage *renderbuffer) 10980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 10990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *renderbufferObject = mState.renderbuffer; 11000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens renderbufferObject->setStorage(renderbuffer); 11010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11030bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensFramebuffer *Context::getFramebuffer(unsigned int handle) 11040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mFramebufferNameSpace.find(handle); 11060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11080bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensFence *Context::getFence(unsigned int handle) 11090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mFenceNameSpace.find(handle); 11110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11130bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensQuery *Context::getQuery(unsigned int handle, bool create, GLenum type) 11140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!mQueryNameSpace.isReserved(handle)) 11160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 11170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return nullptr; 11180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 11190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 11200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 11210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Query *query = mQueryNameSpace.find(handle); 11220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!query && create) 11230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 11240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens query = new Query(handle, type); 11250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens query->addRef(); 11260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mQueryNameSpace.insert(handle, query); 11270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 11280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return query; 11300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 11310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11330bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getArrayBuffer() 11340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.arrayBuffer; 11360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11380bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensBuffer *Context::getElementArrayBuffer() 11390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.elementArrayBuffer; 11410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11430bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensProgram *Context::getCurrentProgram() 11440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mResourceManager->getProgram(mState.currentProgram); 11460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11480bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTexture2D *Context::getTexture2D(GLenum target) 11490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(target == GL_TEXTURE_2D) 11510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 11520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return static_cast<Texture2D*>(getSamplerTexture(mState.activeSampler, TEXTURE_2D)); 11530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 11540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(target == GL_PROXY_TEXTURE_2D) 11550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 11560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return static_cast<Texture2D*>(getSamplerTexture(mState.activeSampler, PROXY_TEXTURE_2D)); 11570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 11580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNREACHABLE(target); 11590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return nullptr; 11610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11630bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTextureCubeMap *Context::getTextureCubeMap() 11640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return static_cast<TextureCubeMap*>(getSamplerTexture(mState.activeSampler, TEXTURE_CUBE)); 11660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11680bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensTexture *Context::getSamplerTexture(unsigned int sampler, TextureType type) 11690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLuint texid = mState.samplerTexture[type][sampler].name(); 11710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(texid == 0) // Special case: 0 refers to different initial textures based on the target 11730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 11740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(type) 11750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 11760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case TEXTURE_2D: return mTexture2DZero; 11770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case PROXY_TEXTURE_2D: return mProxyTexture2DZero; 11780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case TEXTURE_CUBE: return mTextureCubeMapZero; 11790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(type); 11800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 11810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 11820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.samplerTexture[type][sampler]; 11840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 11850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 11860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::getBooleanv(GLenum pname, GLboolean *params) 11870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 11880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 11890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 11900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SHADER_COMPILER: *params = GL_TRUE; break; 11910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_INVERT: *params = mState.sampleCoverageInvert; break; 11920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_WRITEMASK: *params = mState.depthMask; break; 11930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_WRITEMASK: 11940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.colorMaskRed; 11950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.colorMaskGreen; 11960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.colorMaskBlue; 11970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.colorMaskAlpha; 11980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 11990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CULL_FACE: *params = mState.cullFaceEnabled; break; 12000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FILL: *params = mState.polygonOffsetFillEnabled; break; 12010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mState.sampleAlphaToCoverageEnabled; break; 12020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE: *params = mState.sampleCoverageEnabled; break; 12030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_TEST: *params = mState.scissorTestEnabled; break; 12040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_TEST: *params = mState.stencilTestEnabled; break; 12050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_TEST: *params = mState.depthTestEnabled; break; 12060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND: *params = mState.blendEnabled; break; 12070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DITHER: *params = mState.ditherEnabled; break; 12080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 12090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 12100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 12130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::getFloatv(GLenum pname, GLfloat *params) 12160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation 12180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // because it is stored as a float, despite the fact that the GL ES 2.0 spec names 12190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // GetIntegerv as its native query function. As it would require conversion in any 12200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // case, this should make no difference to the calling application. 12210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 12220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_WIDTH: *params = mState.lineWidth; break; 12240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_VALUE: *params = mState.sampleCoverageValue; break; 12250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_CLEAR_VALUE: *params = mState.depthClearValue; break; 12260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FACTOR: *params = mState.polygonOffsetFactor; break; 12270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_UNITS: *params = mState.polygonOffsetUnits; break; 12280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_LINE_WIDTH_RANGE: 12290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = ALIASED_LINE_WIDTH_RANGE_MIN; 12300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = ALIASED_LINE_WIDTH_RANGE_MAX; 12310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 12320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_POINT_SIZE_RANGE: 12330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = ALIASED_POINT_SIZE_RANGE_MIN; 12340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = ALIASED_POINT_SIZE_RANGE_MAX; 12350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 12360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_RANGE: 12370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.zNear; 12380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.zFar; 12390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 12400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_CLEAR_VALUE: 12410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.colorClearValue.red; 12420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.colorClearValue.green; 12430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.colorClearValue.blue; 12440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.colorClearValue.alpha; 12450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 12460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_COLOR: 12470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.blendColor.red; 12480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.blendColor.green; 12490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.blendColor.blue; 12500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.blendColor.alpha; 12510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 12520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: 12530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = MAX_TEXTURE_MAX_ANISOTROPY; 12540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 12550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MODELVIEW_MATRIX: 12560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < 16; i++) 12570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[i] = modelView.current()[i % 4][i / 4]; 12590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 12610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PROJECTION_MATRIX: 12620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < 16; i++) 12630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[i] = projection.current()[i % 4][i / 4]; 12650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 12670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 12680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 12690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 12700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 12720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 12730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 12740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::getIntegerv(GLenum pname, GLint *params) 12750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 12760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation 12770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // because it is stored as a float, despite the fact that the GL ES 2.0 spec names 12780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // GetIntegerv as its native query function. As it would require conversion in any 12790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // case, this should make no difference to the calling application. You may find it in 12800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Context::getFloatv. 12810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 12820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 12830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_ATTRIBS: *params = MAX_VERTEX_ATTRIBS; break; 12840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = MAX_VERTEX_UNIFORM_VECTORS; break; 12850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_UNIFORM_COMPONENTS: *params = MAX_VERTEX_UNIFORM_VECTORS * 4; break; // FIXME: Verify 12860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VARYING_VECTORS: *params = MAX_VARYING_VECTORS; break; 12870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = MAX_COMBINED_TEXTURE_IMAGE_UNITS; break; 12880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = MAX_VERTEX_TEXTURE_IMAGE_UNITS; break; 12890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_IMAGE_UNITS: *params = MAX_TEXTURE_IMAGE_UNITS; break; 12900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = MAX_FRAGMENT_UNIFORM_VECTORS; break; 12910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: *params = MAX_VERTEX_UNIFORM_VECTORS * 4; break; // FIXME: Verify 12920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_RENDERBUFFER_SIZE: *params = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE; break; 12930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NUM_SHADER_BINARY_FORMATS: *params = 0; break; 12940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SHADER_BINARY_FORMATS: /* no shader binary formats are supported */ break; 12950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ARRAY_BUFFER_BINDING: *params = mState.arrayBuffer.name(); break; 12960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ELEMENT_ARRAY_BUFFER_BINDING: *params = mState.elementArrayBuffer.name(); break; 12970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 12980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DRAW_FRAMEBUFFER_BINDING: *params = mState.drawFramebuffer; break; 12990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_READ_FRAMEBUFFER_BINDING: *params = mState.readFramebuffer; break; 13000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RENDERBUFFER_BINDING: *params = mState.renderbuffer.name(); break; 13010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CURRENT_PROGRAM: *params = mState.currentProgram; break; 13020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PACK_ALIGNMENT: *params = mState.packAlignment; break; 13030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNPACK_ALIGNMENT: *params = mState.unpackAlignment; break; 13040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GENERATE_MIPMAP_HINT: *params = mState.generateMipmapHint; break; 13050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRAGMENT_SHADER_DERIVATIVE_HINT: *params = mState.fragmentShaderDerivativeHint; break; 13060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ACTIVE_TEXTURE: *params = (mState.activeSampler + GL_TEXTURE0); break; 13070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_FUNC: *params = mState.stencilFunc; break; 13080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_REF: *params = mState.stencilRef; break; 13090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_VALUE_MASK: *params = mState.stencilMask; break; 13100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_FUNC: *params = mState.stencilBackFunc; break; 13110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_REF: *params = mState.stencilBackRef; break; 13120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_VALUE_MASK: *params = mState.stencilBackMask; break; 13130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_FAIL: *params = mState.stencilFail; break; 13140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_PASS_DEPTH_FAIL: *params = mState.stencilPassDepthFail; break; 13150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_PASS_DEPTH_PASS: *params = mState.stencilPassDepthPass; break; 13160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_FAIL: *params = mState.stencilBackFail; break; 13170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_PASS_DEPTH_FAIL: *params = mState.stencilBackPassDepthFail; break; 13180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_PASS_DEPTH_PASS: *params = mState.stencilBackPassDepthPass; break; 13190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_FUNC: *params = mState.depthFunc; break; 13200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_SRC_RGB: *params = mState.sourceBlendRGB; break; 13210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_SRC_ALPHA: *params = mState.sourceBlendAlpha; break; 13220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_DST_RGB: *params = mState.destBlendRGB; break; 13230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_DST_ALPHA: *params = mState.destBlendAlpha; break; 13240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_EQUATION_RGB: *params = mState.blendEquationRGB; break; 13250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_EQUATION_ALPHA: *params = mState.blendEquationAlpha; break; 13260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_WRITEMASK: *params = mState.stencilWritemask; break; 13270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_WRITEMASK: *params = mState.stencilBackWritemask; break; 13280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_CLEAR_VALUE: *params = mState.stencilClearValue; break; 13290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SUBPIXEL_BITS: *params = 4; break; 13300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_SIZE: *params = IMPLEMENTATION_MAX_TEXTURE_SIZE; break; 13310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_CUBE_MAP_TEXTURE_SIZE: *params = IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE; break; 13320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_ARRAY_TEXTURE_LAYERS: *params = 0; break; 13330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NUM_COMPRESSED_TEXTURE_FORMATS: *params = NUM_COMPRESSED_TEXTURE_FORMATS; break; 13340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_SAMPLES: *params = IMPLEMENTATION_MAX_SAMPLES; break; 13350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_BUFFERS: 13360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLES: 13370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 13390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int width, height, samples; 13400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 13410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(framebuffer->completeness(width, height, samples) == GL_FRAMEBUFFER_COMPLETE) 13420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 13440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_BUFFERS: 13460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(samples > 1) 13470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 1; 13490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 13510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 13530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLES: 13560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = samples; 13570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 13610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 13630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_TYPE: *params = IMPLEMENTATION_COLOR_READ_TYPE; break; 13670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_FORMAT: *params = IMPLEMENTATION_COLOR_READ_FORMAT; break; 13680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VIEWPORT_DIMS: 13690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int maxDimension = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE; 13710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = maxDimension; 13720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = maxDimension; 13730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COMPRESSED_TEXTURE_FORMATS: 13760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < NUM_COMPRESSED_TEXTURE_FORMATS; i++) 13780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 13790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[i] = compressedTextureFormats[i]; 13800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 13820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VIEWPORT: 13840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.viewportX; 13850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.viewportY; 13860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.viewportWidth; 13870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.viewportHeight; 13880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_BOX: 13900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[0] = mState.scissorX; 13910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[1] = mState.scissorY; 13920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[2] = mState.scissorWidth; 13930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens params[3] = mState.scissorHeight; 13940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 13950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CULL_FACE_MODE: *params = mState.cullMode; break; 13960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRONT_FACE: *params = mState.frontFace; break; 13970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RED_BITS: 13980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GREEN_BITS: 13990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLUE_BITS: 14000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALPHA_BITS: 14010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 14030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *colorbuffer = framebuffer->getColorbuffer(); 14040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(colorbuffer) 14060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 14080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RED_BITS: *params = colorbuffer->getRedSize(); break; 14100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break; 14110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); break; 14120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break; 14130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 14160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 14180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 14210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_BITS: 14220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 14240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *depthbuffer = framebuffer->getDepthbuffer(); 14250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(depthbuffer) 14270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = depthbuffer->getDepthSize(); 14290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 14310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 14330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 14360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BITS: 14370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 14390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *stencilbuffer = framebuffer->getStencilbuffer(); 14400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(stencilbuffer) 14420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = stencilbuffer->getStencilSize(); 14440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 14460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = 0; 14480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 14510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_2D: 14520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1) 14540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens error(GL_INVALID_OPERATION); 14560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 14570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = mState.samplerTexture[TEXTURE_2D][mState.activeSampler].name(); 14600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 14620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_CUBE_MAP: 14630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1) 14650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens error(GL_INVALID_OPERATION); 14670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 14680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *params = mState.samplerTexture[TEXTURE_CUBE][mState.activeSampler].name(); 14710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 14730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 14740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 14750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 14780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 14790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 14800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams) 14810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 14820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation 14830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due 14840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // to the fact that it is stored internally as a float, and so would require conversion 14850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // if returned from Context::getIntegerv. Since this conversion is already implemented 14860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we 14870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling 14880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // application. 14890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(pname) 14900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COMPRESSED_TEXTURE_FORMATS: 14920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_INT; 14940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = NUM_COMPRESSED_TEXTURE_FORMATS; 14950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 14960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 14970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SHADER_BINARY_FORMATS: 14980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 14990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_INT; 15000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 0; 15010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 15020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 15030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_ATTRIBS: 15040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_UNIFORM_VECTORS: 15050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VARYING_VECTORS: 15060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: 15070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: 15080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_IMAGE_UNITS: 15090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_FRAGMENT_UNIFORM_VECTORS: 15100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_RENDERBUFFER_SIZE: 15110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NUM_SHADER_BINARY_FORMATS: 15120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NUM_COMPRESSED_TEXTURE_FORMATS: 15130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ARRAY_BUFFER_BINDING: 15140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRAMEBUFFER_BINDING: 15150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RENDERBUFFER_BINDING: 15160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CURRENT_PROGRAM: 15170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PACK_ALIGNMENT: 15180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNPACK_ALIGNMENT: 15190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GENERATE_MIPMAP_HINT: 15200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRAGMENT_SHADER_DERIVATIVE_HINT: 15210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RED_BITS: 15220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GREEN_BITS: 15230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLUE_BITS: 15240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALPHA_BITS: 15250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_BITS: 15260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BITS: 15270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ELEMENT_ARRAY_BUFFER_BINDING: 15280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CULL_FACE_MODE: 15290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FRONT_FACE: 15300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ACTIVE_TEXTURE: 15310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_FUNC: 15320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_VALUE_MASK: 15330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_REF: 15340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_FAIL: 15350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_PASS_DEPTH_FAIL: 15360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_PASS_DEPTH_PASS: 15370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_FUNC: 15380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_VALUE_MASK: 15390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_REF: 15400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_FAIL: 15410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_PASS_DEPTH_FAIL: 15420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_PASS_DEPTH_PASS: 15430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_FUNC: 15440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_SRC_RGB: 15450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_SRC_ALPHA: 15460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_DST_RGB: 15470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_DST_ALPHA: 15480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_EQUATION_RGB: 15490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_EQUATION_ALPHA: 15500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_WRITEMASK: 15510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_BACK_WRITEMASK: 15520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_CLEAR_VALUE: 15530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SUBPIXEL_BITS: 15540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_SIZE: 15550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_CUBE_MAP_TEXTURE_SIZE: 15560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_BUFFERS: 15570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLES: 15580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_TYPE: 15590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_IMPLEMENTATION_COLOR_READ_FORMAT: 15600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_2D: 15610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE_BINDING_CUBE_MAP: 15620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VERTEX_UNIFORM_COMPONENTS: 15630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: 15640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_ARRAY_TEXTURE_LAYERS: 15650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 15660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_INT; 15670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 1; 15680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 15690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 15700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_SAMPLES: 15710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 15720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_INT; 15730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 1; 15740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 15750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 15760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_VIEWPORT_DIMS: 15770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 15780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_INT; 15790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 2; 15800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 15810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 15820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_VIEWPORT: 15830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_BOX: 15840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 15850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_INT; 15860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 4; 15870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 15880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 15890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SHADER_COMPILER: 15900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_INVERT: 15910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_WRITEMASK: 15920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled, 15930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries. 15940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as bool-natural 15950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE: 15960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SCISSOR_TEST: 15970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_STENCIL_TEST: 15980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_TEST: 15990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND: 16000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DITHER: 16010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_BOOL; 16030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 1; 16040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_WRITEMASK: 16070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_BOOL; 16090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 4; 16100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_FACTOR: 16130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON_OFFSET_UNITS: 16140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SAMPLE_COVERAGE_VALUE: 16150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_CLEAR_VALUE: 16160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_WIDTH: 16170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_FLOAT; 16190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 1; 16200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_LINE_WIDTH_RANGE: 16230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALIASED_POINT_SIZE_RANGE: 16240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DEPTH_RANGE: 16250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_FLOAT; 16270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 2; 16280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_COLOR_CLEAR_VALUE: 16310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BLEND_COLOR: 16320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_FLOAT; 16340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 4; 16350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: 16380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *type = GL_FLOAT; 16390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *numParams = 1; 16400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 16410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 16420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 16430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 16460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 16470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Applies the render target surface, depth stencil surface, viewport rectangle and scissor rectangle 16490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::applyRenderTarget() 16500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 16510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 16520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int width, height, samples; 16530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!framebuffer || framebuffer->completeness(width, height, samples) != GL_FRAMEBUFFER_COMPLETE) 16550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_FRAMEBUFFER_OPERATION, false); 16570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Image *renderTarget = framebuffer->getRenderTarget(); 16600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setRenderTarget(0, renderTarget); 16610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(renderTarget) renderTarget->release(); 16620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Image *depthStencil = framebuffer->getDepthStencil(); 16640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthStencilSurface(depthStencil); 16650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(depthStencil) depthStencil->release(); 16660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Viewport viewport; 16680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float zNear = clamp01(mState.zNear); 16690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float zFar = clamp01(mState.zFar); 16700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.x0 = mState.viewportX; 16720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.y0 = mState.viewportY; 16730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.width = mState.viewportWidth; 16740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.height = mState.viewportHeight; 16750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.minZ = zNear; 16760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens viewport.maxZ = zFar; 16770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setViewport(viewport); 16790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.scissorTestEnabled) 16810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Rect scissor = {mState.scissorX, mState.scissorY, mState.scissorX + mState.scissorWidth, mState.scissorY + mState.scissorHeight}; 16830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens scissor.clip(0, 0, width, height); 16840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setScissorRect(scissor); 16860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setScissorEnable(true); 16870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 16890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setScissorEnable(false); 16910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 16920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *program = getCurrentProgram(); 16940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 16950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(program) 16960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 16970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLfloat nearFarDiff[3] = {zNear, zFar, zFar - zNear}; 16980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens program->setUniform1fv(program->getUniformLocation("gl_DepthRange.near"), 1, &nearFarDiff[0]); 16990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens program->setUniform1fv(program->getUniformLocation("gl_DepthRange.far"), 1, &nearFarDiff[1]); 17000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens program->setUniform1fv(program->getUniformLocation("gl_DepthRange.diff"), 1, &nearFarDiff[2]); 17010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 17040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 17050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Applies the fixed-function state (culling, depth test, alpha blending, stenciling, etc) 17070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyState(GLenum drawMode) 17080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 17090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 17100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.cullFaceEnabled) 17120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setCullMode(es2sw::ConvertCullMode(mState.cullMode, mState.frontFace)); 17140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 17160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setCullMode(sw::CULL_NONE); 17180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mDepthStateDirty) 17210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthTestEnabled) 17230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBufferEnable(true); 17250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthCompare(es2sw::ConvertDepthComparison(mState.depthFunc)); 17260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 17280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBufferEnable(false); 17300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDepthStateDirty = false; 17330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mBlendStateDirty) 17360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.blendEnabled) 17380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAlphaBlendEnable(true); 17400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSeparateAlphaBlendEnable(true); 17410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setBlendConstant(es2sw::ConvertColor(mState.blendColor)); 17430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSourceBlendFactor(es2sw::ConvertBlendFunc(mState.sourceBlendRGB)); 17450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDestBlendFactor(es2sw::ConvertBlendFunc(mState.destBlendRGB)); 17460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setBlendOperation(es2sw::ConvertBlendOp(mState.blendEquationRGB)); 17470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSourceBlendFactorAlpha(es2sw::ConvertBlendFunc(mState.sourceBlendAlpha)); 17490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDestBlendFactorAlpha(es2sw::ConvertBlendFunc(mState.destBlendAlpha)); 17500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setBlendOperationAlpha(es2sw::ConvertBlendOp(mState.blendEquationAlpha)); 17510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 17530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAlphaBlendEnable(false); 17550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mBlendStateDirty = false; 17580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mColorLogicOperatorDirty) 17610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.colorLogicOpEnabled) 17630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setColorLogicOpEnabled(true); 17650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLogicalOperation(es2sw::ConvertLogicalOperation(mState.logicalOperation)); 17660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 17680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setColorLogicOpEnabled(false); 17700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mColorLogicOperatorDirty = false; 17730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mStencilStateDirty || mFrontFaceDirty) 17760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilTestEnabled && framebuffer->hasStencil()) 17780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilEnable(true); 17800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTwoSidedStencil(true); 17810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilWritemask != mState.stencilBackWritemask || 17830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilRef != mState.stencilBackRef || 17840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.stencilMask != mState.stencilBackMask) 17850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ERR("Separate front/back stencil writemasks, reference values, or stencil mask values are invalid under WebGL."); 17870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 17880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 17890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // get the maximum size of the stencil ref 17910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *stencilbuffer = framebuffer->getStencilbuffer(); 17920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLuint maxStencil = (1 << stencilbuffer->getStencilSize()) - 1; 17930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.frontFace == GL_CCW) 17950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 17960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilWriteMask(mState.stencilWritemask); 17970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilCompare(es2sw::ConvertStencilComparison(mState.stencilFunc)); 17980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 17990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilReference((mState.stencilRef < (GLint)maxStencil) ? mState.stencilRef : maxStencil); 18000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilMask(mState.stencilMask); 18010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilFailOperation(es2sw::ConvertStencilOp(mState.stencilFail)); 18030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilZFailOperation(es2sw::ConvertStencilOp(mState.stencilPassDepthFail)); 18040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilPassOperation(es2sw::ConvertStencilOp(mState.stencilPassDepthPass)); 18050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilWriteMaskCCW(mState.stencilBackWritemask); 18070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilCompareCCW(es2sw::ConvertStencilComparison(mState.stencilBackFunc)); 18080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilReferenceCCW((mState.stencilBackRef < (GLint)maxStencil) ? mState.stencilBackRef : maxStencil); 18100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilMaskCCW(mState.stencilBackMask); 18110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilFailOperationCCW(es2sw::ConvertStencilOp(mState.stencilBackFail)); 18130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilZFailOperationCCW(es2sw::ConvertStencilOp(mState.stencilBackPassDepthFail)); 18140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilPassOperationCCW(es2sw::ConvertStencilOp(mState.stencilBackPassDepthPass)); 18150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 18170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilWriteMaskCCW(mState.stencilWritemask); 18190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilCompareCCW(es2sw::ConvertStencilComparison(mState.stencilFunc)); 18200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilReferenceCCW((mState.stencilRef < (GLint)maxStencil) ? mState.stencilRef : maxStencil); 18220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilMaskCCW(mState.stencilMask); 18230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilFailOperationCCW(es2sw::ConvertStencilOp(mState.stencilFail)); 18250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilZFailOperationCCW(es2sw::ConvertStencilOp(mState.stencilPassDepthFail)); 18260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilPassOperationCCW(es2sw::ConvertStencilOp(mState.stencilPassDepthPass)); 18270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilWriteMask(mState.stencilBackWritemask); 18290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilCompare(es2sw::ConvertStencilComparison(mState.stencilBackFunc)); 18300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilReference((mState.stencilBackRef < (GLint)maxStencil) ? mState.stencilBackRef : maxStencil); 18320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilMask(mState.stencilBackMask); 18330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilFailOperation(es2sw::ConvertStencilOp(mState.stencilBackFail)); 18350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilZFailOperation(es2sw::ConvertStencilOp(mState.stencilBackPassDepthFail)); 18360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilPassOperation(es2sw::ConvertStencilOp(mState.stencilBackPassDepthPass)); 18370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 18400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStencilEnable(false); 18420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mStencilStateDirty = false; 18450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mFrontFaceDirty = false; 18460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mMaskStateDirty) 18490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setColorWriteMask(0, es2sw::ConvertColorMask(mState.colorMaskRed, mState.colorMaskGreen, mState.colorMaskBlue, mState.colorMaskAlpha)); 18510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthWriteEnable(mState.depthMask); 18520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mMaskStateDirty = false; 18540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mPolygonOffsetStateDirty) 18570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.polygonOffsetFillEnabled) 18590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *depthbuffer = framebuffer->getDepthbuffer(); 18610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(depthbuffer) 18620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSlopeDepthBias(mState.polygonOffsetFactor); 18640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float depthBias = ldexp(mState.polygonOffsetUnits, -(int)(depthbuffer->getDepthSize())); 18650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBias(depthBias); 18660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 18690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSlopeDepthBias(0); 18710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDepthBias(0); 18720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mPolygonOffsetStateDirty = false; 18750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mSampleStateDirty) 18780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleAlphaToCoverageEnabled) 18800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTransparencyAntialiasing(sw::TRANSPARENCY_ALPHA_TO_COVERAGE); 18820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 18840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTransparencyAntialiasing(sw::TRANSPARENCY_NONE); 18860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 18870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageEnabled) 18890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int mask = 0; 18910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageValue != 0) 18920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 18930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int width, height, samples; 18940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens framebuffer->completeness(width, height, samples); 18950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float threshold = 0.5f; 18970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 18980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < samples; i++) 18990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mask <<= 1; 19010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if((i + 1) * mState.sampleCoverageValue >= threshold) 19030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens threshold += 1.0f; 19050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mask |= 1; 19060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.sampleCoverageInvert) 19110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mask = ~mask; 19130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMultiSampleMask(mask); 19160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 19180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMultiSampleMask(0xFFFFFFFF); 19200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mSampleStateDirty = false; 19230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mDitherStateDirty) 19260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // UNIMPLEMENTED(); // FIXME 19280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mDitherStateDirty = false; 19300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 19320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19330bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLenum Context::applyVertexBuffer(GLint base, GLint first, GLsizei count) 19340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 19350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS]; 19360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum err = mVertexDataManager->prepareVertexData(first, count, attributes); 19380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err != GL_NO_ERROR) 19390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return err; 19410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *program = getCurrentProgram(); 19440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->resetInputStreams(false); 19460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_VERTEX_ATTRIBS; i++) 19480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(program && program->getAttributeStream(i) == -1) 19500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens continue; 19520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Resource *resource = attributes[i].vertexBuffer; 19550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const void *buffer = (char*)resource->data() + attributes[i].offset; 19560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int stride = attributes[i].stride; 19580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens buffer = (char*)buffer + stride * base; 19600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Stream attribute(resource, buffer, stride); 19620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens attribute.type = attributes[i].type; 19640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens attribute.count = attributes[i].count; 19650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens attribute.normalized = attributes[i].normalized; 19660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int stream = program ? program->getAttributeStream(i) : i; 19680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setInputStream(stream, attribute); 19690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_NO_ERROR; 19720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 19730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Applies the indices and element array bindings 19750bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLenum Context::applyIndexBuffer(const void *indices, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo) 19760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 19770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum err = mIndexDataManager->prepareIndexData(type, count, mState.elementArrayBuffer, indices, indexInfo); 19780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err == GL_NO_ERROR) 19800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setIndexBuffer(indexInfo->indexBuffer); 19820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return err; 19850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 19860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 19870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Applies the shaders and shader constants 19880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyShaders() 19890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 19900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *programObject = getCurrentProgram(); 19910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!programObject) 19920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 19930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setVertexShader(0); 19940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setPixelShader(0); 19950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 19960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 19970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::VertexShader *vertexShader = programObject->getVertexShader(); 19980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::PixelShader *pixelShader = programObject->getPixelShader(); 19990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setVertexShader(vertexShader); 20010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setPixelShader(pixelShader); 20020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(programObject->getSerial() != mAppliedProgramSerial) 20040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens programObject->dirtyAllUniforms(); 20060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mAppliedProgramSerial = programObject->getSerial(); 20070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens programObject->applyUniforms(); 20100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 20110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyTextures() 20130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 20140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTextures(sw::SAMPLER_PIXEL); 20150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //applyTextures(sw::SAMPLER_VERTEX); 20160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 20170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyTextures(sw::SamplerType samplerType) 20190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 20200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *programObject = getCurrentProgram(); 20210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int samplerCount = (samplerType == sw::SAMPLER_PIXEL) ? MAX_TEXTURE_IMAGE_UNITS : MAX_VERTEX_TEXTURE_IMAGE_UNITS; // Range of samplers of given sampler type 20230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int samplerIndex = 0; samplerIndex < samplerCount; samplerIndex++) 20250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int textureUnit = programObject ? programObject->getSamplerMapping(samplerType, samplerIndex) : samplerIndex; // OpenGL texture image unit index 20270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(textureUnit != -1) 20290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TextureType textureType = programObject ? programObject->getSamplerTextureType(samplerType, samplerIndex) : TEXTURE_2D; 20310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Texture *texture = getSamplerTexture(textureUnit, textureType); 20330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(envEnable[samplerIndex] && texture->isSamplerComplete()) 20350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum wrapS = texture->getWrapS(); 20370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum wrapT = texture->getWrapT(); 20380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum minFilter = texture->getMinFilter(); 20390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum magFilter = texture->getMagFilter(); 20400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLfloat maxAnisotropy = texture->getMaxAnisotropy(); 20410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAddressingModeU(samplerType, samplerIndex, es2sw::ConvertTextureWrap(wrapS)); 20430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAddressingModeV(samplerType, samplerIndex, es2sw::ConvertTextureWrap(wrapT)); 20440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureFilter(samplerType, samplerIndex, es2sw::ConvertTextureFilter(minFilter, magFilter, maxAnisotropy)); 20460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMipmapFilter(samplerType, samplerIndex, es2sw::ConvertMipMapFilter(minFilter)); 20470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setMaxAnisotropy(samplerType, samplerIndex, maxAnisotropy); 20480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTexture(samplerType, samplerIndex, texture); 20500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(samplerIndex, sw::TextureStage::STAGE_MODULATE); 20520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstArgument(samplerIndex, sw::TextureStage::SOURCE_TEXTURE); 20530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSecondArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT); 20540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //device->setThirdArgument(samplerIndex, sw::TextureStage::SOURCE_CONSTANT); 20550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(samplerIndex, sw::TextureStage::STAGE_MODULATE); 20570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_TEXTURE); 20580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSecondArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT); 20590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //device->setThirdArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CONSTANT); 20600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //device->setConstantColor(0, sw::Color<float>(0.0f, 0.0f, 0.0f, 0.0f)); 20620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 20640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTexture(samplerType, samplerIndex, nullptr); 20660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperation(samplerIndex, sw::TextureStage::STAGE_SELECTARG1); 20680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT); 20690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSecondArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT); 20700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //device->setThirdArgument(samplerIndex, sw::TextureStage::SOURCE_CONSTANT); 20710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setStageOperationAlpha(samplerIndex, sw::TextureStage::STAGE_SELECTARG1); 20730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFirstArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT); 20740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSecondArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CURRENT); 20750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //device->setThirdArgumentAlpha(samplerIndex, sw::TextureStage::SOURCE_CONSTANT); 20760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 20790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTexture(samplerType, samplerIndex, nullptr); 20810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 20840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::applyTexture(sw::SamplerType type, int index, Texture *baseTexture) 20860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 20870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Program *program = getCurrentProgram(); 20880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int sampler = (type == sw::SAMPLER_PIXEL) ? index : 16 + index; 20890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool textureUsed = false; 20900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 20910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(type == sw::SAMPLER_PIXEL) 20920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureUsed = program ? program->getPixelShader()->usesSampler(index) : true; 20940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(type == sw::SAMPLER_VERTEX) 20960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 20970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens textureUsed = program ? program->getVertexShader()->usesSampler(index) : false; 20980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 20990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNREACHABLE(type); 21000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Resource *resource = nullptr; 21020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(baseTexture && textureUsed) 21040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens resource = baseTexture->getResource(); 21060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureResource(sampler, resource); 21090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(baseTexture && textureUsed) 21110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2112b3f54e844c7bb9bc7b070ede7b574c373d4f67f1Nicolas Capens int topLevel = baseTexture->getTopLevel(); 21130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(baseTexture->getTarget() == GL_TEXTURE_2D) 21150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Texture2D *texture = static_cast<Texture2D*>(baseTexture); 21170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++) 21190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int surfaceLevel = mipmapLevel; 21210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(surfaceLevel < 0) 21230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens surfaceLevel = 0; 21250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2126b3f54e844c7bb9bc7b070ede7b574c373d4f67f1Nicolas Capens else if(surfaceLevel > topLevel) 21270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2128b3f54e844c7bb9bc7b070ede7b574c373d4f67f1Nicolas Capens surfaceLevel = topLevel; 21290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Image *surface = texture->getImage(surfaceLevel); 21320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureLevel(sampler, 0, mipmapLevel, surface, sw::TEXTURE_2D); 21330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if(baseTexture->getTarget() == GL_TEXTURE_CUBE_MAP) 21360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int face = 0; face < 6; face++) 21380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TextureCubeMap *cubeTexture = static_cast<TextureCubeMap*>(baseTexture); 21400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++) 21420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int surfaceLevel = mipmapLevel; 21440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(surfaceLevel < 0) 21460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens surfaceLevel = 0; 21480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2149b3f54e844c7bb9bc7b070ede7b574c373d4f67f1Nicolas Capens else if(surfaceLevel > topLevel) 21500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2151b3f54e844c7bb9bc7b070ede7b574c373d4f67f1Nicolas Capens surfaceLevel = topLevel; 21520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Image *surface = cubeTexture->getImage(face, surfaceLevel); 21550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureLevel(sampler, face, mipmapLevel, surface, sw::TEXTURE_CUBE); 21560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else UNIMPLEMENTED(); 21600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 21620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureLevel(sampler, 0, 0, 0, sw::TEXTURE_NULL); 21640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 21660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, 21680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum format, GLenum type, GLsizei *bufSize, void* pixels) 21690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 21700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getReadFramebuffer(); 21710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int framebufferWidth, framebufferHeight, framebufferSamples; 21720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(framebuffer->completeness(framebufferWidth, framebufferHeight, framebufferSamples) != GL_FRAMEBUFFER_COMPLETE) 21740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_FRAMEBUFFER_OPERATION); 21760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(getReadFramebufferName() != 0 && framebufferSamples != 0) 21790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 21810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLsizei outputPitch = ComputePitch(width, format, type, mState.packAlignment); 21840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Sized query sanity check 21860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(bufSize) 21870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int requiredSize = outputPitch * height; 21890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(requiredSize > *bufSize) 21900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 21920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 21940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Image *renderTarget = framebuffer->getRenderTarget(); 21960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 21970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!renderTarget) 21980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 21990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_OUT_OF_MEMORY); 22000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Rect rect = {x, y, x + width, y + height}; 22030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens rect.clip(0, 0, renderTarget->getWidth(), renderTarget->getHeight()); 22040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned char *source = (unsigned char*)renderTarget->lock(rect.x0, rect.y0, sw::LOCK_READONLY); 22060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned char *dest = (unsigned char*)pixels; 22070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned short *dest16 = (unsigned short*)pixels; 22080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int inputPitch = (int)renderTarget->getPitch(); 22090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int j = 0; j < rect.y1 - rect.y0; j++) 22110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(renderTarget->getInternalFormat() == sw::FORMAT_A8R8G8B8 && 22130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens format == GL_BGRA_EXT && type == GL_UNSIGNED_BYTE) 22140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Fast path for EXT_read_format_bgra, given an RGBA source buffer 22160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Note that buffers with no alpha go through the slow path below 22170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens memcpy(dest + j * outputPitch, source + j * inputPitch, (rect.x1 - rect.x0) * 4); 22180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 22200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < rect.x1 - rect.x0; i++) 22220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float r; 22240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float g; 22250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float b; 22260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float a; 22270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(renderTarget->getInternalFormat()) 22290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_R5G6B5: 22310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned short rgb = *(unsigned short*)(source + 2 * i + j * inputPitch); 22330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = 1.0f; 22350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = (rgb & 0x001F) * (1.0f / 0x001F); 22360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = (rgb & 0x07E0) * (1.0f / 0x07E0); 22370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = (rgb & 0xF800) * (1.0f / 0xF800); 22380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 22400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_A1R5G5B5: 22410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned short argb = *(unsigned short*)(source + 2 * i + j * inputPitch); 22430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = (argb & 0x8000) ? 1.0f : 0.0f; 22450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = (argb & 0x001F) * (1.0f / 0x001F); 22460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = (argb & 0x03E0) * (1.0f / 0x03E0); 22470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = (argb & 0x7C00) * (1.0f / 0x7C00); 22480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 22500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_A8R8G8B8: 22510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int argb = *(unsigned int*)(source + 4 * i + j * inputPitch); 22530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = (argb & 0xFF000000) * (1.0f / 0xFF000000); 22550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = (argb & 0x000000FF) * (1.0f / 0x000000FF); 22560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = (argb & 0x0000FF00) * (1.0f / 0x0000FF00); 22570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = (argb & 0x00FF0000) * (1.0f / 0x00FF0000); 22580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 22600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_X8R8G8B8: 22610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int xrgb = *(unsigned int*)(source + 4 * i + j * inputPitch); 22630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = 1.0f; 22650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = (xrgb & 0x000000FF) * (1.0f / 0x000000FF); 22660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = (xrgb & 0x0000FF00) * (1.0f / 0x0000FF00); 22670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = (xrgb & 0x00FF0000) * (1.0f / 0x00FF0000); 22680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 22700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_A2R10G10B10: 22710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int argb = *(unsigned int*)(source + 4 * i + j * inputPitch); 22730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 22740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = (argb & 0xC0000000) * (1.0f / 0xC0000000); 22750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = (argb & 0x000003FF) * (1.0f / 0x000003FF); 22760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = (argb & 0x000FFC00) * (1.0f / 0x000FFC00); 22770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = (argb & 0x3FF00000) * (1.0f / 0x3FF00000); 22780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 22800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_A32B32G32R32F: 22810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = *((float*)(source + 16 * i + j * inputPitch) + 0); 22830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = *((float*)(source + 16 * i + j * inputPitch) + 1); 22840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = *((float*)(source + 16 * i + j * inputPitch) + 2); 22850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = *((float*)(source + 16 * i + j * inputPitch) + 3); 22860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 22880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case sw::FORMAT_A16B16G16R16F: 22890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 22900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens r = (float)*((sw::half*)(source + 8 * i + j * inputPitch) + 0); 22910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens g = (float)*((sw::half*)(source + 8 * i + j * inputPitch) + 1); 22920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens b = (float)*((sw::half*)(source + 8 * i + j * inputPitch) + 2); 22930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens a = (float)*((sw::half*)(source + 8 * i + j * inputPitch) + 3); 22940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 22950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 22960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 22970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNIMPLEMENTED(); // FIXME 22980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNREACHABLE(renderTarget->getInternalFormat()); 22990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(format) 23020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RGBA: 23040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(type) 23050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNSIGNED_BYTE: 23070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + j * outputPitch + 0] = (unsigned char)(255 * r + 0.5f); 23080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + j * outputPitch + 1] = (unsigned char)(255 * g + 0.5f); 23090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + j * outputPitch + 2] = (unsigned char)(255 * b + 0.5f); 23100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + j * outputPitch + 3] = (unsigned char)(255 * a + 0.5f); 23110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(type); 23130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_BGRA_EXT: 23160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(type) 23170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNSIGNED_BYTE: 23190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + j * outputPitch + 0] = (unsigned char)(255 * b + 0.5f); 23200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + j * outputPitch + 1] = (unsigned char)(255 * g + 0.5f); 23210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + j * outputPitch + 2] = (unsigned char)(255 * r + 0.5f); 23220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest[4 * i + j * outputPitch + 3] = (unsigned char)(255 * a + 0.5f); 23230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNSIGNED_SHORT_4_4_4_4_REV: 23250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // According to the desktop GL spec in the "Transfer of Pixel Rectangles" section 23260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // this type is packed as follows: 23270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 23280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // -------------------------------------------------------------------------------- 23290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // | 4th | 3rd | 2nd | 1st component | 23300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // -------------------------------------------------------------------------------- 23310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // in the case of BGRA_EXT, B is the first component, G the second, and so forth. 23320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest16[i + j * outputPitch / sizeof(unsigned short)] = 23330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(15 * a + 0.5f) << 12)| 23340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(15 * r + 0.5f) << 8) | 23350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(15 * g + 0.5f) << 4) | 23360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(15 * b + 0.5f) << 0); 23370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNSIGNED_SHORT_1_5_5_5_REV: 23390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // According to the desktop GL spec in the "Transfer of Pixel Rectangles" section 23400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // this type is packed as follows: 23410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 23420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // -------------------------------------------------------------------------------- 23430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // | 4th | 3rd | 2nd | 1st component | 23440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // -------------------------------------------------------------------------------- 23450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // in the case of BGRA_EXT, B is the first component, G the second, and so forth. 23460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest16[i + j * outputPitch / sizeof(unsigned short)] = 23470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)( a + 0.5f) << 15) | 23480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(31 * r + 0.5f) << 10) | 23490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(31 * g + 0.5f) << 5) | 23500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(31 * b + 0.5f) << 0); 23510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(type); 23530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_RGB: // IMPLEMENTATION_COLOR_READ_FORMAT 23560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(type) 23570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_UNSIGNED_SHORT_5_6_5: // IMPLEMENTATION_COLOR_READ_TYPE 23590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens dest16[i + j * outputPitch / sizeof(unsigned short)] = 23600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(31 * b + 0.5f) << 0) | 23610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(63 * g + 0.5f) << 5) | 23620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ((unsigned short)(31 * r + 0.5f) << 11); 23630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(type); 23650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 23670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(format); 23680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens renderTarget->unlock(); 23740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens renderTarget->release(); 23750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 23760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::clear(GLbitfield mask) 23780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 23790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *framebuffer = getDrawFramebuffer(); 23800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!framebuffer || framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) 23820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_FRAMEBUFFER_OPERATION); 23840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!applyRenderTarget()) 23870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 23890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 23900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens float depth = clamp01(mState.depthClearValue); 23920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int stencil = mState.stencilClearValue & 0x000000FF; 23930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 23940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_COLOR_BUFFER_BIT) 23950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 23960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int rgbaMask = (mState.colorMaskRed ? 0x1 : 0) | 23970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens (mState.colorMaskGreen ? 0x2 : 0) | 23980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens (mState.colorMaskBlue ? 0x4 : 0) | 23990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens (mState.colorMaskAlpha ? 0x8 : 0); 24000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(rgbaMask != 0) 24020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->clearColor(mState.colorClearValue.red, mState.colorClearValue.green, mState.colorClearValue.blue, mState.colorClearValue.alpha, rgbaMask); 24040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_DEPTH_BUFFER_BIT) 24080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.depthMask != 0) 24100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->clearDepth(depth); 24120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_STENCIL_BUFFER_BIT) 24160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.stencilWritemask != 0) 24180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->clearStencil(stencil, mState.stencilWritemask); 24200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 24230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::drawArrays(GLenum mode, GLint first, GLsizei count) 24250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 24260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!mState.currentProgram) 24270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 242800bfa189ce055ff6cf1197b8ce9af503dcf0e65cNicolas Capens device->setProjectionMatrix(projection.current()); 24290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setViewMatrix(modelView.current()); 24300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureMatrix(0, texture[0].current()); 24310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureMatrix(1, texture[1].current()); 24320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureTransform(0, texture[0].isIdentity() ? 0 : 4, false); 24330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureTransform(1, texture[1].isIdentity() ? 0 : 4, false); 24340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTexGen(0, sw::TEXGEN_NONE); 24350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTexGen(1, sw::TEXGEN_NONE); 24360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens PrimitiveType primitiveType; 24390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int primitiveCount; 24400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!es2sw::ConvertPrimitiveType(mode, count, primitiveType, primitiveCount)) 24420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_ENUM); 24430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(primitiveCount <= 0) 24450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 24470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!applyRenderTarget()) 24500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 24520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyState(mode); 24550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum err = applyVertexBuffer(0, first, count); 24570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err != GL_NO_ERROR) 24580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(err); 24600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyShaders(); 24630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTextures(); 24640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(getCurrentProgram() && !getCurrentProgram()->validateSamplers(false)) 24660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 24680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!cullSkipsDraw(mode)) 24710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->drawPrimitive(primitiveType, primitiveCount); 24730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 24750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices) 24770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 24780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!mState.currentProgram) 24790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24806372aceba9f8b6f2931aaab6746b3f80463edb30Nicolas Capens return; 24810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!indices && !mState.elementArrayBuffer) 24840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 24860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens PrimitiveType primitiveType; 24890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int primitiveCount; 24900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!es2sw::ConvertPrimitiveType(mode, count, primitiveType, primitiveCount)) 24920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_ENUM); 24930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(primitiveCount <= 0) 24950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 24960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 24970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 24980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 24990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!applyRenderTarget()) 25000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 25020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyState(mode); 25050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TranslatedIndexData indexInfo; 25070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum err = applyIndexBuffer(indices, count, mode, type, &indexInfo); 25080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err != GL_NO_ERROR) 25090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(err); 25110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLsizei vertexCount = indexInfo.maxIndex - indexInfo.minIndex + 1; 25140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens err = applyVertexBuffer(-(int)indexInfo.minIndex, indexInfo.minIndex, vertexCount); 25150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err != GL_NO_ERROR) 25160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(err); 25180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyShaders(); 25210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTextures(); 25220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!getCurrentProgram()->validateSamplers(false)) 25240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 25260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!cullSkipsDraw(mode)) 25290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->drawIndexedPrimitive(primitiveType, indexInfo.indexOffset, primitiveCount, IndexDataManager::typeSize(type)); 25310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 25330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::finish() 25350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 25360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->finish(); 25370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 25380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::flush() 25400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 25410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // We don't queue anything without processing it as fast as possible 25420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 25430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordInvalidEnum() 25450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 25460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidEnum = true; 25470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 25480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordInvalidValue() 25500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 25510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidValue = true; 25520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 25530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordInvalidOperation() 25550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 25560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidOperation = true; 25570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 25580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordOutOfMemory() 25600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 25610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mOutOfMemory = true; 25620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 25630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::recordInvalidFramebufferOperation() 25650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 25660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidFramebufferOperation = true; 25670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 25680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Get one of the recorded errors and clear its flag, if any. 25700bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLenum Context::getError() 25710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 25720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mInvalidEnum) 25730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidEnum = false; 25750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_ENUM; 25770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mInvalidValue) 25800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidValue = false; 25820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_VALUE; 25840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mInvalidOperation) 25870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidOperation = false; 25890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_OPERATION; 25910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mOutOfMemory) 25940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 25950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mOutOfMemory = false; 25960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 25970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_OUT_OF_MEMORY; 25980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 25990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mInvalidFramebufferOperation) 26010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mInvalidFramebufferOperation = false; 26030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_INVALID_FRAMEBUFFER_OPERATION; 26050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return GL_NO_ERROR; 26080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 26090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensint Context::getSupportedMultisampleCount(int requested) 26110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 26120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int supported = 0; 26130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = NUM_MULTISAMPLE_COUNTS - 1; i >= 0; i--) 26150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(supported >= requested) 26170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return supported; 26190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens supported = multisampleCount[i]; 26220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return supported; 26250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 26260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::detachBuffer(GLuint buffer) 26280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 26290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a buffer object is deleted while it is bound, all bindings to that object in the current context 26300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // (i.e. in the thread that called Delete-Buffers) are reset to zero. 26310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.arrayBuffer.name() == buffer) 26330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.arrayBuffer = nullptr; 26350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.elementArrayBuffer.name() == buffer) 26380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.elementArrayBuffer = nullptr; 26400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int attribute = 0; attribute < MAX_VERTEX_ATTRIBS; attribute++) 26430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.vertexAttribute[attribute].mBoundBuffer.name() == buffer) 26450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[attribute].mBoundBuffer = nullptr; 26470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 26500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::detachTexture(GLuint texture) 26520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 26530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a texture object is deleted, it is as if all texture units which are bound to that texture object are 26540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // rebound to texture object zero 26550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int type = 0; type < TEXTURE_TYPE_COUNT; type++) 26570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int sampler = 0; sampler < MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++) 26590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.samplerTexture[type][sampler].name() == texture) 26610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.samplerTexture[type][sampler] = nullptr; 26630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is 26680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // as if FramebufferTexture2D had been called, with a texture of 0, for each attachment point to which this 26690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // image was attached in the currently bound framebuffer. 26700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *readFramebuffer = getReadFramebuffer(); 26720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *drawFramebuffer = getDrawFramebuffer(); 26730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(readFramebuffer) 26750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readFramebuffer->detachTexture(texture); 26770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawFramebuffer && drawFramebuffer != readFramebuffer) 26800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawFramebuffer->detachTexture(texture); 26820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 26840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::detachFramebuffer(GLuint framebuffer) 26860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 26870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though 26880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero. 26890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.readFramebuffer == framebuffer) 26910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindReadFramebuffer(0); 26930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 26950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.drawFramebuffer == framebuffer) 26960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 26970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindDrawFramebuffer(0); 26980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 26990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 27000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::detachRenderbuffer(GLuint renderbuffer) 27020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 27030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though BindRenderbuffer 27040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // had been executed with the target RENDERBUFFER and name of zero. 27050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.renderbuffer.name() == renderbuffer) 27070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bindRenderbuffer(0); 27090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // If a renderbuffer object is deleted while its image is attached to the currently bound framebuffer, 27120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment 27130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // point to which this image was attached in the currently bound framebuffer. 27140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *readFramebuffer = getReadFramebuffer(); 27160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *drawFramebuffer = getDrawFramebuffer(); 27170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(readFramebuffer) 27190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readFramebuffer->detachRenderbuffer(renderbuffer); 27210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawFramebuffer && drawFramebuffer != readFramebuffer) 27240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawFramebuffer->detachRenderbuffer(renderbuffer); 27260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 27280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::cullSkipsDraw(GLenum drawMode) 27300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 27310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.cullFaceEnabled && mState.cullMode == GL_FRONT_AND_BACK && isTriangleMode(drawMode); 27320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 27330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isTriangleMode(GLenum drawMode) 27350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 27360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(drawMode) 27370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRIANGLES: 27390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRIANGLE_FAN: 27400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRIANGLE_STRIP: 27410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return true; 27420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINTS: 27430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINES: 27440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_LOOP: 27450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_STRIP: 27460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 27470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(drawMode); 27480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return false; 27510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 27520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setVertexAttrib(GLuint index, float x, float y, float z, float w) 27540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 27550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(index < MAX_VERTEX_ATTRIBS); 27560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[index].mCurrentValue[0] = x; 27580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[index].mCurrentValue[1] = y; 27590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[index].mCurrentValue[2] = z; 27600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[index].mCurrentValue[3] = w; 27610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mVertexDataManager->dirtyCurrentValue(index); 27630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 27640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, 27660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, 27670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLbitfield mask) 27680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 27690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *readFramebuffer = getReadFramebuffer(); 27700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Framebuffer *drawFramebuffer = getDrawFramebuffer(); 27710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int readBufferWidth, readBufferHeight, readBufferSamples; 27730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int drawBufferWidth, drawBufferHeight, drawBufferSamples; 27740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!readFramebuffer || readFramebuffer->completeness(readBufferWidth, readBufferHeight, readBufferSamples) != GL_FRAMEBUFFER_COMPLETE || 27760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens !drawFramebuffer || drawFramebuffer->completeness(drawBufferWidth, drawBufferHeight, drawBufferSamples) != GL_FRAMEBUFFER_COMPLETE) 27770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_FRAMEBUFFER_OPERATION); 27790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawBufferSamples > 1) 27820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 27840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::SliceRect sourceRect; 27870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::SliceRect destRect; 27880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 27890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(srcX0 < srcX1) 27900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.x0 = srcX0; 27920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.x1 = srcX1; 27930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.x0 = dstX0; 27940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.x1 = dstX1; 27950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 27960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 27970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 27980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.x0 = srcX1; 27990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.x0 = dstX1; 28000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.x1 = srcX0; 28010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.x1 = dstX0; 28020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(srcY0 < srcY1) 28050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.y0 = srcY0; 28070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.y0 = dstY0; 28080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.y1 = srcY1; 28090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.y1 = dstY1; 28100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 28120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.y0 = srcY1; 28140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.y0 = dstY1; 28150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceRect.y1 = srcY0; 28160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destRect.y1 = dstY0; 28170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Rect sourceScissoredRect = sourceRect; 28200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Rect destScissoredRect = destRect; 28210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.scissorTestEnabled) // Only write to parts of the destination framebuffer which pass the scissor test 28230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destRect.x0 < mState.scissorX) 28250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int xDiff = mState.scissorX - destRect.x0; 28270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destScissoredRect.x0 = mState.scissorX; 28280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceScissoredRect.x0 += xDiff; 28290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destRect.x1 > mState.scissorX + mState.scissorWidth) 28320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int xDiff = destRect.x1 - (mState.scissorX + mState.scissorWidth); 28340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destScissoredRect.x1 = mState.scissorX + mState.scissorWidth; 28350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceScissoredRect.x1 -= xDiff; 28360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destRect.y0 < mState.scissorY) 28390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int yDiff = mState.scissorY - destRect.y0; 28410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destScissoredRect.y0 = mState.scissorY; 28420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceScissoredRect.y0 += yDiff; 28430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destRect.y1 > mState.scissorY + mState.scissorHeight) 28460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int yDiff = destRect.y1 - (mState.scissorY + mState.scissorHeight); 28480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destScissoredRect.y1 = mState.scissorY + mState.scissorHeight; 28490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceScissoredRect.y1 -= yDiff; 28500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Rect sourceTrimmedRect = sourceScissoredRect; 28540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sw::Rect destTrimmedRect = destScissoredRect; 28550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // The source & destination rectangles also may need to be trimmed if they fall out of the bounds of 28570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // the actual draw and read surfaces. 28580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(sourceTrimmedRect.x0 < 0) 28590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int xDiff = 0 - sourceTrimmedRect.x0; 28610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.x0 = 0; 28620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.x0 += xDiff; 28630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(sourceTrimmedRect.x1 > readBufferWidth) 28660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int xDiff = sourceTrimmedRect.x1 - readBufferWidth; 28680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.x1 = readBufferWidth; 28690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.x1 -= xDiff; 28700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(sourceTrimmedRect.y0 < 0) 28730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int yDiff = 0 - sourceTrimmedRect.y0; 28750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.y0 = 0; 28760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.y0 += yDiff; 28770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(sourceTrimmedRect.y1 > readBufferHeight) 28800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int yDiff = sourceTrimmedRect.y1 - readBufferHeight; 28820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.y1 = readBufferHeight; 28830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.y1 -= yDiff; 28840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destTrimmedRect.x0 < 0) 28870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int xDiff = 0 - destTrimmedRect.x0; 28890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.x0 = 0; 28900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.x0 += xDiff; 28910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 28930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destTrimmedRect.x1 > drawBufferWidth) 28940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 28950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int xDiff = destTrimmedRect.x1 - drawBufferWidth; 28960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.x1 = drawBufferWidth; 28970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.x1 -= xDiff; 28980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 28990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destTrimmedRect.y0 < 0) 29010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int yDiff = 0 - destTrimmedRect.y0; 29030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.y0 = 0; 29040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.y0 += yDiff; 29050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(destTrimmedRect.y1 > drawBufferHeight) 29080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int yDiff = destTrimmedRect.y1 - drawBufferHeight; 29100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.y1 = drawBufferHeight; 29110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.y1 -= yDiff; 29120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool partialBufferCopy = false; 29150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(sourceTrimmedRect.y1 - sourceTrimmedRect.y0 < readBufferHeight || 29170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.x1 - sourceTrimmedRect.x0 < readBufferWidth || 29180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.y1 - destTrimmedRect.y0 < drawBufferHeight || 29190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens destTrimmedRect.x1 - destTrimmedRect.x0 < drawBufferWidth || 29200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens sourceTrimmedRect.y0 != 0 || destTrimmedRect.y0 != 0 || sourceTrimmedRect.x0 != 0 || destTrimmedRect.x0 != 0) 29210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens partialBufferCopy = true; 29230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool blitRenderTarget = false; 29260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool blitDepthStencil = false; 29270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_COLOR_BUFFER_BIT) 29290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const bool validReadType = readFramebuffer->getColorbufferType() == GL_TEXTURE_2D || 29310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readFramebuffer->getColorbufferType() == GL_RENDERBUFFER; 29320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const bool validDrawType = drawFramebuffer->getColorbufferType() == GL_TEXTURE_2D || 29330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawFramebuffer->getColorbufferType() == GL_RENDERBUFFER; 29340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!validReadType || !validDrawType || 29350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readFramebuffer->getColorbuffer()->getInternalFormat() != drawFramebuffer->getColorbuffer()->getInternalFormat()) 29360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ERR("Color buffer format conversion in BlitFramebufferANGLE not supported by this implementation"); 29380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 29390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(partialBufferCopy && readBufferSamples > 1) 29420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 29440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens blitRenderTarget = true; 29470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) 29500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *readDSBuffer = nullptr; 29520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Renderbuffer *drawDSBuffer = nullptr; 29530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // We support OES_packed_depth_stencil, and do not support a separately attached depth and stencil buffer, so if we have 29550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // both a depth and stencil buffer, it will be the same buffer. 29560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_DEPTH_BUFFER_BIT) 29580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(readFramebuffer->getDepthbuffer() && drawFramebuffer->getDepthbuffer()) 29600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(readFramebuffer->getDepthbufferType() != drawFramebuffer->getDepthbufferType() || 29620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readFramebuffer->getDepthbuffer()->getInternalFormat() != drawFramebuffer->getDepthbuffer()->getInternalFormat()) 29630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 29650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens blitDepthStencil = true; 29680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readDSBuffer = readFramebuffer->getDepthbuffer(); 29690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawDSBuffer = drawFramebuffer->getDepthbuffer(); 29700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mask & GL_STENCIL_BUFFER_BIT) 29740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(readFramebuffer->getStencilbuffer() && drawFramebuffer->getStencilbuffer()) 29760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(readFramebuffer->getStencilbufferType() != drawFramebuffer->getStencilbufferType() || 29780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readFramebuffer->getStencilbuffer()->getInternalFormat() != drawFramebuffer->getStencilbuffer()->getInternalFormat()) 29790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 29810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens blitDepthStencil = true; 29840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readDSBuffer = readFramebuffer->getStencilbuffer(); 29850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawDSBuffer = drawFramebuffer->getStencilbuffer(); 29860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(partialBufferCopy) 29900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ERR("Only whole-buffer depth and stencil blits are supported by this implementation."); 29920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); // Only whole-buffer copies are permitted 29930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 29940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 29950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if((drawDSBuffer && drawDSBuffer->getSamples() > 1) || 29960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens (readDSBuffer && readDSBuffer->getSamples() > 1)) 29970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 29980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 29990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(blitRenderTarget || blitDepthStencil) 30030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(blitRenderTarget) 30050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Image *readRenderTarget = readFramebuffer->getRenderTarget(); 30070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Image *drawRenderTarget = drawFramebuffer->getRenderTarget(); 30080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool success = device->stretchRect(readRenderTarget, &sourceRect, drawRenderTarget, &destRect, false); 30100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens readRenderTarget->release(); 30120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawRenderTarget->release(); 30130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!success) 30150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ERR("BlitFramebufferANGLE failed."); 30170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 30180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(blitDepthStencil) 30220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool success = device->stretchRect(readFramebuffer->getDepthStencil(), nullptr, drawFramebuffer->getDepthStencil(), nullptr, false); 30240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!success) 30260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ERR("BlitFramebufferANGLE failed."); 30280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return; 30290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setMatrixMode(GLenum mode) 30350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens matrixMode = mode; 30370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenssw::MatrixStack &Context::currentMatrixStack() 30400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(matrixMode) 30420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_MODELVIEW: return modelView; break; 30440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_PROJECTION: return projection; break; 30450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TEXTURE: return texture[mState.activeSampler]; break; 30460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(matrixMode); return modelView; break; 30470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::loadIdentity() 30510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 30530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 30550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().identity(); 30580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::pushMatrix() 30610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //if(drawing) 30630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //{ 30640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // return error(GL_INVALID_OPERATION); 30650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //} 30660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!currentMatrixStack().push()) 30680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_STACK_OVERFLOW); 30700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::popMatrix() 30740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //if(drawing) 30760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //{ 30770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // return error(GL_INVALID_OPERATION); 30780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //} 30790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!currentMatrixStack().pop()) 30810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_STACK_OVERFLOW); 30830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::rotate(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) 30870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 30890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 30910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 30920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().rotate(angle, x, y, z); 30940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 30950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 30960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::translate(GLfloat x, GLfloat y, GLfloat z) 30970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 30980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 30990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 31010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().translate(x, y, z); 31040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::scale(GLfloat x, GLfloat y, GLfloat z) 31070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 31090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 31110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().scale(x, y, z); 31140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::multiply(const GLdouble *m) 31170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 31190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 31210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().multiply(m); 31240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::multiply(const GLfloat *m) 31270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 31290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 31310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().multiply(m); 31340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::frustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) 31370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 31390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 31410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().frustum(left, right, bottom, top, zNear, zFar); 31440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::ortho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) 31470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 31490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 31510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens currentMatrixStack().ortho(left, right, bottom, top, zNear, zFar); 31540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLightingEnabled(bool enable) 31570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 31590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 31610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLightingEnable(enable); 31640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setFogEnabled(bool enable) 31670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 31690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 31710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setFogEnable(enable); 31740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setAlphaTestEnabled(bool enable) 31770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 31790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 31810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAlphaTestEnable(enable); 31840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 31850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::alphaFunc(GLenum func, GLclampf ref) 31870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 31880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 31890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 31910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 31920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 31930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(func) 31940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 31950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NEVER: device->setAlphaCompare(sw::ALPHA_NEVER); break; 31960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LESS: device->setAlphaCompare(sw::ALPHA_LESS); break; 31970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_EQUAL: device->setAlphaCompare(sw::ALPHA_EQUAL); break; 31980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LEQUAL: device->setAlphaCompare(sw::ALPHA_LESSEQUAL); break; 31990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GREATER: device->setAlphaCompare(sw::ALPHA_GREATER); break; 32000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_NOTEQUAL: device->setAlphaCompare(sw::ALPHA_NOTEQUAL); break; 32010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_GEQUAL: device->setAlphaCompare(sw::ALPHA_GREATEREQUAL); break; 32020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_ALWAYS: device->setAlphaCompare(sw::ALPHA_ALWAYS); break; 32030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: UNREACHABLE(func); 32040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAlphaReference(gl::clamp01(ref)); 32070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setTexture2DEnabled(bool enable) 32100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 32120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 32140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens envEnable[mState.activeSampler] = enable; 32170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setShadeModel(GLenum mode) 32200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //if(drawing) 32220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //{ 32230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // return error(GL_INVALID_OPERATION); 32240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens //} 32250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(mode) 32270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_FLAT: device->setShadingMode(sw::SHADING_FLAT); break; 32290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SMOOTH: device->setShadingMode(sw::SHADING_GOURAUD); break; 32300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: return error(GL_INVALID_ENUM); 32310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLightEnabled(int index, bool enable) 32350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setLightEnable(index, enable); 32370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setNormalizeNormalsEnabled(bool enable) 32400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setNormalizeNormals(enable); 32420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32440bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLuint Context::genLists(GLsizei range) 32450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 32470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION, 0); 32490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int firstIndex = std::max(1u, firstFreeIndex); 32520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(; true; firstIndex++) 32530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int empty = 0; 32550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(; empty < range; empty++) 32560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(displayList[firstIndex + empty] != 0) 32580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 32600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(empty == range) 32640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = firstIndex; i < firstIndex + range; i++) 32660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens displayList[i] = new DisplayList(); 32680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(firstIndex == firstFreeIndex) 32710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens firstFreeIndex = firstIndex + range; 32730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return firstIndex; 32760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 0; 32800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::newList(GLuint list, GLenum mode) 32830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing || listIndex != 0) 32850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 32860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 32870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 32880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(!this->list); 32900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens this->list = new DisplayList(); 32910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens listIndex = list; 32930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens listMode = mode; 32940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 32950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 32960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::endList() 32970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 32980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing || listIndex == 0) 32990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 33010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(list); 33040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete displayList[listIndex]; 33050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens displayList[listIndex] = list; 33060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens list = 0; 33070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens listIndex = 0; 33090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens listMode = 0; 33100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::callList(GLuint list) 33130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // As per GL specifications, if the list does not exist, it is ignored 33150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(displayList[list]) 33160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens displayList[list]->call(); 33180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::deleteList(GLuint list) 33220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete displayList[list]; 33240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens displayList[list] = 0; 33250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens displayList.erase(list); 33260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens firstFreeIndex = std::min(firstFreeIndex , list); 33270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::listCommand(Command *command) 33300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(list); 33320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens list->list.push_back(command); 33330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(listMode == GL_COMPILE_AND_EXECUTE) 33350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens listMode = 0; 33370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens command->call(); 33380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens listMode = GL_COMPILE_AND_EXECUTE; 33390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid APIENTRY glVertexAttribArray(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr) 33430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TRACE("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, " 33450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = %p)", 33460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens index, size, type, normalized, stride, ptr); 33470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens gl::Context *context = gl::getContext(); 33490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(context) 33510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr); 33530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens context->setVertexAttribArrayEnabled(index, ptr != 0); 33540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::captureAttribs() 33580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens memcpy(clientAttribute, mState.vertexAttribute, sizeof(mState.vertexAttribute)); 33600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::captureDrawArrays(GLenum mode, GLint first, GLsizei count) 33630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(first == 0); // FIXME: UNIMPLEMENTED! 33650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(GLuint i = 0; i < MAX_VERTEX_ATTRIBS; i++) 33670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLint size = mState.vertexAttribute[i].mSize; 33690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum type = mState.vertexAttribute[i].mType; 33700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLboolean normalized = mState.vertexAttribute[i].mNormalized; 33710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLsizei stride = mState.vertexAttribute[i].mStride; 33720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const GLvoid *pointer = mState.vertexAttribute[i].mPointer; 33730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens size_t length = count * mState.vertexAttribute[i].stride(); 33750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.vertexAttribute[i].mArrayEnabled) 33770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ASSERT(pointer); // FIXME: Add to condition? 33790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const int padding = 1024; // For SIMD processing of vertices // FIXME: Still necessary? 33800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void *buffer = new unsigned char[length + padding]; 33810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens memcpy(buffer, pointer, length); 33820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens listCommand(gl::newCommand(glVertexAttribArray, i, size, type, normalized, stride, (const void*)buffer)); 33840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else 33860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 33870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens listCommand(gl::newCommand(glVertexAttribArray, i, size, type, normalized, stride, (const void*)0)); 33880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 33900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::restoreAttribs() 33930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens memcpy(mState.vertexAttribute, clientAttribute, sizeof(mState.vertexAttribute)); 33950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 33960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 33970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::clientActiveTexture(GLenum texture) 33980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 33990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens clientTexture = texture; 34000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34020bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensGLenum Context::getClientActiveTexture() const 34030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return clientTexture; 34050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensunsigned int Context::getActiveTexture() const 34080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.activeSampler; 34100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::begin(GLenum mode) 34130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(drawing) 34150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 34170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawing = true; 34200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawMode = mode; 34210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens vertex.clear(); 34230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::position(GLfloat x, GLfloat y, GLfloat z, GLfloat w) 34260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens InVertex v; 34280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.P.x = x; 34300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.P.y = y; 34310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.P.z = z; 34320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.P.w = w; 34330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.C.x = mState.vertexAttribute[sw::Color0].mCurrentValue[0]; 34340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.C.y = mState.vertexAttribute[sw::Color0].mCurrentValue[1]; 34350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.C.z = mState.vertexAttribute[sw::Color0].mCurrentValue[2]; 34360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.C.w = mState.vertexAttribute[sw::Color0].mCurrentValue[3]; 34370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.N.x = mState.vertexAttribute[sw::Normal].mCurrentValue[0]; 34380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.N.y = mState.vertexAttribute[sw::Normal].mCurrentValue[1]; 34390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.N.z = mState.vertexAttribute[sw::Normal].mCurrentValue[2]; 34400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.N.w = mState.vertexAttribute[sw::Normal].mCurrentValue[3]; 34410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.T0.x = mState.vertexAttribute[sw::TexCoord0].mCurrentValue[0]; 34420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.T0.y = mState.vertexAttribute[sw::TexCoord0].mCurrentValue[1]; 34430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.T0.z = mState.vertexAttribute[sw::TexCoord0].mCurrentValue[2]; 34440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.T0.w = mState.vertexAttribute[sw::TexCoord0].mCurrentValue[3]; 34450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.T1.x = mState.vertexAttribute[sw::TexCoord1].mCurrentValue[0]; 34460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.T1.y = mState.vertexAttribute[sw::TexCoord1].mCurrentValue[1]; 34470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.T1.z = mState.vertexAttribute[sw::TexCoord1].mCurrentValue[2]; 34480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens v.T1.w = mState.vertexAttribute[sw::TexCoord1].mCurrentValue[3]; 34490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens vertex.push_back(v); 34510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 34520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::end() 34540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 34550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(!drawing) 34560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(GL_INVALID_OPERATION); 34580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 346000bfa189ce055ff6cf1197b8ce9af503dcf0e65cNicolas Capens device->setProjectionMatrix(projection.current()); 34610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setViewMatrix(modelView.current()); 34620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureMatrix(0, texture[0].current()); 34630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureMatrix(1, texture[1].current()); 34640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureTransform(0, texture[0].isIdentity() ? 0 : 4, false); 34650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setTextureTransform(1, texture[1].isIdentity() ? 0 : 4, false); 34660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens captureAttribs(); 34680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int i = 0; i < MAX_VERTEX_ATTRIBS; i++) 34700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[i].mArrayEnabled = false; 34720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setVertexAttribState(sw::Position, 0, 4, GL_FLOAT, false, sizeof(InVertex), &vertex[0].P); 34750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setVertexAttribState(sw::Normal, 0, 4, GL_FLOAT, false, sizeof(InVertex), &vertex[0].N); 34760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setVertexAttribState(sw::Color0, 0, 4, GL_FLOAT, false, sizeof(InVertex), &vertex[0].C); 34770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setVertexAttribState(sw::TexCoord0, 0, 2, GL_FLOAT, false, sizeof(InVertex), &vertex[0].T0); 34780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens setVertexAttribState(sw::TexCoord1, 0, 2, GL_FLOAT, false, sizeof(InVertex), &vertex[0].T1); 34790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Position].mArrayEnabled = true; 34810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Normal].mArrayEnabled = true; 34820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::Color0].mArrayEnabled = true; 34830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::TexCoord0].mArrayEnabled = true; 34840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.vertexAttribute[sw::TexCoord1].mArrayEnabled = true; 34850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyState(drawMode); 34870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens GLenum err = applyVertexBuffer(0, 0, vertex.size()); 34890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(err != GL_NO_ERROR) 34900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return error(err); 34920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 34930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens applyTextures(); 34950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 34960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(drawMode) 34970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 34980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POINTS: 34990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNIMPLEMENTED(); 35000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINES: 35020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNIMPLEMENTED(); 35030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_STRIP: 35050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNIMPLEMENTED(); 35060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_LINE_LOOP: 35080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNIMPLEMENTED(); 35090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRIANGLES: 35110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNIMPLEMENTED(); 35120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRIANGLE_STRIP: 35140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->drawPrimitive(DRAW_TRIANGLESTRIP, vertex.size() - 2); 35150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_TRIANGLE_FAN: 35170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNIMPLEMENTED(); 35180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_QUADS: 35200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNIMPLEMENTED(); 35210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_QUAD_STRIP: 35230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNIMPLEMENTED(); 35240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_POLYGON: 35260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNIMPLEMENTED(); 35270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 35290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNREACHABLE(drawMode); 35300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 35310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens restoreAttribs(); 35330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens drawing = false; 35350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 35360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setColorLogicOpEnabled(bool colorLogicOpEnabled) 35380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 35390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.colorLogicOpEnabled != colorLogicOpEnabled) 35400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 35410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.colorLogicOpEnabled = colorLogicOpEnabled; 35420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mColorLogicOperatorDirty = true; 35430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 35440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 35450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensbool Context::isColorLogicOpEnabled() 35470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 35480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return mState.colorLogicOpEnabled; 35490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 35500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setLogicalOperation(GLenum logicalOperation) 35520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 35530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(mState.logicalOperation != logicalOperation) 35540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 35550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mState.logicalOperation = logicalOperation; 35560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mColorLogicOperatorDirty = true; 35570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 35580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 35590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setColorMaterialEnabled(bool enable) 35610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 35620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setColorVertexEnable(enable); 35630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 35640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 35650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensvoid Context::setColorMaterialMode(GLenum mode) 35660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 35670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch(mode) 35680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 35690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_EMISSION: 35700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDiffuseMaterialSource(sw::MATERIAL_MATERIAL); 35710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSpecularMaterialSource(sw::MATERIAL_MATERIAL); 35720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAmbientMaterialSource(sw::MATERIAL_MATERIAL); 35730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setEmissiveMaterialSource(sw::MATERIAL_COLOR1); 35740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_AMBIENT: 35760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDiffuseMaterialSource(sw::MATERIAL_MATERIAL); 35770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSpecularMaterialSource(sw::MATERIAL_MATERIAL); 35780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAmbientMaterialSource(sw::MATERIAL_COLOR1); 35790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setEmissiveMaterialSource(sw::MATERIAL_MATERIAL); 35800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_DIFFUSE: 35820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDiffuseMaterialSource(sw::MATERIAL_COLOR1); 35830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSpecularMaterialSource(sw::MATERIAL_MATERIAL); 35840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAmbientMaterialSource(sw::MATERIAL_MATERIAL); 35850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setEmissiveMaterialSource(sw::MATERIAL_MATERIAL); 35860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_SPECULAR: 35880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDiffuseMaterialSource(sw::MATERIAL_MATERIAL); 35890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSpecularMaterialSource(sw::MATERIAL_COLOR1); 35900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAmbientMaterialSource(sw::MATERIAL_MATERIAL); 35910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setEmissiveMaterialSource(sw::MATERIAL_MATERIAL); 35920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case GL_AMBIENT_AND_DIFFUSE: 35940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setDiffuseMaterialSource(sw::MATERIAL_COLOR1); 35950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setSpecularMaterialSource(sw::MATERIAL_MATERIAL); 35960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setAmbientMaterialSource(sw::MATERIAL_COLOR1); 35970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens device->setEmissiveMaterialSource(sw::MATERIAL_MATERIAL); 35980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 35990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 36000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens UNREACHABLE(mode); 36010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 36020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 36030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36040bac285a78df6a6d7a6b68784748b92805420ffbNicolas CapensDevice *Context::getDevice() 36050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 36060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return device; 36070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 36080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 36090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 3610