1bdf2d80f459d43f5a6df074431bacf41584f81b7shannon.woods@transgaming.com#include "precompiled.h" 2144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// 3b37cd2d1340570e6058384d33fb99bc7aa9b1f93daniel@transgaming.com// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. 4144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Use of this source code is governed by a BSD-style license that can be 5144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// found in the LICENSE file. 6144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// 7144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 8144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Context.cpp: Implements the gl::Context class, managing all GL state and performing 9144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// rendering operations. It is the GLES2 specific implementation of EGLContext. 10144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 11144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/Context.h" 12144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 13144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/main.h" 14144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/utilities.h" 15144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/Buffer.h" 16144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/Fence.h" 1729ab9525407b2e830341a36a28c6074c94cedce5daniel@transgaming.com#include "libGLESv2/Framebuffer.h" 18486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/Renderbuffer.h" 19144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/Program.h" 20144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/ProgramBinary.h" 21144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/Query.h" 22144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/Texture.h" 23486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/ResourceManager.h" 24938ac8d7ed15bc859bc9b5dc296c6946270360a4shannon.woods@transgaming.com#include "libGLESv2/renderer/IndexDataManager.h" 25d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com#include "libGLESv2/renderer/RenderTarget.h" 26486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/renderer/Renderer.h" 27486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com 28486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libEGL/Surface.h" 29144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 30144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#undef near 31144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#undef far 32144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 33144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgnamespace gl 34144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 35ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.comstatic const char* makeStaticString(const std::string& str) 36ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com{ 37ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com static std::set<std::string> strings; 38ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com std::set<std::string>::iterator it = strings.find(str); 39ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com if (it != strings.end()) 40ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com return it->c_str(); 41ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com 42ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com return strings.insert(str).first->c_str(); 43ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com} 44ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com 45dedd1a0f6c43d9db06537c782982090030270a45daniel@transgaming.comContext::Context(const gl::Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess) : mRenderer(renderer) 46144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 47144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org ASSERT(robustAccess == false); // Unimplemented 48144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 49144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mFenceHandleAllocator.setBaseHandle(0); 50144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 51144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org setClearColor(0.0f, 0.0f, 0.0f, 0.0f); 52144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 53144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.depthClearValue = 1.0f; 54144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.stencilClearValue = 0; 55144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 56f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.rasterizer.cullFace = false; 57f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.rasterizer.cullMode = GL_BACK; 58f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.rasterizer.frontFace = GL_CCW; 59f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.rasterizer.polygonOffsetFill = false; 60f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.rasterizer.polygonOffsetFactor = 0.0f; 61f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.rasterizer.polygonOffsetUnits = 0.0f; 62dd2524c46ed4689c27adf3f9959435fd2906b621shannon.woods@transgaming.com mState.rasterizer.pointDrawMode = false; 6391f68c4c8397ff9410864df5055257e68248241aNicolas Capens mState.rasterizer.multiSample = false; 64d55e8c1b48f16f93cb89798fc3640047eb74d3fddaniel@transgaming.com mState.scissorTest = false; 65f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.scissor.x = 0; 66f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.scissor.y = 0; 67f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.scissor.width = 0; 68f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.scissor.height = 0; 69f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com 70f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.blend.blend = false; 71f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.blend.sourceBlendRGB = GL_ONE; 72f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.blend.sourceBlendAlpha = GL_ONE; 73f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.blend.destBlendRGB = GL_ZERO; 74f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.blend.destBlendAlpha = GL_ZERO; 75f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.blend.blendEquationRGB = GL_FUNC_ADD; 76f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.blend.blendEquationAlpha = GL_FUNC_ADD; 77f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.blend.sampleAlphaToCoverage = false; 78f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.blend.dither = true; 79f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com 80144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.blendColor.red = 0; 81144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.blendColor.green = 0; 82144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.blendColor.blue = 0; 83144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.blendColor.alpha = 0; 84f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com 85f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.depthTest = false; 86f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.depthFunc = GL_LESS; 87f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.depthMask = true; 88f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.stencilTest = false; 89f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.stencilFunc = GL_ALWAYS; 90f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.stencilMask = -1; 91f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.stencilWritemask = -1; 92f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.stencilBackFunc = GL_ALWAYS; 93f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.stencilBackMask = - 1; 94f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.stencilBackWritemask = -1; 95f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.stencilFail = GL_KEEP; 96f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.stencilPassDepthFail = GL_KEEP; 97f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.stencilPassDepthPass = GL_KEEP; 98f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.stencilBackFail = GL_KEEP; 99f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.stencilBackPassDepthFail = GL_KEEP; 100f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.depthStencil.stencilBackPassDepthPass = GL_KEEP; 101f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com 10208c331d42f31f8291238695d86db53d760e0b330daniel@transgaming.com mState.stencilRef = 0; 10308c331d42f31f8291238695d86db53d760e0b330daniel@transgaming.com mState.stencilBackRef = 0; 10408c331d42f31f8291238695d86db53d760e0b330daniel@transgaming.com 105144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.sampleCoverage = false; 106144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.sampleCoverageValue = 1.0f; 107144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.sampleCoverageInvert = false; 108144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.generateMipmapHint = GL_DONT_CARE; 109144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.fragmentShaderDerivativeHint = GL_DONT_CARE; 110144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 111144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.lineWidth = 1.0f; 112144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1133884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com mState.viewport.x = 0; 1143884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com mState.viewport.y = 0; 1153884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com mState.viewport.width = 0; 1163884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com mState.viewport.height = 0; 117144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.zNear = 0.0f; 118144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.zFar = 1.0f; 119144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 120f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.blend.colorMaskRed = true; 121f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.blend.colorMaskGreen = true; 122f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.blend.colorMaskBlue = true; 123f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.blend.colorMaskAlpha = true; 124144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 125144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (shareContext != NULL) 126144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 127144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResourceManager = shareContext->mResourceManager; 128144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResourceManager->addRef(); 129144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 130144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 131144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 132370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com mResourceManager = new ResourceManager(mRenderer); 133144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 134144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 135144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // [OpenGL ES 2.0.24] section 3.7 page 83: 136144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have twodimensional 137144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // and cube map texture state vectors respectively associated with them. 138144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // In order that access to these initial textures not be lost, they are treated as texture 139144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // objects all of whose names are 0. 140144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 141370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com mTexture2DZero.set(new Texture2D(mRenderer, 0)); 142370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com mTextureCubeMapZero.set(new TextureCubeMap(mRenderer, 0)); 143144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 144144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.activeSampler = 0; 145144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org bindArrayBuffer(0); 146144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org bindElementArrayBuffer(0); 147144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org bindTextureCubeMap(0); 148144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org bindTexture2D(0); 149144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org bindReadFramebuffer(0); 150144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org bindDrawFramebuffer(0); 151144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org bindRenderbuffer(0); 152144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 153144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.currentProgram = 0; 154989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com mCurrentProgramBinary.set(NULL); 155144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 156144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.packAlignment = 4; 157144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.unpackAlignment = 4; 158144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.packReverseRowOrder = false; 159144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 160ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com mExtensionString = NULL; 161ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com mRendererString = NULL; 162ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com 163144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mInvalidEnum = false; 164144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mInvalidValue = false; 165144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mInvalidOperation = false; 166144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mOutOfMemory = false; 167144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mInvalidFramebufferOperation = false; 168144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 169144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mHasBeenCurrent = false; 170144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mContextLost = false; 171144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResetStatus = GL_NO_ERROR; 172144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResetStrategy = (notifyResets ? GL_LOSE_CONTEXT_ON_RESET_EXT : GL_NO_RESET_NOTIFICATION_EXT); 173144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mRobustAccess = robustAccess; 174144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 175bec04bf43b2603f33a84c6eb6b6fa4b13ad10161shannon.woods@transgaming.com mSupportsBGRATextures = false; 176144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mSupportsDXT1Textures = false; 177144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mSupportsDXT3Textures = false; 178144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mSupportsDXT5Textures = false; 179144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mSupportsEventQueries = false; 180144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mSupportsOcclusionQueries = false; 181144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mNumCompressedTextureFormats = 0; 182144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 183144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 184144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgContext::~Context() 185144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 186144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mState.currentProgram != 0) 187144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 188144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Program *programObject = mResourceManager->getProgram(mState.currentProgram); 189144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (programObject) 190144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 191144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org programObject->release(); 192144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 193144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.currentProgram = 0; 194144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 195989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com mCurrentProgramBinary.set(NULL); 196144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 197144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org while (!mFramebufferMap.empty()) 198144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 199144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org deleteFramebuffer(mFramebufferMap.begin()->first); 200144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 201144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 202144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org while (!mFenceMap.empty()) 203144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 204144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org deleteFence(mFenceMap.begin()->first); 205144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 206144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 207144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org while (!mQueryMap.empty()) 208144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 209144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org deleteQuery(mQueryMap.begin()->first); 210144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 211144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 212144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org for (int type = 0; type < TEXTURE_TYPE_COUNT; type++) 213144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 214233fe9548a2b166d3ccb09a4a7af273fab6dbf2cshannon.woods@transgaming.com for (int sampler = 0; sampler < IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++) 215144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 216144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.samplerTexture[type][sampler].set(NULL); 217144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 218144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 219144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 220144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org for (int type = 0; type < TEXTURE_TYPE_COUNT; type++) 221144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 222144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mIncompleteTextures[type].set(NULL); 223144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 224144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 225144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++) 226144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 227144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[i].mBoundBuffer.set(NULL); 228144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 229144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 230144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org for (int i = 0; i < QUERY_TYPE_COUNT; i++) 231144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 232144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.activeQuery[i].set(NULL); 233144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 234144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 235144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.arrayBuffer.set(NULL); 236144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.elementArrayBuffer.set(NULL); 237144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.renderbuffer.set(NULL); 238144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 239144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mTexture2DZero.set(NULL); 240144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mTextureCubeMapZero.set(NULL); 241144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 242144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResourceManager->release(); 243144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 244144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 245ad62987f1ef6e34ed362e7a7ee125ffcd1690241daniel@transgaming.comvoid Context::makeCurrent(egl::Surface *surface) 246144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 247144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (!mHasBeenCurrent) 248144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2499549bead5dc8bb07a21296ea8bea97939285c699daniel@transgaming.com mMajorShaderModel = mRenderer->getMajorShaderModel(); 2505f4c136ee4460e0a912f222aea6cb1a8aa64266fdaniel@transgaming.com mMaximumPointSize = mRenderer->getMaxPointSize(); 251621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com mSupportsVertexTexture = mRenderer->getVertexTextureSupport(); 252621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com mSupportsNonPower2Texture = mRenderer->getNonPower2TextureSupport(); 253621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com mSupportsInstancing = mRenderer->getInstancingSupport(); 254144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2558ce2f8f8e9597c045e6cf0c150c9302e7f3466b6shannon.woods@transgaming.com mMaxViewportDimension = mRenderer->getMaxViewportDimension(); 2565f4c136ee4460e0a912f222aea6cb1a8aa64266fdaniel@transgaming.com mMaxTextureDimension = std::min(std::min(mRenderer->getMaxTextureWidth(), mRenderer->getMaxTextureHeight()), 257144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org (int)gl::IMPLEMENTATION_MAX_TEXTURE_SIZE); 258144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mMaxCubeTextureDimension = std::min(mMaxTextureDimension, (int)gl::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE); 259144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mMaxRenderbufferDimension = mMaxTextureDimension; 260144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mMaxTextureLevel = log2(mMaxTextureDimension) + 1; 261ba0570efef84d98117e1acb3762b9b58652c516adaniel@transgaming.com mMaxTextureAnisotropy = mRenderer->getTextureMaxAnisotropy(); 26207ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com TRACE("MaxTextureDimension=%d, MaxCubeTextureDimension=%d, MaxRenderbufferDimension=%d, MaxTextureLevel=%d, MaxTextureAnisotropy=%f", 26307ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com mMaxTextureDimension, mMaxCubeTextureDimension, mMaxRenderbufferDimension, mMaxTextureLevel, mMaxTextureAnisotropy); 264144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 265621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com mSupportsEventQueries = mRenderer->getEventQuerySupport(); 266621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com mSupportsOcclusionQueries = mRenderer->getOcclusionQuerySupport(); 267bec04bf43b2603f33a84c6eb6b6fa4b13ad10161shannon.woods@transgaming.com mSupportsBGRATextures = mRenderer->getBGRATextureSupport(); 268621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com mSupportsDXT1Textures = mRenderer->getDXT1TextureSupport(); 269621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com mSupportsDXT3Textures = mRenderer->getDXT3TextureSupport(); 270621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com mSupportsDXT5Textures = mRenderer->getDXT5TextureSupport(); 271621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com mSupportsFloat32Textures = mRenderer->getFloat32TextureSupport(&mSupportsFloat32LinearFilter, &mSupportsFloat32RenderableTextures); 272621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com mSupportsFloat16Textures = mRenderer->getFloat16TextureSupport(&mSupportsFloat16LinearFilter, &mSupportsFloat16RenderableTextures); 273621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com mSupportsLuminanceTextures = mRenderer->getLuminanceTextureSupport(); 274621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com mSupportsLuminanceAlphaTextures = mRenderer->getLuminanceAlphaTextureSupport(); 275621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com mSupportsDepthTextures = mRenderer->getDepthTextureSupport(); 276ba0570efef84d98117e1acb3762b9b58652c516adaniel@transgaming.com mSupportsTextureFilterAnisotropy = mRenderer->getTextureFilterAnisotropySupport(); 2775f4c136ee4460e0a912f222aea6cb1a8aa64266fdaniel@transgaming.com mSupports32bitIndices = mRenderer->get32BitIndexSupport(); 278144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 279144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mNumCompressedTextureFormats = 0; 280144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsDXT1Textures()) 281144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 282144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mNumCompressedTextureFormats += 2; 283144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 284144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsDXT3Textures()) 285144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 286144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mNumCompressedTextureFormats += 1; 287144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 288144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsDXT5Textures()) 289144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 290144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mNumCompressedTextureFormats += 1; 291144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 292144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 293144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org initExtensionString(); 294144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org initRendererString(); 295144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2963884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com mState.viewport.x = 0; 2973884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com mState.viewport.y = 0; 2983884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com mState.viewport.width = surface->getWidth(); 2993884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com mState.viewport.height = surface->getHeight(); 300144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 301f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.scissor.x = 0; 302f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.scissor.y = 0; 303f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.scissor.width = surface->getWidth(); 304f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com mState.scissor.height = surface->getHeight(); 305144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 306144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mHasBeenCurrent = true; 307144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 308144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 309024786d7ca409dbbe1877b7c60f99f50e1647e5ddaniel@transgaming.com // Wrap the existing swapchain resources into GL objects and assign them to the '0' names 31076d3e6e07b87d95baf43a0c40ec6f3df883fbf71daniel@transgaming.com rx::SwapChain *swapchain = surface->getSwapChain(); 311144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 31270062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com Colorbuffer *colorbufferZero = new Colorbuffer(mRenderer, swapchain); 31370062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com DepthStencilbuffer *depthStencilbufferZero = new DepthStencilbuffer(mRenderer, swapchain); 31416418b115610ebc2d40efc3c6e817b0584d8c6f7daniel@transgaming.com Framebuffer *framebufferZero = new DefaultFramebuffer(mRenderer, colorbufferZero, depthStencilbufferZero); 315144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 316144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org setFramebufferZero(framebufferZero); 317144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 318144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 319f688c0d18c25940336d83e37befe76ead2844962daniel@transgaming.com// NOTE: this function should not assume that this context is current! 320144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::markContextLost() 321144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 322144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT) 323144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT; 324144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mContextLost = true; 325144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 326144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 327144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::isContextLost() 328144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 329144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mContextLost; 330144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 331144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 332144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setClearColor(float red, float green, float blue, float alpha) 333144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 334144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.colorClearValue.red = red; 335144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.colorClearValue.green = green; 336144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.colorClearValue.blue = blue; 337144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.colorClearValue.alpha = alpha; 338144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 339144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 340144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setClearDepth(float depth) 341144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 342144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.depthClearValue = depth; 343144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 344144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 345144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setClearStencil(int stencil) 346144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 347144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.stencilClearValue = stencil; 348144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 349144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 350144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setCullFace(bool enabled) 351144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 3522e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.rasterizer.cullFace = enabled; 353144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 354144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 355144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::isCullFaceEnabled() const 356144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 357f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com return mState.rasterizer.cullFace; 358144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 359144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 360144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setCullMode(GLenum mode) 361144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 3622e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.rasterizer.cullMode = mode; 363144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 364144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 365144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setFrontFace(GLenum front) 366144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 3672e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.rasterizer.frontFace = front; 368144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 369144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 370144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setDepthTest(bool enabled) 371144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 3722e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.depthTest = enabled; 373144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 374144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 375144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::isDepthTestEnabled() const 376144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 377f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com return mState.depthStencil.depthTest; 378144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 379144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 380144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setDepthFunc(GLenum depthFunc) 381144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 3822e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.depthFunc = depthFunc; 383144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 384144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 385144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setDepthRange(float zNear, float zFar) 386144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 387144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.zNear = zNear; 388144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.zFar = zFar; 389144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 390144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 391144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setBlend(bool enabled) 392144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 3932e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blend.blend = enabled; 394144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 395144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 396144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::isBlendEnabled() const 397144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 398f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com return mState.blend.blend; 399144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 400144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 401144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha) 402144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 4032e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blend.sourceBlendRGB = sourceRGB; 4042e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blend.destBlendRGB = destRGB; 4052e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blend.sourceBlendAlpha = sourceAlpha; 4062e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blend.destBlendAlpha = destAlpha; 407144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 408144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 409144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setBlendColor(float red, float green, float blue, float alpha) 410144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 4112e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blendColor.red = red; 4122e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blendColor.green = green; 4132e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blendColor.blue = blue; 4142e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blendColor.alpha = alpha; 415144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 416144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 417144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation) 418144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 4192e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blend.blendEquationRGB = rgbEquation; 4202e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blend.blendEquationAlpha = alphaEquation; 421144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 422144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 423144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setStencilTest(bool enabled) 424144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 4252e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.stencilTest = enabled; 426144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 427144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 428144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::isStencilTestEnabled() const 429144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 430f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com return mState.depthStencil.stencilTest; 431144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 432144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 433144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask) 434144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 4352e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.stencilFunc = stencilFunc; 43608c331d42f31f8291238695d86db53d760e0b330daniel@transgaming.com mState.stencilRef = (stencilRef > 0) ? stencilRef : 0; 4372e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.stencilMask = stencilMask; 438144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 439144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 440144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask) 441144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 4422e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.stencilBackFunc = stencilBackFunc; 44308c331d42f31f8291238695d86db53d760e0b330daniel@transgaming.com mState.stencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0; 4442e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.stencilBackMask = stencilBackMask; 445144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 446144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 447144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setStencilWritemask(GLuint stencilWritemask) 448144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 4492e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.stencilWritemask = stencilWritemask; 450144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 451144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 452144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setStencilBackWritemask(GLuint stencilBackWritemask) 453144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 4542e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.stencilBackWritemask = stencilBackWritemask; 455144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 456144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 457144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass) 458144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 4592e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.stencilFail = stencilFail; 4602e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.stencilPassDepthFail = stencilPassDepthFail; 4612e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.stencilPassDepthPass = stencilPassDepthPass; 462144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 463144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 464144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass) 465144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 4662e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.stencilBackFail = stencilBackFail; 4672e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail; 4682e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass; 469144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 470144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 471144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setPolygonOffsetFill(bool enabled) 472144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 4732e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.rasterizer.polygonOffsetFill = enabled; 474144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 475144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 476144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::isPolygonOffsetFillEnabled() const 477144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 478f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com return mState.rasterizer.polygonOffsetFill; 479144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 480144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 481144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setPolygonOffsetParams(GLfloat factor, GLfloat units) 482144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 48331c4f2354382991a2f199d2584ec17bd3db0ae8dshannon.woods@transgaming.com // An application can pass NaN values here, so handle this gracefully 48431c4f2354382991a2f199d2584ec17bd3db0ae8dshannon.woods@transgaming.com mState.rasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor; 48531c4f2354382991a2f199d2584ec17bd3db0ae8dshannon.woods@transgaming.com mState.rasterizer.polygonOffsetUnits = units != units ? 0.0f : units; 486144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 487144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 488144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setSampleAlphaToCoverage(bool enabled) 489144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 4902e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blend.sampleAlphaToCoverage = enabled; 491144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 492144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 493144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::isSampleAlphaToCoverageEnabled() const 494144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 495f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com return mState.blend.sampleAlphaToCoverage; 496144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 497144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 498144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setSampleCoverage(bool enabled) 499144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 5002e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.sampleCoverage = enabled; 501144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 502144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 503144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::isSampleCoverageEnabled() const 504144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 505144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mState.sampleCoverage; 506144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 507144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 508144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setSampleCoverageParams(GLclampf value, bool invert) 509144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 5102e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.sampleCoverageValue = value; 5112e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.sampleCoverageInvert = invert; 512144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 513144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 514144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setScissorTest(bool enabled) 515144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 516d55e8c1b48f16f93cb89798fc3640047eb74d3fddaniel@transgaming.com mState.scissorTest = enabled; 517144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 518144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 519144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::isScissorTestEnabled() const 520144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 521d55e8c1b48f16f93cb89798fc3640047eb74d3fddaniel@transgaming.com return mState.scissorTest; 522144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 523144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 524144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setDither(bool enabled) 525144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 5262e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blend.dither = enabled; 527144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 528144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 529144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::isDitherEnabled() const 530144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 531f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com return mState.blend.dither; 532144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 533144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 534144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setLineWidth(GLfloat width) 535144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 536144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.lineWidth = width; 537144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 538144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 539144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setGenerateMipmapHint(GLenum hint) 540144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 541144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.generateMipmapHint = hint; 542144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 543144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 544144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setFragmentShaderDerivativeHint(GLenum hint) 545144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 546144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.fragmentShaderDerivativeHint = hint; 547144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // TODO: Propagate the hint to shader translator so we can write 548144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // ddx, ddx_coarse, or ddx_fine depending on the hint. 549144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // Ignore for now. It is valid for implementations to ignore hint. 550144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 551144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 552144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height) 553144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 5543884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com mState.viewport.x = x; 5553884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com mState.viewport.y = y; 5563884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com mState.viewport.width = width; 5573884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com mState.viewport.height = height; 558144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 559144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 560144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height) 561144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 5622e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.scissor.x = x; 5632e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.scissor.y = y; 5642e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.scissor.width = width; 5652e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.scissor.height = height; 566144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 567144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 568144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setColorMask(bool red, bool green, bool blue, bool alpha) 569144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 5702e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blend.colorMaskRed = red; 5712e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blend.colorMaskGreen = green; 5722e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blend.colorMaskBlue = blue; 5732e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.blend.colorMaskAlpha = alpha; 574144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 575144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 576144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setDepthMask(bool mask) 577144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 5782e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mState.depthStencil.depthMask = mask; 579144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 580144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 581144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setActiveSampler(unsigned int active) 582144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 583144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.activeSampler = active; 584144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 585144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 586144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::getReadFramebufferHandle() const 587144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 588144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mState.readFramebuffer; 589144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 590144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 591144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::getDrawFramebufferHandle() const 592144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 593144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mState.drawFramebuffer; 594144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 595144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 596144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::getRenderbufferHandle() const 597144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 598144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mState.renderbuffer.id(); 599144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 600144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 601144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::getArrayBufferHandle() const 602144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 603144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mState.arrayBuffer.id(); 604144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 605144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 606144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::getActiveQuery(GLenum target) const 607144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 608144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Query *queryObject = NULL; 609144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 610144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org switch (target) 611144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 612144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ANY_SAMPLES_PASSED_EXT: 613144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org queryObject = mState.activeQuery[QUERY_ANY_SAMPLES_PASSED].get(); 614144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 615144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: 616144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org queryObject = mState.activeQuery[QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE].get(); 617144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 618144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org default: 619144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org ASSERT(false); 620144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 621144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 622144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (queryObject) 623144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 624144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return queryObject->id(); 625144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 626144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 627144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 628144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return 0; 629144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 630144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 631144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 632144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setEnableVertexAttribArray(unsigned int attribNum, bool enabled) 633144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 634144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[attribNum].mArrayEnabled = enabled; 635144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 636144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 637144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgconst VertexAttribute &Context::getVertexAttribState(unsigned int attribNum) 638144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 639144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mState.vertexAttribute[attribNum]; 640144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 641144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 642144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type, bool normalized, 643144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org GLsizei stride, const void *pointer) 644144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 645144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[attribNum].mBoundBuffer.set(boundBuffer); 646144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[attribNum].mSize = size; 647144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[attribNum].mType = type; 648144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[attribNum].mNormalized = normalized; 649144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[attribNum].mStride = stride; 650144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[attribNum].mPointer = pointer; 651144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 652144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 653144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgconst void *Context::getVertexAttribPointer(unsigned int attribNum) const 654144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 655144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mState.vertexAttribute[attribNum].mPointer; 656144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 657144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 658144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setPackAlignment(GLint alignment) 659144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 660144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.packAlignment = alignment; 661144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 662144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 663144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLint Context::getPackAlignment() const 664144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 665144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mState.packAlignment; 666144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 667144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 668144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setUnpackAlignment(GLint alignment) 669144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 670144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.unpackAlignment = alignment; 671144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 672144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 673144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLint Context::getUnpackAlignment() const 674144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 675144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mState.unpackAlignment; 676144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 677144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 678144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setPackReverseRowOrder(bool reverseRowOrder) 679144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 680144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.packReverseRowOrder = reverseRowOrder; 681144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 682144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 683144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::getPackReverseRowOrder() const 684144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 685144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mState.packReverseRowOrder; 686144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 687144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 688144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createBuffer() 689144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 690144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mResourceManager->createBuffer(); 691144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 692144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 693144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createProgram() 694144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 695144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mResourceManager->createProgram(); 696144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 697144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 698144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createShader(GLenum type) 699144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 700144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mResourceManager->createShader(type); 701144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 702144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 703144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createTexture() 704144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 705144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mResourceManager->createTexture(); 706144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 707144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 708144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createRenderbuffer() 709144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 710144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mResourceManager->createRenderbuffer(); 711144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 712144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 713144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Returns an unused framebuffer name 714144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createFramebuffer() 715144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 716144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org GLuint handle = mFramebufferHandleAllocator.allocate(); 717144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 718144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mFramebufferMap[handle] = NULL; 719144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 720144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return handle; 721144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 722144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 723144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createFence() 724144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 725144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org GLuint handle = mFenceHandleAllocator.allocate(); 726144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 727ef21ab295564e9577d30fb389eec67ca71b42be1daniel@transgaming.com mFenceMap[handle] = new Fence(mRenderer); 728144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 729144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return handle; 730144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 731144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 732144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Returns an unused query name 733144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createQuery() 734144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 735144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org GLuint handle = mQueryHandleAllocator.allocate(); 736144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 737144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mQueryMap[handle] = NULL; 738144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 739144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return handle; 740144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 741144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 742144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteBuffer(GLuint buffer) 743144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 744144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mResourceManager->getBuffer(buffer)) 745144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 746144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org detachBuffer(buffer); 747144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 748144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 749144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResourceManager->deleteBuffer(buffer); 750144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 751144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 752144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteShader(GLuint shader) 753144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 754144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResourceManager->deleteShader(shader); 755144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 756144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 757144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteProgram(GLuint program) 758144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 759144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResourceManager->deleteProgram(program); 760144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 761144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 762144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteTexture(GLuint texture) 763144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 764144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mResourceManager->getTexture(texture)) 765144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 766144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org detachTexture(texture); 767144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 768144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 769144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResourceManager->deleteTexture(texture); 770144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 771144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 772144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteRenderbuffer(GLuint renderbuffer) 773144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 774144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mResourceManager->getRenderbuffer(renderbuffer)) 775144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 776144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org detachRenderbuffer(renderbuffer); 777144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 778144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 779144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResourceManager->deleteRenderbuffer(renderbuffer); 780144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 781144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 782144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteFramebuffer(GLuint framebuffer) 783144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 784144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org FramebufferMap::iterator framebufferObject = mFramebufferMap.find(framebuffer); 785144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 786144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (framebufferObject != mFramebufferMap.end()) 787144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 788144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org detachFramebuffer(framebuffer); 789144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 790144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mFramebufferHandleAllocator.release(framebufferObject->first); 791144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org delete framebufferObject->second; 792144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mFramebufferMap.erase(framebufferObject); 793144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 794144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 795144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 796144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteFence(GLuint fence) 797144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 798144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org FenceMap::iterator fenceObject = mFenceMap.find(fence); 799144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 800144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (fenceObject != mFenceMap.end()) 801144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 802144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mFenceHandleAllocator.release(fenceObject->first); 803144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org delete fenceObject->second; 804144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mFenceMap.erase(fenceObject); 805144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 806144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 807144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 808144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteQuery(GLuint query) 809144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 810144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org QueryMap::iterator queryObject = mQueryMap.find(query); 811144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (queryObject != mQueryMap.end()) 812144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 813144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mQueryHandleAllocator.release(queryObject->first); 814144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (queryObject->second) 815144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 816144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org queryObject->second->release(); 817144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 818144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mQueryMap.erase(queryObject); 819144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 820144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 821144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 822144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgBuffer *Context::getBuffer(GLuint handle) 823144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 824144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mResourceManager->getBuffer(handle); 825144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 826144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 827144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgShader *Context::getShader(GLuint handle) 828144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 829144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mResourceManager->getShader(handle); 830144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 831144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 832144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgProgram *Context::getProgram(GLuint handle) 833144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 834144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mResourceManager->getProgram(handle); 835144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 836144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 837144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgTexture *Context::getTexture(GLuint handle) 838144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 839144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mResourceManager->getTexture(handle); 840144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 841144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 842144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgRenderbuffer *Context::getRenderbuffer(GLuint handle) 843144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 844144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mResourceManager->getRenderbuffer(handle); 845144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 846144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 847144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgFramebuffer *Context::getReadFramebuffer() 848144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 849144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return getFramebuffer(mState.readFramebuffer); 850144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 851144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 852144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgFramebuffer *Context::getDrawFramebuffer() 853144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 854144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mBoundDrawFramebuffer; 855144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 856144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 857144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::bindArrayBuffer(unsigned int buffer) 858144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 859144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResourceManager->checkBufferAllocation(buffer); 860144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 861144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.arrayBuffer.set(getBuffer(buffer)); 862144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 863144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 864144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::bindElementArrayBuffer(unsigned int buffer) 865144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 866144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResourceManager->checkBufferAllocation(buffer); 867144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 868144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.elementArrayBuffer.set(getBuffer(buffer)); 869144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 870144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 871144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::bindTexture2D(GLuint texture) 872144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 873144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResourceManager->checkTextureAllocation(texture, TEXTURE_2D); 874144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 875144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.samplerTexture[TEXTURE_2D][mState.activeSampler].set(getTexture(texture)); 876144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 877144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 878144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::bindTextureCubeMap(GLuint texture) 879144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 880144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResourceManager->checkTextureAllocation(texture, TEXTURE_CUBE); 881144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 882144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.samplerTexture[TEXTURE_CUBE][mState.activeSampler].set(getTexture(texture)); 883144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 884144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 885144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::bindReadFramebuffer(GLuint framebuffer) 886144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 887144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (!getFramebuffer(framebuffer)) 888144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 88916418b115610ebc2d40efc3c6e817b0584d8c6f7daniel@transgaming.com mFramebufferMap[framebuffer] = new Framebuffer(mRenderer); 890144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 891144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 892144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.readFramebuffer = framebuffer; 893144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 894144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 895144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::bindDrawFramebuffer(GLuint framebuffer) 896144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 897144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (!getFramebuffer(framebuffer)) 898144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 89916418b115610ebc2d40efc3c6e817b0584d8c6f7daniel@transgaming.com mFramebufferMap[framebuffer] = new Framebuffer(mRenderer); 900144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 901144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 902144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.drawFramebuffer = framebuffer; 903144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 904144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mBoundDrawFramebuffer = getFramebuffer(framebuffer); 905144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 906144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 907144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::bindRenderbuffer(GLuint renderbuffer) 908144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 909144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResourceManager->checkRenderbufferAllocation(renderbuffer); 910144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 911144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.renderbuffer.set(getRenderbuffer(renderbuffer)); 912144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 913144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 914144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::useProgram(GLuint program) 915144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 916144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org GLuint priorProgram = mState.currentProgram; 917144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.currentProgram = program; // Must switch before trying to delete, otherwise it only gets flagged. 918144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 919144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (priorProgram != program) 920144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 921144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Program *newProgram = mResourceManager->getProgram(program); 922144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Program *oldProgram = mResourceManager->getProgram(priorProgram); 923989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com mCurrentProgramBinary.set(NULL); 924144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 925144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (newProgram) 926144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 927144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org newProgram->addRef(); 928989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com mCurrentProgramBinary.set(newProgram->getProgramBinary()); 929144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 930144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 931144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (oldProgram) 932144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 933144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org oldProgram->release(); 934144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 935144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 936144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 937144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 93895d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.comvoid Context::linkProgram(GLuint program) 93995d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com{ 94095d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com Program *programObject = mResourceManager->getProgram(program); 94195d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com 94212394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com bool linked = programObject->link(); 94312394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com 94412394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com // if the current program was relinked successfully we 94512394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com // need to install the new executables 94612394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com if (linked && program == mState.currentProgram) 94712394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com { 948989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com mCurrentProgramBinary.set(programObject->getProgramBinary()); 94912394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com } 95095d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com} 95195d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com 95295d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.comvoid Context::setProgramBinary(GLuint program, const void *binary, GLint length) 95395d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com{ 95495d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com Program *programObject = mResourceManager->getProgram(program); 95595d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com 95612394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com bool loaded = programObject->setProgramBinary(binary, length); 95712394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com 95812394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com // if the current program was reloaded successfully we 95912394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com // need to install the new executables 96012394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com if (loaded && program == mState.currentProgram) 96112394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com { 962989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com mCurrentProgramBinary.set(programObject->getProgramBinary()); 96312394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com } 96412394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com 96595d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com} 96695d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com 967144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::beginQuery(GLenum target, GLuint query) 968144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 969144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // From EXT_occlusion_query_boolean: If BeginQueryEXT is called with an <id> 970144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // of zero, if the active query object name for <target> is non-zero (for the 971144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // targets ANY_SAMPLES_PASSED_EXT and ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, if 972144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // the active query for either target is non-zero), if <id> is the name of an 973144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // existing query object whose type does not match <target>, or if <id> is the 974144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // active query object name for any query type, the error INVALID_OPERATION is 975144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // generated. 976144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 977144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // Ensure no other queries are active 978144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // NOTE: If other queries than occlusion are supported, we will need to check 979144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // separately that: 980144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // a) The query ID passed is not the current active query for any target/type 981144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // b) There are no active queries for the requested target (and in the case 982144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // of GL_ANY_SAMPLES_PASSED_EXT and GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, 983144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // no query may be active for either if glBeginQuery targets either. 984144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org for (int i = 0; i < QUERY_TYPE_COUNT; i++) 985144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 986144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mState.activeQuery[i].get() != NULL) 987144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 988779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 989144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 990144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 991144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 992144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org QueryType qType; 993144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org switch (target) 994144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 995144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ANY_SAMPLES_PASSED_EXT: 996144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org qType = QUERY_ANY_SAMPLES_PASSED; 997144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 998144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: 999144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org qType = QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE; 1000144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1001144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org default: 1002144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org ASSERT(false); 1003144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return; 1004144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1005144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1006144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Query *queryObject = getQuery(query, true, target); 1007144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1008144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // check that name was obtained with glGenQueries 1009144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (!queryObject) 1010144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1011779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 1012144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1013144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1014144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // check for type mismatch 1015144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (queryObject->getType() != target) 1016144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1017779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 1018144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1019144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1020144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // set query as active for specified target 1021144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.activeQuery[qType].set(queryObject); 1022144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1023144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // begin query 1024144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org queryObject->begin(); 1025144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1026144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1027144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::endQuery(GLenum target) 1028144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1029144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org QueryType qType; 1030144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1031144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org switch (target) 1032144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1033144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ANY_SAMPLES_PASSED_EXT: 1034144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org qType = QUERY_ANY_SAMPLES_PASSED; 1035144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1036144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: 1037144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org qType = QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE; 1038144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1039144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org default: 1040144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org ASSERT(false); 1041144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return; 1042144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1043144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1044144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Query *queryObject = mState.activeQuery[qType].get(); 1045144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1046144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (queryObject == NULL) 1047144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1048779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 1049144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1050144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1051144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org queryObject->end(); 1052144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1053144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.activeQuery[qType].set(NULL); 1054144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1055144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1056144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setFramebufferZero(Framebuffer *buffer) 1057144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1058144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org delete mFramebufferMap[0]; 1059144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mFramebufferMap[0] = buffer; 1060144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mState.drawFramebuffer == 0) 1061144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1062144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mBoundDrawFramebuffer = buffer; 1063144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1064144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1065144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 106670062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.comvoid Context::setRenderbufferStorage(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples) 1067144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 106870062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com RenderbufferStorage *renderbuffer = NULL; 106970062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com switch (internalformat) 107070062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com { 107170062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com case GL_DEPTH_COMPONENT16: 107270062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com renderbuffer = new gl::Depthbuffer(mRenderer, width, height, samples); 107370062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com break; 107470062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com case GL_RGBA4: 107570062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com case GL_RGB5_A1: 107670062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com case GL_RGB565: 107770062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com case GL_RGB8_OES: 107870062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com case GL_RGBA8_OES: 107970062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com renderbuffer = new gl::Colorbuffer(mRenderer,width, height, internalformat, samples); 108070062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com break; 108170062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com case GL_STENCIL_INDEX8: 108270062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com renderbuffer = new gl::Stencilbuffer(mRenderer, width, height, samples); 108370062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com break; 108470062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com case GL_DEPTH24_STENCIL8_OES: 108570062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com renderbuffer = new gl::DepthStencilbuffer(mRenderer, width, height, samples); 108670062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com break; 108770062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com default: 108870062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com UNREACHABLE(); return; 108970062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com } 109070062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com 1091144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Renderbuffer *renderbufferObject = mState.renderbuffer.get(); 1092144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org renderbufferObject->setStorage(renderbuffer); 1093144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1094144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1095144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgFramebuffer *Context::getFramebuffer(unsigned int handle) 1096144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1097144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org FramebufferMap::iterator framebuffer = mFramebufferMap.find(handle); 1098144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1099144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (framebuffer == mFramebufferMap.end()) 1100144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1101144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return NULL; 1102144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1103144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 1104144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1105144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return framebuffer->second; 1106144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1107144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1108144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1109144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgFence *Context::getFence(unsigned int handle) 1110144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1111144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org FenceMap::iterator fence = mFenceMap.find(handle); 1112144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1113144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (fence == mFenceMap.end()) 1114144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1115144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return NULL; 1116144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1117144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 1118144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1119144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return fence->second; 1120144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1121144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1122144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1123144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgQuery *Context::getQuery(unsigned int handle, bool create, GLenum type) 1124144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1125144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org QueryMap::iterator query = mQueryMap.find(handle); 1126144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1127144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (query == mQueryMap.end()) 1128144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1129144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return NULL; 1130144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1131144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 1132144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1133144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (!query->second && create) 1134144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1135b32e19875065fc668b65ae89511b504cd3da8310shannon.woods@transgaming.com query->second = new Query(mRenderer, type, handle); 1136144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org query->second->addRef(); 1137144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1138144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return query->second; 1139144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1140144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1141144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1142144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgBuffer *Context::getArrayBuffer() 1143144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1144144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mState.arrayBuffer.get(); 1145144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1146144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1147144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgBuffer *Context::getElementArrayBuffer() 1148144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1149144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mState.elementArrayBuffer.get(); 1150144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1151144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 115262a2846cfeb8f1d34f8c0182f9e0adf5e23f5832daniel@transgaming.comProgramBinary *Context::getCurrentProgramBinary() 1153144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1154989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com return mCurrentProgramBinary.get(); 1155144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1156144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1157144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgTexture2D *Context::getTexture2D() 1158144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1159144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return static_cast<Texture2D*>(getSamplerTexture(mState.activeSampler, TEXTURE_2D)); 1160144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1161144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1162144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgTextureCubeMap *Context::getTextureCubeMap() 1163144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1164144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return static_cast<TextureCubeMap*>(getSamplerTexture(mState.activeSampler, TEXTURE_CUBE)); 1165144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1166144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1167144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgTexture *Context::getSamplerTexture(unsigned int sampler, TextureType type) 1168144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1169144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org GLuint texid = mState.samplerTexture[type][sampler].id(); 1170144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1171144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (texid == 0) // Special case: 0 refers to different initial textures based on the target 1172144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1173144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org switch (type) 1174144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1175144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org default: UNREACHABLE(); 1176144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case TEXTURE_2D: return mTexture2DZero.get(); 1177144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case TEXTURE_CUBE: return mTextureCubeMapZero.get(); 1178144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1179144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1180144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1181144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mState.samplerTexture[type][sampler].get(); 1182144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1183144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1184144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::getBooleanv(GLenum pname, GLboolean *params) 1185144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1186144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org switch (pname) 1187144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1188f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_SHADER_COMPILER: *params = GL_TRUE; break; 1189f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_SAMPLE_COVERAGE_INVERT: *params = mState.sampleCoverageInvert; break; 1190f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_DEPTH_WRITEMASK: *params = mState.depthStencil.depthMask; break; 1191144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_COLOR_WRITEMASK: 1192f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com params[0] = mState.blend.colorMaskRed; 1193f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com params[1] = mState.blend.colorMaskGreen; 1194f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com params[2] = mState.blend.colorMaskBlue; 1195f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com params[3] = mState.blend.colorMaskAlpha; 1196144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1197f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_CULL_FACE: *params = mState.rasterizer.cullFace; break; 1198f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_POLYGON_OFFSET_FILL: *params = mState.rasterizer.polygonOffsetFill; break; 1199f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mState.blend.sampleAlphaToCoverage; break; 1200f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_SAMPLE_COVERAGE: *params = mState.sampleCoverage; break; 1201d55e8c1b48f16f93cb89798fc3640047eb74d3fddaniel@transgaming.com case GL_SCISSOR_TEST: *params = mState.scissorTest; break; 1202f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_STENCIL_TEST: *params = mState.depthStencil.stencilTest; break; 1203f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_DEPTH_TEST: *params = mState.depthStencil.depthTest; break; 1204f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_BLEND: *params = mState.blend.blend; break; 1205f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_DITHER: *params = mState.blend.dither; break; 1206f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_CONTEXT_ROBUST_ACCESS_EXT: *params = mRobustAccess ? GL_TRUE : GL_FALSE; break; 1207144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org default: 1208144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return false; 1209144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1210144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1211144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return true; 1212144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1213144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1214144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::getFloatv(GLenum pname, GLfloat *params) 1215144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1216144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation 1217144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // because it is stored as a float, despite the fact that the GL ES 2.0 spec names 1218144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // GetIntegerv as its native query function. As it would require conversion in any 1219144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // case, this should make no difference to the calling application. 1220144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org switch (pname) 1221144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1222f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_LINE_WIDTH: *params = mState.lineWidth; break; 1223f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_SAMPLE_COVERAGE_VALUE: *params = mState.sampleCoverageValue; break; 1224f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_DEPTH_CLEAR_VALUE: *params = mState.depthClearValue; break; 1225f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_POLYGON_OFFSET_FACTOR: *params = mState.rasterizer.polygonOffsetFactor; break; 1226f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_POLYGON_OFFSET_UNITS: *params = mState.rasterizer.polygonOffsetUnits; break; 1227144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ALIASED_LINE_WIDTH_RANGE: 1228144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[0] = gl::ALIASED_LINE_WIDTH_RANGE_MIN; 1229144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[1] = gl::ALIASED_LINE_WIDTH_RANGE_MAX; 1230144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1231144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ALIASED_POINT_SIZE_RANGE: 1232144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[0] = gl::ALIASED_POINT_SIZE_RANGE_MIN; 1233144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[1] = getMaximumPointSize(); 1234144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1235144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_DEPTH_RANGE: 1236144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[0] = mState.zNear; 1237144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[1] = mState.zFar; 1238144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1239144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_COLOR_CLEAR_VALUE: 1240144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[0] = mState.colorClearValue.red; 1241144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[1] = mState.colorClearValue.green; 1242144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[2] = mState.colorClearValue.blue; 1243144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[3] = mState.colorClearValue.alpha; 1244144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1245144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_BLEND_COLOR: 1246144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[0] = mState.blendColor.red; 1247144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[1] = mState.blendColor.green; 1248144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[2] = mState.blendColor.blue; 1249144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[3] = mState.blendColor.alpha; 1250144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 125107ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: 125207ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com if (!supportsTextureFilterAnisotropy()) 125307ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com { 125407ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com return false; 125507ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com } 125607ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com *params = mMaxTextureAnisotropy; 125707ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com break; 1258144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org default: 1259144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return false; 1260144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1261144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1262144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return true; 1263144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1264144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1265144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::getIntegerv(GLenum pname, GLint *params) 1266144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 126725aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT) 126825aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com { 126925aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT); 127025aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com 127125aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com if (colorAttachment >= mRenderer->getMaxRenderTargets()) 127225aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com { 127325aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com // return true to stop further operation in the parent call 127425aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com return gl::error(GL_INVALID_OPERATION, true); 127525aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com } 127625aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com 127725aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com Framebuffer *framebuffer = getDrawFramebuffer(); 127825aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com 127925aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com *params = framebuffer->getDrawBufferState(colorAttachment); 128025aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com return true; 128125aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com } 128225aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com 1283144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation 1284144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // because it is stored as a float, despite the fact that the GL ES 2.0 spec names 1285144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // GetIntegerv as its native query function. As it would require conversion in any 1286144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // case, this should make no difference to the calling application. You may find it in 1287144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // Context::getFloatv. 1288144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org switch (pname) 1289144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1290144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_VERTEX_ATTRIBS: *params = gl::MAX_VERTEX_ATTRIBS; break; 1291254317da1b997a0f73b297b8b100116879a8e7a6shannon.woods@transgaming.com case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = mRenderer->getMaxVertexUniformVectors(); break; 129276cd88c5a67c14da7f4e0a7a6491297e3fb49bcbshannon.woods@transgaming.com case GL_MAX_VARYING_VECTORS: *params = mRenderer->getMaxVaryingVectors(); break; 129376cd88c5a67c14da7f4e0a7a6491297e3fb49bcbshannon.woods@transgaming.com case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = mRenderer->getMaxCombinedTextureImageUnits(); break; 1294233fe9548a2b166d3ccb09a4a7af273fab6dbf2cshannon.woods@transgaming.com case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = mRenderer->getMaxVertexTextureImageUnits(); break; 1295144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_TEXTURE_IMAGE_UNITS: *params = gl::MAX_TEXTURE_IMAGE_UNITS; break; 1296254317da1b997a0f73b297b8b100116879a8e7a6shannon.woods@transgaming.com case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = mRenderer->getMaxFragmentUniformVectors(); break; 1297144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_RENDERBUFFER_SIZE: *params = getMaximumRenderbufferDimension(); break; 1298a67ea7f8787b0139bf77e46c51fadd2aef9b7e4dshannon.woods%transgaming.com@gtempaccount.com case GL_MAX_COLOR_ATTACHMENTS_EXT: *params = mRenderer->getMaxRenderTargets(); break; 129925aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com case GL_MAX_DRAW_BUFFERS_EXT: *params = mRenderer->getMaxRenderTargets(); break; 1300144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_NUM_SHADER_BINARY_FORMATS: *params = 0; break; 1301144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SHADER_BINARY_FORMATS: /* no shader binary formats are supported */ break; 1302144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ARRAY_BUFFER_BINDING: *params = mState.arrayBuffer.id(); break; 1303144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ELEMENT_ARRAY_BUFFER_BINDING: *params = mState.elementArrayBuffer.id(); break; 1304144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 1305144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE: *params = mState.drawFramebuffer; break; 1306144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_READ_FRAMEBUFFER_BINDING_ANGLE: *params = mState.readFramebuffer; break; 1307144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_RENDERBUFFER_BINDING: *params = mState.renderbuffer.id(); break; 1308144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_CURRENT_PROGRAM: *params = mState.currentProgram; break; 1309144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_PACK_ALIGNMENT: *params = mState.packAlignment; break; 1310144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_PACK_REVERSE_ROW_ORDER_ANGLE: *params = mState.packReverseRowOrder; break; 1311144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_UNPACK_ALIGNMENT: *params = mState.unpackAlignment; break; 1312144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_GENERATE_MIPMAP_HINT: *params = mState.generateMipmapHint; break; 1313144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mState.fragmentShaderDerivativeHint; break; 1314144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ACTIVE_TEXTURE: *params = (mState.activeSampler + GL_TEXTURE0); break; 1315f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_STENCIL_FUNC: *params = mState.depthStencil.stencilFunc; break; 131608c331d42f31f8291238695d86db53d760e0b330daniel@transgaming.com case GL_STENCIL_REF: *params = mState.stencilRef; break; 1317f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_STENCIL_VALUE_MASK: *params = mState.depthStencil.stencilMask; break; 1318f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_STENCIL_BACK_FUNC: *params = mState.depthStencil.stencilBackFunc; break; 131908c331d42f31f8291238695d86db53d760e0b330daniel@transgaming.com case GL_STENCIL_BACK_REF: *params = mState.stencilBackRef; break; 1320f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_STENCIL_BACK_VALUE_MASK: *params = mState.depthStencil.stencilBackMask; break; 1321f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_STENCIL_FAIL: *params = mState.depthStencil.stencilFail; break; 1322f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_STENCIL_PASS_DEPTH_FAIL: *params = mState.depthStencil.stencilPassDepthFail; break; 1323f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_STENCIL_PASS_DEPTH_PASS: *params = mState.depthStencil.stencilPassDepthPass; break; 1324f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_STENCIL_BACK_FAIL: *params = mState.depthStencil.stencilBackFail; break; 1325f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_STENCIL_BACK_PASS_DEPTH_FAIL: *params = mState.depthStencil.stencilBackPassDepthFail; break; 1326f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_STENCIL_BACK_PASS_DEPTH_PASS: *params = mState.depthStencil.stencilBackPassDepthPass; break; 1327f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_DEPTH_FUNC: *params = mState.depthStencil.depthFunc; break; 1328f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_BLEND_SRC_RGB: *params = mState.blend.sourceBlendRGB; break; 1329f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_BLEND_SRC_ALPHA: *params = mState.blend.sourceBlendAlpha; break; 1330f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_BLEND_DST_RGB: *params = mState.blend.destBlendRGB; break; 1331f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_BLEND_DST_ALPHA: *params = mState.blend.destBlendAlpha; break; 1332f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_BLEND_EQUATION_RGB: *params = mState.blend.blendEquationRGB; break; 1333f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_BLEND_EQUATION_ALPHA: *params = mState.blend.blendEquationAlpha; break; 1334f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_STENCIL_WRITEMASK: *params = mState.depthStencil.stencilWritemask; break; 1335f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_STENCIL_BACK_WRITEMASK: *params = mState.depthStencil.stencilBackWritemask; break; 1336144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_CLEAR_VALUE: *params = mState.stencilClearValue; break; 1337144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SUBPIXEL_BITS: *params = 4; break; 1338144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_TEXTURE_SIZE: *params = getMaximumTextureDimension(); break; 1339144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_CUBE_MAP_TEXTURE_SIZE: *params = getMaximumCubeTextureDimension(); break; 1340144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_NUM_COMPRESSED_TEXTURE_FORMATS: 1341144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org params[0] = mNumCompressedTextureFormats; 1342144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1343144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_SAMPLES_ANGLE: 1344144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1345144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org GLsizei maxSamples = getMaxSupportedSamples(); 1346144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (maxSamples != 0) 1347144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1348144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = maxSamples; 1349144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1350144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 1351144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1352144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return false; 1353144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1354144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1355144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1356144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1357144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SAMPLE_BUFFERS: 1358144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SAMPLES: 1359144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1360144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org gl::Framebuffer *framebuffer = getDrawFramebuffer(); 1361144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (framebuffer->completeness() == GL_FRAMEBUFFER_COMPLETE) 1362144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1363144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org switch (pname) 1364144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1365144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SAMPLE_BUFFERS: 1366144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (framebuffer->getSamples() != 0) 1367144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1368144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = 1; 1369144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1370144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 1371144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1372144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = 0; 1373144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1374144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1375144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SAMPLES: 1376144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = framebuffer->getSamples(); 1377144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1378144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1379144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1380144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 1381144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1382144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = 0; 1383144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1384144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1385144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 138642944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com case GL_IMPLEMENTATION_COLOR_READ_TYPE: 138742944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com case GL_IMPLEMENTATION_COLOR_READ_FORMAT: 138842944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com { 138942944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com GLenum format, type; 139042944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com if (getCurrentReadFormatType(&format, &type)) 139142944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com { 139242944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com if (pname == GL_IMPLEMENTATION_COLOR_READ_FORMAT) 139342944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com *params = format; 139442944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com else 139542944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com *params = type; 139642944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com } 139742944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com } 139842944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com break; 1399144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_VIEWPORT_DIMS: 1400144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 14018ce2f8f8e9597c045e6cf0c150c9302e7f3466b6shannon.woods@transgaming.com params[0] = mMaxViewportDimension; 14028ce2f8f8e9597c045e6cf0c150c9302e7f3466b6shannon.woods@transgaming.com params[1] = mMaxViewportDimension; 1403144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1404144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1405144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_COMPRESSED_TEXTURE_FORMATS: 1406144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1407144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsDXT1Textures()) 1408144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1409144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params++ = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; 1410144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params++ = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; 1411144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1412144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsDXT3Textures()) 1413144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1414144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params++ = GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE; 1415144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1416144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsDXT5Textures()) 1417144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1418144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params++ = GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE; 1419144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1420144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1421144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1422144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_VIEWPORT: 14233884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com params[0] = mState.viewport.x; 14243884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com params[1] = mState.viewport.y; 14253884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com params[2] = mState.viewport.width; 14263884e2c242e152999f7120c3368a8c3799566511daniel@transgaming.com params[3] = mState.viewport.height; 1427144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1428144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SCISSOR_BOX: 1429f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com params[0] = mState.scissor.x; 1430f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com params[1] = mState.scissor.y; 1431f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com params[2] = mState.scissor.width; 1432f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com params[3] = mState.scissor.height; 1433144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1434f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_CULL_FACE_MODE: *params = mState.rasterizer.cullMode; break; 1435f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_FRONT_FACE: *params = mState.rasterizer.frontFace; break; 1436144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_RED_BITS: 1437144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_GREEN_BITS: 1438144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_BLUE_BITS: 1439144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ALPHA_BITS: 1440144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1441144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org gl::Framebuffer *framebuffer = getDrawFramebuffer(); 1442acf735f54c291de6894ae37d200bb70c2cf91eebshannon.woods%transgaming.com@gtempaccount.com gl::Renderbuffer *colorbuffer = framebuffer->getFirstColorbuffer(); 1443144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1444144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (colorbuffer) 1445144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1446144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org switch (pname) 1447144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1448f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_RED_BITS: *params = colorbuffer->getRedSize(); break; 1449f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break; 1450f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); break; 1451f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break; 1452144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1453144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1454144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 1455144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1456144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = 0; 1457144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1458144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1459144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1460144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_DEPTH_BITS: 1461144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1462144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org gl::Framebuffer *framebuffer = getDrawFramebuffer(); 1463144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org gl::Renderbuffer *depthbuffer = framebuffer->getDepthbuffer(); 1464144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1465144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (depthbuffer) 1466144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1467144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = depthbuffer->getDepthSize(); 1468144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1469144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 1470144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1471144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = 0; 1472144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1473144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1474144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1475144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_BITS: 1476144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1477144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org gl::Framebuffer *framebuffer = getDrawFramebuffer(); 1478144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org gl::Renderbuffer *stencilbuffer = framebuffer->getStencilbuffer(); 1479144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1480144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (stencilbuffer) 1481144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1482144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = stencilbuffer->getStencilSize(); 1483144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1484144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 1485144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1486144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = 0; 1487144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1488144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1489144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1490144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_TEXTURE_BINDING_2D: 1491144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 149276cd88c5a67c14da7f4e0a7a6491297e3fb49bcbshannon.woods@transgaming.com if (mState.activeSampler > mRenderer->getMaxCombinedTextureImageUnits() - 1) 1493144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1494779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com gl::error(GL_INVALID_OPERATION); 1495144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return false; 1496144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1497144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1498144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = mState.samplerTexture[TEXTURE_2D][mState.activeSampler].id(); 1499144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1500144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1501144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_TEXTURE_BINDING_CUBE_MAP: 1502144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 150376cd88c5a67c14da7f4e0a7a6491297e3fb49bcbshannon.woods@transgaming.com if (mState.activeSampler > mRenderer->getMaxCombinedTextureImageUnits() - 1) 1504144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1505779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com gl::error(GL_INVALID_OPERATION); 1506144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return false; 1507144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1508144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1509144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = mState.samplerTexture[TEXTURE_CUBE][mState.activeSampler].id(); 1510144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1511144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1512144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_RESET_NOTIFICATION_STRATEGY_EXT: 1513144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = mResetStrategy; 1514144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1515144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_NUM_PROGRAM_BINARY_FORMATS_OES: 1516144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = 1; 1517144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1518144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_PROGRAM_BINARY_FORMATS_OES: 1519144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *params = GL_PROGRAM_BINARY_ANGLE; 1520144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1521144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org default: 1522144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return false; 1523144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1524144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1525144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return true; 1526144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1527144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1528144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams) 1529144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 153025aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT) 153125aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com { 153225aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com *type = GL_INT; 153325aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com *numParams = 1; 153425aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com return true; 153525aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com } 153625aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com 1537144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation 1538144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due 1539144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // to the fact that it is stored internally as a float, and so would require conversion 1540144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // if returned from Context::getIntegerv. Since this conversion is already implemented 1541144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we 1542144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling 1543144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // application. 1544144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org switch (pname) 1545144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1546144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_COMPRESSED_TEXTURE_FORMATS: 1547144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1548144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *type = GL_INT; 1549144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *numParams = mNumCompressedTextureFormats; 1550144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1551144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1552144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SHADER_BINARY_FORMATS: 1553144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1554144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *type = GL_INT; 1555144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *numParams = 0; 1556144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1557144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1558144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_VERTEX_ATTRIBS: 1559144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_VERTEX_UNIFORM_VECTORS: 1560144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_VARYING_VECTORS: 1561144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: 1562144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: 1563144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_TEXTURE_IMAGE_UNITS: 1564144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_FRAGMENT_UNIFORM_VECTORS: 1565144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_RENDERBUFFER_SIZE: 1566a67ea7f8787b0139bf77e46c51fadd2aef9b7e4dshannon.woods%transgaming.com@gtempaccount.com case GL_MAX_COLOR_ATTACHMENTS_EXT: 156725aab4f9ee2de3f6fbe60bdda3ec2c05b2d03214shannon.woods%transgaming.com@gtempaccount.com case GL_MAX_DRAW_BUFFERS_EXT: 1568144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_NUM_SHADER_BINARY_FORMATS: 1569144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_NUM_COMPRESSED_TEXTURE_FORMATS: 1570144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ARRAY_BUFFER_BINDING: 1571144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_FRAMEBUFFER_BINDING: 1572144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_RENDERBUFFER_BINDING: 1573144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_CURRENT_PROGRAM: 1574144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_PACK_ALIGNMENT: 1575144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_PACK_REVERSE_ROW_ORDER_ANGLE: 1576144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_UNPACK_ALIGNMENT: 1577144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_GENERATE_MIPMAP_HINT: 1578144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: 1579144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_RED_BITS: 1580144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_GREEN_BITS: 1581144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_BLUE_BITS: 1582144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ALPHA_BITS: 1583144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_DEPTH_BITS: 1584144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_BITS: 1585144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ELEMENT_ARRAY_BUFFER_BINDING: 1586144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_CULL_FACE_MODE: 1587144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_FRONT_FACE: 1588144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ACTIVE_TEXTURE: 1589144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_FUNC: 1590144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_VALUE_MASK: 1591144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_REF: 1592144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_FAIL: 1593144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_PASS_DEPTH_FAIL: 1594144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_PASS_DEPTH_PASS: 1595144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_BACK_FUNC: 1596144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_BACK_VALUE_MASK: 1597144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_BACK_REF: 1598144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_BACK_FAIL: 1599144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_BACK_PASS_DEPTH_FAIL: 1600144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_BACK_PASS_DEPTH_PASS: 1601144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_DEPTH_FUNC: 1602144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_BLEND_SRC_RGB: 1603144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_BLEND_SRC_ALPHA: 1604144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_BLEND_DST_RGB: 1605144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_BLEND_DST_ALPHA: 1606144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_BLEND_EQUATION_RGB: 1607144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_BLEND_EQUATION_ALPHA: 1608144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_WRITEMASK: 1609144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_BACK_WRITEMASK: 1610144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_CLEAR_VALUE: 1611144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SUBPIXEL_BITS: 1612144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_TEXTURE_SIZE: 1613144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_CUBE_MAP_TEXTURE_SIZE: 1614144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SAMPLE_BUFFERS: 1615144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SAMPLES: 1616144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_IMPLEMENTATION_COLOR_READ_TYPE: 1617144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_IMPLEMENTATION_COLOR_READ_FORMAT: 1618144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_TEXTURE_BINDING_2D: 1619144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_TEXTURE_BINDING_CUBE_MAP: 1620144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_RESET_NOTIFICATION_STRATEGY_EXT: 1621144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_NUM_PROGRAM_BINARY_FORMATS_OES: 1622144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_PROGRAM_BINARY_FORMATS_OES: 1623144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1624144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *type = GL_INT; 1625144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *numParams = 1; 1626144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1627144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1628144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_SAMPLES_ANGLE: 1629144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1630144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (getMaxSupportedSamples() != 0) 1631144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1632144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *type = GL_INT; 1633144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *numParams = 1; 1634144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1635144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 1636144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1637144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return false; 1638144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1639144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1640144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1641144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_MAX_VIEWPORT_DIMS: 1642144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1643144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *type = GL_INT; 1644144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *numParams = 2; 1645144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1646144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1647144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_VIEWPORT: 1648144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SCISSOR_BOX: 1649144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1650144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *type = GL_INT; 1651144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *numParams = 4; 1652144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1653144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1654144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SHADER_COMPILER: 1655144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SAMPLE_COVERAGE_INVERT: 1656144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_DEPTH_WRITEMASK: 1657144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled, 1658144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries. 1659144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as bool-natural 1660144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SAMPLE_COVERAGE: 1661144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SCISSOR_TEST: 1662144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_STENCIL_TEST: 1663144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_DEPTH_TEST: 1664144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_BLEND: 1665144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_DITHER: 1666144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_CONTEXT_ROBUST_ACCESS_EXT: 1667144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1668144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *type = GL_BOOL; 1669144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *numParams = 1; 1670144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1671144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1672144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_COLOR_WRITEMASK: 1673144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1674144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *type = GL_BOOL; 1675144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *numParams = 4; 1676144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1677144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1678144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_POLYGON_OFFSET_FACTOR: 1679144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_POLYGON_OFFSET_UNITS: 1680144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_SAMPLE_COVERAGE_VALUE: 1681144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_DEPTH_CLEAR_VALUE: 1682144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_LINE_WIDTH: 1683144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1684144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *type = GL_FLOAT; 1685144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *numParams = 1; 1686144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1687144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1688144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ALIASED_LINE_WIDTH_RANGE: 1689144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_ALIASED_POINT_SIZE_RANGE: 1690144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_DEPTH_RANGE: 1691144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1692144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *type = GL_FLOAT; 1693144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *numParams = 2; 1694144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1695144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 1696144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_COLOR_CLEAR_VALUE: 1697144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case GL_BLEND_COLOR: 1698144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1699144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *type = GL_FLOAT; 1700144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org *numParams = 4; 1701144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1702144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 170307ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: 170407ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com if (!supportsTextureFilterAnisotropy()) 170507ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com { 170607ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com return false; 170707ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com } 170807ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com *type = GL_FLOAT; 170907ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com *numParams = 1; 171007ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com break; 1711144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org default: 1712144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return false; 1713144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1714144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1715144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return true; 1716144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1717144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1718144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Applies the render target surface, depth stencil surface, viewport rectangle and 17191298518804934fac7f8ecd37ad58a5ac100cff36daniel@transgaming.com// scissor rectangle to the renderer 17201298518804934fac7f8ecd37ad58a5ac100cff36daniel@transgaming.combool Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport) 1721144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1722144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Framebuffer *framebufferObject = getDrawFramebuffer(); 1723144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1724144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE) 1725144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1726779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false); 1727144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1728144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 17298a8b24c7fc14768f035ea3e68bd5c9cee552566adaniel@transgaming.com mRenderer->applyRenderTarget(framebufferObject); 17308a8b24c7fc14768f035ea3e68bd5c9cee552566adaniel@transgaming.com 17311298518804934fac7f8ecd37ad58a5ac100cff36daniel@transgaming.com if (!mRenderer->setViewport(mState.viewport, mState.zNear, mState.zFar, drawMode, mState.rasterizer.frontFace, 17320b236e2ec3c32b79d1abca881a32cbf53027e3d3shannon.woods@transgaming.com ignoreViewport)) 1733144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 17343ca082cc963c4f7b55e8fc0daf9aff066b2ecdf1daniel@transgaming.com return false; 1735144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1736144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1737d55e8c1b48f16f93cb89798fc3640047eb74d3fddaniel@transgaming.com mRenderer->setScissorRectangle(mState.scissor, mState.scissorTest); 1738144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1739144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return true; 1740144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1741144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1742144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Applies the fixed-function state (culling, depth test, alpha blending, stenciling, etc) to the Direct3D 9 device 1743144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::applyState(GLenum drawMode) 1744144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 174591f68c4c8397ff9410864df5055257e68248241aNicolas Capens Framebuffer *framebufferObject = getDrawFramebuffer(); 174691f68c4c8397ff9410864df5055257e68248241aNicolas Capens int samples = framebufferObject->getSamples(); 174791f68c4c8397ff9410864df5055257e68248241aNicolas Capens 1748dd2524c46ed4689c27adf3f9959435fd2906b621shannon.woods@transgaming.com mState.rasterizer.pointDrawMode = (drawMode == GL_POINTS); 174991f68c4c8397ff9410864df5055257e68248241aNicolas Capens mState.rasterizer.multiSample = (samples != 0); 1750dd2524c46ed4689c27adf3f9959435fd2906b621shannon.woods@transgaming.com mRenderer->setRasterizerState(mState.rasterizer); 1751144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 17522e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com unsigned int mask = 0; 17532e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com if (mState.sampleCoverage) 1754144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 17552e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com if (mState.sampleCoverageValue != 0) 1756144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 175791f68c4c8397ff9410864df5055257e68248241aNicolas Capens 17582e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com float threshold = 0.5f; 17592e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com 176091f68c4c8397ff9410864df5055257e68248241aNicolas Capens for (int i = 0; i < samples; ++i) 1761144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 17622e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mask <<= 1; 1763144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 17642e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com if ((i + 1) * mState.sampleCoverageValue >= threshold) 1765144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 17662e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com threshold += 1.0f; 17672e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mask |= 1; 1768144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1769144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1770144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 17712e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com 17722e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com if (mState.sampleCoverageInvert) 1773144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 17742e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mask = ~mask; 1775144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1776144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 17772e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com else 1778144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 17792e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mask = 0xFFFFFFFF; 1780144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 17812e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com mRenderer->setBlendState(mState.blend, mState.blendColor, mask); 17822e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com 178308c331d42f31f8291238695d86db53d760e0b330daniel@transgaming.com mRenderer->setDepthStencilState(mState.depthStencil, mState.stencilRef, mState.stencilBackRef, 17843a0ef48010e6a3e95c9d72f982ab6d3d4cad0c6fdaniel@transgaming.com mState.rasterizer.frontFace == GL_CCW); 1785144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1786144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1787144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Applies the shaders and shader constants to the Direct3D 9 device 1788144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::applyShaders() 1789144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 179062a2846cfeb8f1d34f8c0182f9e0adf5e23f5832daniel@transgaming.com ProgramBinary *programBinary = getCurrentProgramBinary(); 1791144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1792e499141632259ca0189c07c5eb947b728ff4ebbedaniel@transgaming.com mRenderer->applyShaders(programBinary); 17935fbf177ce23fc52625e1d7a6914fd7a9ce12c311daniel@transgaming.com 1794144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org programBinary->applyUniforms(); 1795144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1796144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1797144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Applies the textures and sampler states to the Direct3D 9 device 1798144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::applyTextures() 1799144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1800144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org applyTextures(SAMPLER_PIXEL); 1801144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1802144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mSupportsVertexTexture) 1803144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1804144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org applyTextures(SAMPLER_VERTEX); 1805144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1806144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1807144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1808144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// For each Direct3D 9 sampler of either the pixel or vertex stage, 1809144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// looks up the corresponding OpenGL texture image unit and texture type, 1810144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// and sets the texture and its addressing/filtering state (or NULL when inactive). 1811144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::applyTextures(SamplerType type) 1812144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 181362a2846cfeb8f1d34f8c0182f9e0adf5e23f5832daniel@transgaming.com ProgramBinary *programBinary = getCurrentProgramBinary(); 1814144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 18154b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang FramebufferTextureSerialSet boundFramebufferTextures = getBoundFramebufferTextureSerials(); 18164b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang 1817233fe9548a2b166d3ccb09a4a7af273fab6dbf2cshannon.woods@transgaming.com // Range of Direct3D samplers of given sampler type 1818233fe9548a2b166d3ccb09a4a7af273fab6dbf2cshannon.woods@transgaming.com int samplerCount = (type == SAMPLER_PIXEL) ? MAX_TEXTURE_IMAGE_UNITS : mRenderer->getMaxVertexTextureImageUnits(); 1819144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org int samplerRange = programBinary->getUsedSamplerRange(type); 1820144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1821144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org for (int samplerIndex = 0; samplerIndex < samplerRange; samplerIndex++) 1822144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1823144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org int textureUnit = programBinary->getSamplerMapping(type, samplerIndex); // OpenGL texture image unit index 1824144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1825144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (textureUnit != -1) 1826144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1827144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org TextureType textureType = programBinary->getSamplerTextureType(type, samplerIndex); 1828144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Texture *texture = getSamplerTexture(textureUnit, textureType); 1829144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 18304b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang if (texture->isSamplerComplete() && 18314b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang boundFramebufferTextures.find(texture->getTextureSerial()) == boundFramebufferTextures.end()) 1832144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1833e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com SamplerState samplerState; 1834e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com texture->getSamplerState(&samplerState); 1835e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com mRenderer->setSamplerState(type, samplerIndex, samplerState); 1836144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1837e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com mRenderer->setTexture(type, samplerIndex, texture); 1838144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1839144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org texture->resetDirty(); 1840144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1841e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com else 1842e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com { 1843e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com mRenderer->setTexture(type, samplerIndex, getIncompleteTexture(textureType)); 1844e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com } 1845144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1846144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 1847144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1848e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com mRenderer->setTexture(type, samplerIndex, NULL); 1849144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1850144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1851144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1852144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org for (int samplerIndex = samplerRange; samplerIndex < samplerCount; samplerIndex++) 1853144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1854e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com mRenderer->setTexture(type, samplerIndex, NULL); 1855144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1856144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1857144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1858144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, 1859144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org GLenum format, GLenum type, GLsizei *bufSize, void* pixels) 1860144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1861144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Framebuffer *framebuffer = getReadFramebuffer(); 1862144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1863144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) 1864144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1865779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION); 1866144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1867144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1868144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0) 1869144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1870779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 1871144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1872144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 18736c87217467896d150743db19e2ed664ceec56785daniel@transgaming.com GLsizei outputPitch = ComputePitch(width, ConvertSizedInternalFormat(format, type), getPackAlignment()); 1874144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // sized query sanity check 1875144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (bufSize) 1876144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1877144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org int requiredSize = outputPitch * height; 1878144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (requiredSize > *bufSize) 1879144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1880779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 1881144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1882144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1883144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 18846c87217467896d150743db19e2ed664ceec56785daniel@transgaming.com mRenderer->readPixels(framebuffer, x, y, width, height, format, type, outputPitch, getPackReverseRowOrder(), getPackAlignment(), pixels); 1885144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1886144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1887144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::clear(GLbitfield mask) 1888144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1889144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Framebuffer *framebufferObject = getDrawFramebuffer(); 1890144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1891144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE) 1892144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1893779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION); 1894144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1895144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1896144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org DWORD flags = 0; 1897084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com GLbitfield finalMask = 0; 1898144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1899144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mask & GL_COLOR_BUFFER_BIT) 1900144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1901144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mask &= ~GL_COLOR_BUFFER_BIT; 1902144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 190305337ea75360973510d5866ea39ce6760331cda6shannon.woods%transgaming.com@gtempaccount.com if (framebufferObject->hasEnabledColorAttachment()) 1904144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1905084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com finalMask |= GL_COLOR_BUFFER_BIT; 1906144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1907144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1908144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1909144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mask & GL_DEPTH_BUFFER_BIT) 1910144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1911144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mask &= ~GL_DEPTH_BUFFER_BIT; 1912f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com if (mState.depthStencil.depthMask && framebufferObject->getDepthbufferType() != GL_NONE) 1913144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1914084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com finalMask |= GL_DEPTH_BUFFER_BIT; 1915144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1916144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1917144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1918144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mask & GL_STENCIL_BUFFER_BIT) 1919144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1920144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mask &= ~GL_STENCIL_BUFFER_BIT; 1921144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (framebufferObject->getStencilbufferType() != GL_NONE) 1922144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1923d62d7142cbb5f20ece211d292192f88db6979b86daniel@transgaming.com rx::RenderTarget *depthStencil = framebufferObject->getStencilbuffer()->getDepthStencil(); 1924144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (!depthStencil) 1925144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1926144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org ERR("Depth stencil pointer unexpectedly null."); 1927144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return; 1928144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1929144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 19302c1d0abe5d8bce9dfb1d093bcc3564a15b36e990daniel@transgaming.com if (GetStencilSize(depthStencil->getActualFormat()) > 0) 1931144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1932084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com finalMask |= GL_STENCIL_BUFFER_BIT; 1933144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1934144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1935144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1936144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1937144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mask != 0) 1938144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1939779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_VALUE); 1940144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1941144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 19421298518804934fac7f8ecd37ad58a5ac100cff36daniel@transgaming.com if (!applyRenderTarget(GL_TRIANGLES, true)) // Clips the clear to the scissor rectangle but not the viewport 1943144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1944144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return; 1945144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1946144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1947084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com ClearParameters clearParams; 1948084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com clearParams.mask = finalMask; 1949084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com clearParams.colorClearValue = mState.colorClearValue; 1950084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com clearParams.colorMaskRed = mState.blend.colorMaskRed; 1951084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com clearParams.colorMaskGreen = mState.blend.colorMaskGreen; 1952084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com clearParams.colorMaskBlue = mState.blend.colorMaskBlue; 1953084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com clearParams.colorMaskAlpha = mState.blend.colorMaskAlpha; 1954084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com clearParams.depthClearValue = mState.depthClearValue; 1955084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com clearParams.stencilClearValue = mState.stencilClearValue; 1956084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com clearParams.stencilWriteMask = mState.depthStencil.stencilWritemask; 1957084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com 1958084a257ef7455c230fef3b3bc0cdeced4cabb1acdaniel@transgaming.com mRenderer->clear(clearParams, framebufferObject); 1959144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 1960144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1961144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instances) 1962144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 1963144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (!mState.currentProgram) 1964144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1965779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 1966144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1967144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 196891207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com if (!mRenderer->applyPrimitiveType(mode, count)) 1969144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1970144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return; 1971144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1972144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 19731298518804934fac7f8ecd37ad58a5ac100cff36daniel@transgaming.com if (!applyRenderTarget(mode, false)) 1974144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1975144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return; 1976144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1977144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1978144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org applyState(mode); 1979144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 198092025f562d428f90f2df96913e18ec0dc1bfb060daniel@transgaming.com ProgramBinary *programBinary = getCurrentProgramBinary(); 198192025f562d428f90f2df96913e18ec0dc1bfb060daniel@transgaming.com 198291207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com GLenum err = mRenderer->applyVertexBuffer(programBinary, mState.vertexAttribute, first, count, instances); 1983144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (err != GL_NO_ERROR) 1984144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1985779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(err); 1986144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1987144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1988144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org applyShaders(); 1989144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org applyTextures(); 1990144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 199192025f562d428f90f2df96913e18ec0dc1bfb060daniel@transgaming.com if (!programBinary->validateSamplers(NULL)) 1992144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 1993779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 1994144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 1995144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 1996087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com if (!skipDraw(mode)) 1997144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 199891207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com mRenderer->drawArrays(mode, count, instances); 1999144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2000144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2001144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2002144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instances) 2003144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2004144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (!mState.currentProgram) 2005144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2006779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 2007144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2008144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2009144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (!indices && !mState.elementArrayBuffer) 2010144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2011779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 2012144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 201391207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com 201491207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com if (!mRenderer->applyPrimitiveType(mode, count)) 2015144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2016144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return; 2017144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2018144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 20191298518804934fac7f8ecd37ad58a5ac100cff36daniel@transgaming.com if (!applyRenderTarget(mode, false)) 2020144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2021144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return; 2022144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2023144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2024144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org applyState(mode); 2025144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2026312404870905e1eff46e21632c1c2f2143af4694daniel@transgaming.com rx::TranslatedIndexData indexInfo; 202791207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com GLenum err = mRenderer->applyIndexBuffer(indices, mState.elementArrayBuffer.get(), count, mode, type, &indexInfo); 2028144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (err != GL_NO_ERROR) 2029144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2030779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(err); 2031144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2032144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 203392025f562d428f90f2df96913e18ec0dc1bfb060daniel@transgaming.com ProgramBinary *programBinary = getCurrentProgramBinary(); 203492025f562d428f90f2df96913e18ec0dc1bfb060daniel@transgaming.com 2035144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org GLsizei vertexCount = indexInfo.maxIndex - indexInfo.minIndex + 1; 203691207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com err = mRenderer->applyVertexBuffer(programBinary, mState.vertexAttribute, indexInfo.minIndex, vertexCount, instances); 2037144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (err != GL_NO_ERROR) 2038144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2039779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(err); 2040144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2041144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2042144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org applyShaders(); 2043144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org applyTextures(); 2044144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 204592025f562d428f90f2df96913e18ec0dc1bfb060daniel@transgaming.com if (!programBinary->validateSamplers(NULL)) 2046144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2047779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 2048144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2049144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2050087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com if (!skipDraw(mode)) 2051144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 205200032cb2c77dfe812dda092ecfd938e66dce7f3cshannon.woods@transgaming.com mRenderer->drawElements(mode, count, type, indices, mState.elementArrayBuffer.get(), indexInfo, instances); 2053144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2054144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2055144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2056144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Implements glFlush when block is false, glFinish when block is true 2057144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::sync(bool block) 2058144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2059ef21ab295564e9577d30fb389eec67ca71b42be1daniel@transgaming.com mRenderer->sync(block); 2060144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2061144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2062144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::recordInvalidEnum() 2063144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2064144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mInvalidEnum = true; 2065144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2066144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2067144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::recordInvalidValue() 2068144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2069144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mInvalidValue = true; 2070144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2071144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2072144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::recordInvalidOperation() 2073144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2074144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mInvalidOperation = true; 2075144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2076144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2077144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::recordOutOfMemory() 2078144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2079144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mOutOfMemory = true; 2080144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2081144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2082144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::recordInvalidFramebufferOperation() 2083144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2084144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mInvalidFramebufferOperation = true; 2085144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2086144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2087144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Get one of the recorded errors and clear its flag, if any. 2088144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// [OpenGL ES 2.0.24] section 2.5 page 13. 2089144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLenum Context::getError() 2090144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2091144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mInvalidEnum) 2092144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2093144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mInvalidEnum = false; 2094144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2095144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return GL_INVALID_ENUM; 2096144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2097144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2098144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mInvalidValue) 2099144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2100144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mInvalidValue = false; 2101144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2102144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return GL_INVALID_VALUE; 2103144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2104144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2105144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mInvalidOperation) 2106144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2107144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mInvalidOperation = false; 2108144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2109144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return GL_INVALID_OPERATION; 2110144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2111144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2112144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mOutOfMemory) 2113144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2114144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mOutOfMemory = false; 2115144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2116144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return GL_OUT_OF_MEMORY; 2117144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2118144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2119144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mInvalidFramebufferOperation) 2120144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2121144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mInvalidFramebufferOperation = false; 2122144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2123144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return GL_INVALID_FRAMEBUFFER_OPERATION; 2124144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2125144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2126144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return GL_NO_ERROR; 2127144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2128144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2129144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLenum Context::getResetStatus() 2130144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2131ddd6c80eaf97858d74d2e2effca558051fac5481shannon.woods@transgaming.com if (mResetStatus == GL_NO_ERROR && !mContextLost) 2132144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2133f688c0d18c25940336d83e37befe76ead2844962daniel@transgaming.com // mResetStatus will be set by the markContextLost callback 2134f688c0d18c25940336d83e37befe76ead2844962daniel@transgaming.com // in the case a notification is sent 2135f688c0d18c25940336d83e37befe76ead2844962daniel@transgaming.com mRenderer->testDeviceLost(true); 2136144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2137144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2138144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org GLenum status = mResetStatus; 2139144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2140144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mResetStatus != GL_NO_ERROR) 2141144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2142ddd6c80eaf97858d74d2e2effca558051fac5481shannon.woods@transgaming.com ASSERT(mContextLost); 2143ddd6c80eaf97858d74d2e2effca558051fac5481shannon.woods@transgaming.com 2144621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com if (mRenderer->testDeviceResettable()) 2145144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2146144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mResetStatus = GL_NO_ERROR; 2147144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2148144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2149144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2150144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return status; 2151144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2152144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2153144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::isResetNotificationEnabled() 2154144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2155144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT); 2156144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2157144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 21589549bead5dc8bb07a21296ea8bea97939285c699daniel@transgaming.comint Context::getMajorShaderModel() const 2159144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 21609549bead5dc8bb07a21296ea8bea97939285c699daniel@transgaming.com return mMajorShaderModel; 2161144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2162144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2163144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgfloat Context::getMaximumPointSize() const 2164144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2165bd8c10c4d0ba4c7803e2013a873ffaa48f54f496shannon.woods@transgaming.com return mMaximumPointSize; 2166144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2167144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2168144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgunsigned int Context::getMaximumCombinedTextureImageUnits() const 2169144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 217076cd88c5a67c14da7f4e0a7a6491297e3fb49bcbshannon.woods@transgaming.com return mRenderer->getMaxCombinedTextureImageUnits(); 2171144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2172144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2173144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgint Context::getMaxSupportedSamples() const 2174144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2175b783398c958b225cc30f63de12eeb9ef207b025adaniel@transgaming.com return mRenderer->getMaxSupportedSamples(); 2176144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2177144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 217827d3752c560bde4ecb538ec14cc85f300615445bshannon.woods%transgaming.com@gtempaccount.comunsigned int Context::getMaximumRenderTargets() const 217927d3752c560bde4ecb538ec14cc85f300615445bshannon.woods%transgaming.com@gtempaccount.com{ 218027d3752c560bde4ecb538ec14cc85f300615445bshannon.woods%transgaming.com@gtempaccount.com return mRenderer->getMaxRenderTargets(); 218127d3752c560bde4ecb538ec14cc85f300615445bshannon.woods%transgaming.com@gtempaccount.com} 218227d3752c560bde4ecb538ec14cc85f300615445bshannon.woods%transgaming.com@gtempaccount.com 2183144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsEventQueries() const 2184144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2185144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsEventQueries; 2186144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2187144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2188144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsOcclusionQueries() const 2189144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2190144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsOcclusionQueries; 2191144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2192144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2193bec04bf43b2603f33a84c6eb6b6fa4b13ad10161shannon.woods@transgaming.combool Context::supportsBGRATextures() const 2194bec04bf43b2603f33a84c6eb6b6fa4b13ad10161shannon.woods@transgaming.com{ 2195bec04bf43b2603f33a84c6eb6b6fa4b13ad10161shannon.woods@transgaming.com return mSupportsBGRATextures; 2196bec04bf43b2603f33a84c6eb6b6fa4b13ad10161shannon.woods@transgaming.com} 2197bec04bf43b2603f33a84c6eb6b6fa4b13ad10161shannon.woods@transgaming.com 2198144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsDXT1Textures() const 2199144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2200144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsDXT1Textures; 2201144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2202144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2203144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsDXT3Textures() const 2204144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2205144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsDXT3Textures; 2206144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2207144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2208144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsDXT5Textures() const 2209144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2210144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsDXT5Textures; 2211144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2212144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2213144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsFloat32Textures() const 2214144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2215144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsFloat32Textures; 2216144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2217144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2218144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsFloat32LinearFilter() const 2219144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2220144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsFloat32LinearFilter; 2221144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2222144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2223144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsFloat32RenderableTextures() const 2224144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2225144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsFloat32RenderableTextures; 2226144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2227144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2228144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsFloat16Textures() const 2229144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2230144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsFloat16Textures; 2231144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2232144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2233144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsFloat16LinearFilter() const 2234144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2235144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsFloat16LinearFilter; 2236144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2237144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2238144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsFloat16RenderableTextures() const 2239144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2240144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsFloat16RenderableTextures; 2241144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2242144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2243144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgint Context::getMaximumRenderbufferDimension() const 2244144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2245144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mMaxRenderbufferDimension; 2246144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2247144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2248144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgint Context::getMaximumTextureDimension() const 2249144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2250144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mMaxTextureDimension; 2251144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2252144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2253144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgint Context::getMaximumCubeTextureDimension() const 2254144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2255144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mMaxCubeTextureDimension; 2256144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2257144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2258144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgint Context::getMaximumTextureLevel() const 2259144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2260144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mMaxTextureLevel; 2261144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2262144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2263144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsLuminanceTextures() const 2264144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2265144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsLuminanceTextures; 2266144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2267144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2268144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsLuminanceAlphaTextures() const 2269144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2270144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsLuminanceAlphaTextures; 2271144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2272144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2273144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsDepthTextures() const 2274144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2275144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsDepthTextures; 2276144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2277144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2278144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supports32bitIndices() const 2279144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2280144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupports32bitIndices; 2281144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2282144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2283144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsNonPower2Texture() const 2284144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2285144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsNonPower2Texture; 2286144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2287144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2288144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::supportsInstancing() const 2289144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2290144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return mSupportsInstancing; 2291144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2292144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 229307ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.combool Context::supportsTextureFilterAnisotropy() const 229407ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com{ 229507ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com return mSupportsTextureFilterAnisotropy; 229607ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com} 229707ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com 229807ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.comfloat Context::getTextureMaxAnisotropy() const 229907ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com{ 230007ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com return mMaxTextureAnisotropy; 230107ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com} 230207ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com 230342944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.combool Context::getCurrentReadFormatType(GLenum *format, GLenum *type) 230442944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com{ 230542944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com Framebuffer *framebuffer = getReadFramebuffer(); 230642944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com if (!framebuffer || framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) 230742944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com { 2308779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION, false); 230942944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com } 231042944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com 231127d3752c560bde4ecb538ec14cc85f300615445bshannon.woods%transgaming.com@gtempaccount.com Renderbuffer *renderbuffer = framebuffer->getReadColorbuffer(); 231242944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com if (!renderbuffer) 231342944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com { 2314779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION, false); 231542944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com } 231642944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com 231720d36667199abc703cddff58ebdfd5eef726a51cdaniel@transgaming.com *format = gl::ExtractFormat(renderbuffer->getActualFormat()); 231820d36667199abc703cddff58ebdfd5eef726a51cdaniel@transgaming.com *type = gl::ExtractType(renderbuffer->getActualFormat()); 231942944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com 232042944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com return true; 232142944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com} 232242944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com 2323144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::detachBuffer(GLuint buffer) 2324144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2325144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // [OpenGL ES 2.0.24] section 2.9 page 22: 2326144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // If a buffer object is deleted while it is bound, all bindings to that object in the current context 2327144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // (i.e. in the thread that called Delete-Buffers) are reset to zero. 2328144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2329144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mState.arrayBuffer.id() == buffer) 2330144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2331144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.arrayBuffer.set(NULL); 2332144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2333144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2334144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mState.elementArrayBuffer.id() == buffer) 2335144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2336144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.elementArrayBuffer.set(NULL); 2337144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2338144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2339144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org for (int attribute = 0; attribute < MAX_VERTEX_ATTRIBS; attribute++) 2340144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2341144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mState.vertexAttribute[attribute].mBoundBuffer.id() == buffer) 2342144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2343144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[attribute].mBoundBuffer.set(NULL); 2344144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2345144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2346144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2347144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2348144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::detachTexture(GLuint texture) 2349144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2350144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // [OpenGL ES 2.0.24] section 3.8 page 84: 2351144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // If a texture object is deleted, it is as if all texture units which are bound to that texture object are 2352144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // rebound to texture object zero 2353144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2354144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org for (int type = 0; type < TEXTURE_TYPE_COUNT; type++) 2355144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2356233fe9548a2b166d3ccb09a4a7af273fab6dbf2cshannon.woods@transgaming.com for (int sampler = 0; sampler < IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++) 2357144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2358144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mState.samplerTexture[type][sampler].id() == texture) 2359144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2360144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.samplerTexture[type][sampler].set(NULL); 2361144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2362144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2363144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2364144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2365144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // [OpenGL ES 2.0.24] section 4.4 page 112: 2366144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is 2367144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // as if FramebufferTexture2D had been called, with a texture of 0, for each attachment point to which this 2368144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // image was attached in the currently bound framebuffer. 2369144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2370144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Framebuffer *readFramebuffer = getReadFramebuffer(); 2371144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Framebuffer *drawFramebuffer = getDrawFramebuffer(); 2372144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2373144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (readFramebuffer) 2374144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2375144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org readFramebuffer->detachTexture(texture); 2376144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2377144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2378144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (drawFramebuffer && drawFramebuffer != readFramebuffer) 2379144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2380144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org drawFramebuffer->detachTexture(texture); 2381144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2382144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2383144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2384144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::detachFramebuffer(GLuint framebuffer) 2385144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2386144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // [OpenGL ES 2.0.24] section 4.4 page 107: 2387144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though 2388144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero. 2389144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2390144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mState.readFramebuffer == framebuffer) 2391144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2392144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org bindReadFramebuffer(0); 2393144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2394144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2395144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mState.drawFramebuffer == framebuffer) 2396144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2397144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org bindDrawFramebuffer(0); 2398144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2399144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2400144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2401144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::detachRenderbuffer(GLuint renderbuffer) 2402144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2403144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // [OpenGL ES 2.0.24] section 4.4 page 109: 2404144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though BindRenderbuffer 2405144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // had been executed with the target RENDERBUFFER and name of zero. 2406144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2407144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mState.renderbuffer.id() == renderbuffer) 2408144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2409144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org bindRenderbuffer(0); 2410144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2411144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2412144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // [OpenGL ES 2.0.24] section 4.4 page 111: 2413144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // If a renderbuffer object is deleted while its image is attached to the currently bound framebuffer, 2414144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment 2415144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // point to which this image was attached in the currently bound framebuffer. 2416144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2417144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Framebuffer *readFramebuffer = getReadFramebuffer(); 2418144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Framebuffer *drawFramebuffer = getDrawFramebuffer(); 2419144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2420144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (readFramebuffer) 2421144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2422144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org readFramebuffer->detachRenderbuffer(renderbuffer); 2423144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2424144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2425144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (drawFramebuffer && drawFramebuffer != readFramebuffer) 2426144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2427144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org drawFramebuffer->detachRenderbuffer(renderbuffer); 2428144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2429144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2430144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2431144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgTexture *Context::getIncompleteTexture(TextureType type) 2432144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2433144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Texture *t = mIncompleteTextures[type].get(); 2434144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2435144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (t == NULL) 2436144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2437144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org static const GLubyte color[] = { 0, 0, 0, 255 }; 2438144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2439144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org switch (type) 2440144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2441144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org default: 2442144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org UNREACHABLE(); 2443144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // default falls through to TEXTURE_2D 2444144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2445144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case TEXTURE_2D: 2446144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2447370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com Texture2D *incomplete2d = new Texture2D(mRenderer, Texture::INCOMPLETE_TEXTURE_ID); 2448144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org incomplete2d->setImage(0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, color); 2449144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org t = incomplete2d; 2450144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2451144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 2452144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2453144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org case TEXTURE_CUBE: 2454144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2455370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com TextureCubeMap *incompleteCube = new TextureCubeMap(mRenderer, Texture::INCOMPLETE_TEXTURE_ID); 2456144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2457144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org incompleteCube->setImagePosX(0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, color); 2458144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org incompleteCube->setImageNegX(0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, color); 2459144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org incompleteCube->setImagePosY(0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, color); 2460144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org incompleteCube->setImageNegY(0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, color); 2461144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org incompleteCube->setImagePosZ(0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, color); 2462144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org incompleteCube->setImageNegZ(0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, color); 2463144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2464144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org t = incompleteCube; 2465144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2466144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org break; 2467144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2468144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2469144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mIncompleteTextures[type].set(t); 2470144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2471144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2472144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return t; 2473144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2474144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2475087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.combool Context::skipDraw(GLenum drawMode) 2476144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2477087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com if (drawMode == GL_POINTS) 2478087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com { 2479087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com // ProgramBinary assumes non-point rendering if gl_PointSize isn't written, 2480087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com // which affects varying interpolation. Since the value of gl_PointSize is 2481087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com // undefined when not written, just skip drawing to avoid unexpected results. 2482087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com if (!getCurrentProgramBinary()->usesPointSize()) 2483087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com { 2484087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com // This is stictly speaking not an error, but developers should be 2485087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com // notified of risking undefined behavior. 2486087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com ERR("Point rendering without writing to gl_PointSize."); 2487087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com 2488087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com return true; 2489087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com } 2490087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com } 249197c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com else if (IsTriangleMode(drawMode)) 2492087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com { 2493f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com if (mState.rasterizer.cullFace && mState.rasterizer.cullMode == GL_FRONT_AND_BACK) 2494087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com { 2495087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com return true; 2496087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com } 2497087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com } 2498087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com 2499087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com return false; 2500144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2501144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2502144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setVertexAttrib(GLuint index, const GLfloat *values) 2503144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2504144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org ASSERT(index < gl::MAX_VERTEX_ATTRIBS); 2505144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2506144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[index].mCurrentValue[0] = values[0]; 2507144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[index].mCurrentValue[1] = values[1]; 2508144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[index].mCurrentValue[2] = values[2]; 2509144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[index].mCurrentValue[3] = values[3]; 2510144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2511144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2512144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setVertexAttribDivisor(GLuint index, GLuint divisor) 2513144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2514144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org ASSERT(index < gl::MAX_VERTEX_ATTRIBS); 2515144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2516144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org mState.vertexAttribute[index].mDivisor = divisor; 2517144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2518144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2519144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// keep list sorted in following order 2520144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// OES extensions 2521144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// EXT extensions 2522144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Vendor extensions 2523144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::initExtensionString() 2524144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2525ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com std::string extensionString = ""; 2526144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2527144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // OES extensions 2528144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supports32bitIndices()) 2529144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2530ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_OES_element_index_uint "; 2531144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2532144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2533ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_OES_packed_depth_stencil "; 2534ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_OES_get_program_binary "; 2535ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_OES_rgb8_rgba8 "; 253676cd88c5a67c14da7f4e0a7a6491297e3fb49bcbshannon.woods@transgaming.com if (mRenderer->getDerivativeInstructionSupport()) 25377629bb6c10907e6aae1710eafd15306d43c1840edaniel@transgaming.com { 2538ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_OES_standard_derivatives "; 25397629bb6c10907e6aae1710eafd15306d43c1840edaniel@transgaming.com } 2540144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2541144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsFloat16Textures()) 2542144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2543ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_OES_texture_half_float "; 2544144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2545144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsFloat16LinearFilter()) 2546144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2547ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_OES_texture_half_float_linear "; 2548144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2549144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsFloat32Textures()) 2550144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2551ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_OES_texture_float "; 2552144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2553144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsFloat32LinearFilter()) 2554144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2555ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_OES_texture_float_linear "; 2556144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2557144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2558144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsNonPower2Texture()) 2559144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2560ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_OES_texture_npot "; 2561144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2562144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2563144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // Multi-vendor (EXT) extensions 2564144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsOcclusionQueries()) 2565144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2566ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_EXT_occlusion_query_boolean "; 2567144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2568144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2569ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_EXT_read_format_bgra "; 2570ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_EXT_robustness "; 2571144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2572144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsDXT1Textures()) 2573144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2574ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_EXT_texture_compression_dxt1 "; 2575144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2576144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 257707ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com if (supportsTextureFilterAnisotropy()) 257807ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com { 2579ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_EXT_texture_filter_anisotropic "; 258007ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com } 258107ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com 2582bec04bf43b2603f33a84c6eb6b6fa4b13ad10161shannon.woods@transgaming.com if (supportsBGRATextures()) 2583bec04bf43b2603f33a84c6eb6b6fa4b13ad10161shannon.woods@transgaming.com { 2584bec04bf43b2603f33a84c6eb6b6fa4b13ad10161shannon.woods@transgaming.com extensionString += "GL_EXT_texture_format_BGRA8888 "; 2585bec04bf43b2603f33a84c6eb6b6fa4b13ad10161shannon.woods@transgaming.com } 2586bec04bf43b2603f33a84c6eb6b6fa4b13ad10161shannon.woods@transgaming.com 258742767a03b63e4d37c9d735b040ba36c8eb6282bashannon.woods%transgaming.com@gtempaccount.com if (mRenderer->getMaxRenderTargets() > 1) 258842767a03b63e4d37c9d735b040ba36c8eb6282bashannon.woods%transgaming.com@gtempaccount.com { 258942767a03b63e4d37c9d735b040ba36c8eb6282bashannon.woods%transgaming.com@gtempaccount.com extensionString += "GL_EXT_draw_buffers "; 259042767a03b63e4d37c9d735b040ba36c8eb6282bashannon.woods%transgaming.com@gtempaccount.com } 259142767a03b63e4d37c9d735b040ba36c8eb6282bashannon.woods%transgaming.com@gtempaccount.com 2592ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_EXT_texture_storage "; 259338fee6f1956ec0c5cb1eecfb2ae165f378cfbed9bajones@chromium.org extensionString += "GL_EXT_frag_depth "; 2594144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2595144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // ANGLE-specific extensions 2596144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsDepthTextures()) 2597144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2598ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_ANGLE_depth_texture "; 2599144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2600144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2601ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_ANGLE_framebuffer_blit "; 2602144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (getMaxSupportedSamples() != 0) 2603144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2604ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_ANGLE_framebuffer_multisample "; 2605144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2606144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2607144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsInstancing()) 2608144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2609ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_ANGLE_instanced_arrays "; 2610144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2611144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2612ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_ANGLE_pack_reverse_row_order "; 2613144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2614144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsDXT3Textures()) 2615144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2616ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_ANGLE_texture_compression_dxt3 "; 2617144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2618144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsDXT5Textures()) 2619144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2620ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_ANGLE_texture_compression_dxt5 "; 2621144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2622144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2623ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_ANGLE_texture_usage "; 2624ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_ANGLE_translated_shader_source "; 2625144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2626144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // Other vendor-specific extensions 2627144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (supportsEventQueries()) 2628144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2629ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString += "GL_NV_fence "; 2630144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2631144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2632ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com std::string::size_type end = extensionString.find_last_not_of(' '); 2633144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (end != std::string::npos) 2634144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2635ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com extensionString.resize(end+1); 2636144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2637ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com 2638ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com mExtensionString = makeStaticString(extensionString); 2639144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2640144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2641144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgconst char *Context::getExtensionString() const 2642144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2643ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com return mExtensionString; 2644144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2645144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2646144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::initRendererString() 2647144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2648ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com std::ostringstream rendererString; 2649ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com rendererString << "ANGLE ("; 2650ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com rendererString << mRenderer->getRendererDescription(); 2651ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com rendererString << ")"; 2652ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com 2653ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com mRendererString = makeStaticString(rendererString.str()); 2654144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2655144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2656144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgconst char *Context::getRendererString() const 2657144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2658ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com return mRendererString; 2659144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2660144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 26614b48845f74fb54052a6b693c62d269d0952d4289Geoff LangContext::FramebufferTextureSerialSet Context::getBoundFramebufferTextureSerials() 26624b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang{ 26634b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang FramebufferTextureSerialSet set; 26644b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang 26654b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang Framebuffer *drawFramebuffer = getDrawFramebuffer(); 26664b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang for (unsigned int i = 0; i < IMPLEMENTATION_MAX_DRAW_BUFFERS; i++) 26674b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang { 26684b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang Renderbuffer *renderBuffer = drawFramebuffer->getColorbuffer(i); 26694b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang if (renderBuffer && renderBuffer->getTextureSerial() != 0) 26704b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang { 26714b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang set.insert(renderBuffer->getTextureSerial()); 26724b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang } 26734b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang } 26744b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang 26754b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang Renderbuffer *depthStencilBuffer = drawFramebuffer->getDepthOrStencilbuffer(); 26764b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang if (depthStencilBuffer && depthStencilBuffer->getTextureSerial() != 0) 26774b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang { 26784b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang set.insert(depthStencilBuffer->getTextureSerial()); 26794b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang } 26804b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang 26814b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang return set; 26824b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang} 26834b48845f74fb54052a6b693c62d269d0952d4289Geoff Lang 2684144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, 2685144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, 2686144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org GLbitfield mask) 2687144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2688144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Framebuffer *readFramebuffer = getReadFramebuffer(); 2689144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Framebuffer *drawFramebuffer = getDrawFramebuffer(); 2690144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2691144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (!readFramebuffer || readFramebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE || 2692144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org !drawFramebuffer || drawFramebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) 2693144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2694779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION); 2695144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2696144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2697144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (drawFramebuffer->getSamples() != 0) 2698144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2699779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 2700144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2701144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 270225c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com Renderbuffer *readColorBuffer = readFramebuffer->getReadColorbuffer(); 2703acf735f54c291de6894ae37d200bb70c2cf91eebshannon.woods%transgaming.com@gtempaccount.com Renderbuffer *drawColorBuffer = drawFramebuffer->getFirstColorbuffer(); 270425c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com 270525c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com if (drawColorBuffer == NULL) 270625c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com { 270725c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com ERR("Draw buffers formats don't match, which is not supported in this implementation of BlitFramebufferANGLE"); 270825c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com return gl::error(GL_INVALID_OPERATION); 270925c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com } 271025c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com 271125c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com int readBufferWidth = readColorBuffer->getWidth(); 271225c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com int readBufferHeight = readColorBuffer->getHeight(); 271325c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com int drawBufferWidth = drawColorBuffer->getWidth(); 271425c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com int drawBufferHeight = drawColorBuffer->getHeight(); 2715144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 271648ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com Rectangle sourceRect; 271748ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com Rectangle destRect; 2718144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2719144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (srcX0 < srcX1) 2720144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 272148ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceRect.x = srcX0; 272248ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destRect.x = dstX0; 272348ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceRect.width = srcX1 - srcX0; 272448ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destRect.width = dstX1 - dstX0; 2725144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2726144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 2727144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 272848ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceRect.x = srcX1; 272948ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destRect.x = dstX1; 273048ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceRect.width = srcX0 - srcX1; 273148ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destRect.width = dstX0 - dstX1; 2732144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2733144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2734144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (srcY0 < srcY1) 2735144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 273648ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceRect.height = srcY1 - srcY0; 273748ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destRect.height = dstY1 - dstY0; 273848ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceRect.y = srcY0; 273948ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destRect.y = dstY0; 2740144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2741144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org else 2742144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 274348ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceRect.height = srcY0 - srcY1; 274448ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destRect.height = dstY0 - srcY1; 274548ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceRect.y = srcY1; 274648ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destRect.y = dstY1; 2747144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2748144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 274948ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com Rectangle sourceScissoredRect = sourceRect; 275048ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com Rectangle destScissoredRect = destRect; 2751144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2752d55e8c1b48f16f93cb89798fc3640047eb74d3fddaniel@transgaming.com if (mState.scissorTest) 2753144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 275448ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com // Only write to parts of the destination framebuffer which pass the scissor test. 275548ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com if (destRect.x < mState.scissor.x) 2756144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 275748ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com int xDiff = mState.scissor.x - destRect.x; 275848ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destScissoredRect.x = mState.scissor.x; 275948ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destScissoredRect.width -= xDiff; 276048ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceScissoredRect.x += xDiff; 276148ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceScissoredRect.width -= xDiff; 276248ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com 2763144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2764144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 276548ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com if (destRect.x + destRect.width > mState.scissor.x + mState.scissor.width) 2766144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 276748ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com int xDiff = (destRect.x + destRect.width) - (mState.scissor.x + mState.scissor.width); 276848ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destScissoredRect.width -= xDiff; 276948ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceScissoredRect.width -= xDiff; 2770144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2771144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 277248ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com if (destRect.y < mState.scissor.y) 2773144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 277448ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com int yDiff = mState.scissor.y - destRect.y; 277548ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destScissoredRect.y = mState.scissor.y; 277648ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destScissoredRect.height -= yDiff; 277748ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceScissoredRect.y += yDiff; 277848ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceScissoredRect.height -= yDiff; 2779144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2780144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 278148ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com if (destRect.y + destRect.height > mState.scissor.y + mState.scissor.height) 2782144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 278348ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com int yDiff = (destRect.y + destRect.height) - (mState.scissor.y + mState.scissor.height); 278448ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destScissoredRect.height -= yDiff; 278548ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceScissoredRect.height -= yDiff; 2786144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2787144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2788144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2789144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org bool blitRenderTarget = false; 2790144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org bool blitDepthStencil = false; 2791144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 279248ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com Rectangle sourceTrimmedRect = sourceScissoredRect; 279348ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com Rectangle destTrimmedRect = destScissoredRect; 2794144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2795144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // The source & destination rectangles also may need to be trimmed if they fall out of the bounds of 2796144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // the actual draw and read surfaces. 279748ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com if (sourceTrimmedRect.x < 0) 2798144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 279948ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com int xDiff = 0 - sourceTrimmedRect.x; 280048ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.x = 0; 280148ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.width -= xDiff; 280248ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.x += xDiff; 280348ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.width -= xDiff; 2804144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2805144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 280648ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com if (sourceTrimmedRect.x + sourceTrimmedRect.width > readBufferWidth) 2807144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 280848ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com int xDiff = (sourceTrimmedRect.x + sourceTrimmedRect.width) - readBufferWidth; 280948ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.width -= xDiff; 281048ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.width -= xDiff; 2811144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2812144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 281348ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com if (sourceTrimmedRect.y < 0) 2814144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 281548ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com int yDiff = 0 - sourceTrimmedRect.y; 281648ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.y = 0; 281748ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.height -= yDiff; 281848ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.y += yDiff; 281948ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.height -= yDiff; 2820144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2821144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 282248ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com if (sourceTrimmedRect.y + sourceTrimmedRect.height > readBufferHeight) 2823144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 282448ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com int yDiff = (sourceTrimmedRect.y + sourceTrimmedRect.height) - readBufferHeight; 282548ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.height -= yDiff; 282648ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.height -= yDiff; 2827144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2828144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 282948ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com if (destTrimmedRect.x < 0) 2830144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 283148ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com int xDiff = 0 - destTrimmedRect.x; 283248ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.x = 0; 283348ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.width -= xDiff; 283448ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.x += xDiff; 283548ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.width -= xDiff; 2836144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2837144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 283848ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com if (destTrimmedRect.x + destTrimmedRect.width > drawBufferWidth) 2839144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 284048ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com int xDiff = (destTrimmedRect.x + destTrimmedRect.width) - drawBufferWidth; 284148ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.width -= xDiff; 284248ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.width -= xDiff; 2843144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2844144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 284548ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com if (destTrimmedRect.y < 0) 2846144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 284748ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com int yDiff = 0 - destTrimmedRect.y; 284848ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.y = 0; 284948ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.height -= yDiff; 285048ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.y += yDiff; 285148ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.height -= yDiff; 2852144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2853144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 285448ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com if (destTrimmedRect.y + destTrimmedRect.height > drawBufferHeight) 2855144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 285648ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com int yDiff = (destTrimmedRect.y + destTrimmedRect.height) - drawBufferHeight; 285748ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.height -= yDiff; 285848ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.height -= yDiff; 2859144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2860144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2861144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org bool partialBufferCopy = false; 286248ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com if (sourceTrimmedRect.height < readBufferHeight || 286348ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.width < readBufferWidth || 286448ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.height < drawBufferHeight || 286548ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com destTrimmedRect.width < drawBufferWidth || 286648ab81ce00afc6e93aaf964dd2b6cc4d854296a7daniel@transgaming.com sourceTrimmedRect.y != 0 || destTrimmedRect.y != 0 || sourceTrimmedRect.x != 0 || destTrimmedRect.x != 0) 2867144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2868144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org partialBufferCopy = true; 2869144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2870144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2871144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mask & GL_COLOR_BUFFER_BIT) 2872144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 287325c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com const GLenum readColorbufferType = readFramebuffer->getReadColorbufferType(); 287425c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com const bool validReadType = (readColorbufferType == GL_TEXTURE_2D) || (readColorbufferType == GL_RENDERBUFFER); 287525c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com bool validDrawType = true; 287625c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com bool validDrawFormat = true; 287725c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com 287825c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com for (unsigned int colorAttachment = 0; colorAttachment < gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; colorAttachment++) 287925c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com { 288025c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com if (drawFramebuffer->isEnabledColorAttachment(colorAttachment)) 288125c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com { 288225c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com if (drawFramebuffer->getColorbufferType(colorAttachment) != GL_TEXTURE_2D && 288325c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com drawFramebuffer->getColorbufferType(colorAttachment) != GL_RENDERBUFFER) 288425c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com { 288525c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com validDrawType = false; 288625c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com } 288725c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com 288825c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com if (drawFramebuffer->getColorbuffer(colorAttachment)->getActualFormat() != readColorBuffer->getActualFormat()) 288925c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com { 289025c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com validDrawFormat = false; 289125c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com } 289225c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com } 289325c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com } 289425c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com 289525c18808876510452fbe8677a6b3af640e6b3fa1shannon.woods%transgaming.com@gtempaccount.com if (!validReadType || !validDrawType || !validDrawFormat) 2896144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2897144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org ERR("Color buffer format conversion in BlitFramebufferANGLE not supported by this implementation"); 2898779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 2899144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2900144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2901144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (partialBufferCopy && readFramebuffer->getSamples() != 0) 2902144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2903779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 2904144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2905144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2906144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org blitRenderTarget = true; 2907144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2908144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2909144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2910144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) 2911144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2912144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Renderbuffer *readDSBuffer = NULL; 2913144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org Renderbuffer *drawDSBuffer = NULL; 2914144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2915144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // We support OES_packed_depth_stencil, and do not support a separately attached depth and stencil buffer, so if we have 2916144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org // both a depth and stencil buffer, it will be the same buffer. 2917144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2918144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mask & GL_DEPTH_BUFFER_BIT) 2919144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2920144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (readFramebuffer->getDepthbuffer() && drawFramebuffer->getDepthbuffer()) 2921144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2922144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (readFramebuffer->getDepthbufferType() != drawFramebuffer->getDepthbufferType() || 292320d36667199abc703cddff58ebdfd5eef726a51cdaniel@transgaming.com readFramebuffer->getDepthbuffer()->getActualFormat() != drawFramebuffer->getDepthbuffer()->getActualFormat()) 2924144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2925779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 2926144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2927144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2928144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org blitDepthStencil = true; 2929144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org readDSBuffer = readFramebuffer->getDepthbuffer(); 2930144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org drawDSBuffer = drawFramebuffer->getDepthbuffer(); 2931144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2932144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2933144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2934144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (mask & GL_STENCIL_BUFFER_BIT) 2935144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2936144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (readFramebuffer->getStencilbuffer() && drawFramebuffer->getStencilbuffer()) 2937144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2938144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (readFramebuffer->getStencilbufferType() != drawFramebuffer->getStencilbufferType() || 293920d36667199abc703cddff58ebdfd5eef726a51cdaniel@transgaming.com readFramebuffer->getStencilbuffer()->getActualFormat() != drawFramebuffer->getStencilbuffer()->getActualFormat()) 2940144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2941779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 2942144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2943144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2944144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org blitDepthStencil = true; 2945144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org readDSBuffer = readFramebuffer->getStencilbuffer(); 2946144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org drawDSBuffer = drawFramebuffer->getStencilbuffer(); 2947144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2948144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2949144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2950144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (partialBufferCopy) 2951144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2952144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org ERR("Only whole-buffer depth and stencil blits are supported by this implementation."); 2953779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); // only whole-buffer copies are permitted 2954144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2955144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2956144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if ((drawDSBuffer && drawDSBuffer->getSamples() != 0) || 2957144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org (readDSBuffer && readDSBuffer->getSamples() != 0)) 2958144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2959779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 2960144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2961144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2962144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2963144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (blitRenderTarget || blitDepthStencil) 2964144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2965ea4a0c6671ab0b079ed5e0313699742d1c6a9bd1shannon.woods@transgaming.com mRenderer->blitRect(readFramebuffer, sourceTrimmedRect, drawFramebuffer, destTrimmedRect, blitRenderTarget, blitDepthStencil); 2966144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2967144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2968144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2969144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2970144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2971144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgextern "C" 2972144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 297303d390940810e37c00b46178e051a5c0efca6d10daniel@transgaming.comgl::Context *glCreateContext(const gl::Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess) 2974144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 297503d390940810e37c00b46178e051a5c0efca6d10daniel@transgaming.com return new gl::Context(shareContext, renderer, notifyResets, robustAccess); 2976144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2977144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2978144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid glDestroyContext(gl::Context *context) 2979144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2980144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org delete context; 2981144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2982144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org if (context == gl::getContext()) 2983144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org { 2984144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org gl::makeCurrent(NULL, NULL, NULL); 2985144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org } 2986144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2987144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2988144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid glMakeCurrent(gl::Context *context, egl::Display *display, egl::Surface *surface) 2989144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2990144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org gl::makeCurrent(context, display, surface); 2991144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2992144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org 2993144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orggl::Context *glGetCurrentContext() 2994144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{ 2995144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org return gl::getContext(); 2996144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2997621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com 2998144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org} 2999