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