1144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org//
2eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
3144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Use of this source code is governed by a BSD-style license that can be
4144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// found in the LICENSE file.
5144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org//
6144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
7144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// rendering operations. It is the GLES2 specific implementation of EGLContext.
9144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
10144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/Context.h"
11144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
12144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/main.h"
13a2ecfcccf1d1a85e6054a7314ce1f9de0648ac7fshannonwoods@chromium.org#include "common/utilities.h"
140b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include "common/platform.h"
15f6fb959eeacff28579f996e122962ceda8b2845cshannonwoods@chromium.org#include "libGLESv2/formatutils.h"
16144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/Buffer.h"
17144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/Fence.h"
1829ab9525407b2e830341a36a28c6074c94cedce5daniel@transgaming.com#include "libGLESv2/Framebuffer.h"
19e261b44af7631c31ddca8601490e7445af5a3341Jamie Madill#include "libGLESv2/FramebufferAttachment.h"
20486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/Renderbuffer.h"
21144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/Program.h"
22144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/ProgramBinary.h"
23144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/Query.h"
24144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org#include "libGLESv2/Texture.h"
25486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/ResourceManager.h"
26c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/IndexDataManager.h"
27486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/renderer/Renderer.h"
2857a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill#include "libGLESv2/VertexArray.h"
29dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill#include "libGLESv2/Sampler.h"
301fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill#include "libGLESv2/validationES.h"
31c8058451c87ec298683bf484813016b20bf36777Geoff Lang#include "libGLESv2/TransformFeedback.h"
32486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com
33486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libEGL/Surface.h"
34144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
350b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include <sstream>
36144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
37144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgnamespace gl
38144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
39ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com
4053a94a8238621e36e437975e7a17a91cf995aed9Shannon WoodsContext::Context(int clientVersion, const gl::Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess)
4153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    : mRenderer(renderer)
42144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
43144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    ASSERT(robustAccess == false);   // Unimplemented
44144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
45493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    initCaps(clientVersion);
4676b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    mState.initialize(mCaps, clientVersion);
47c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang
48daea4b4584cdbd8c82dd9946eb07a32ab2f278b7shannon.woods%transgaming.com@gtempaccount.com    mClientVersion = clientVersion;
49daea4b4584cdbd8c82dd9946eb07a32ab2f278b7shannon.woods%transgaming.com@gtempaccount.com
5053a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mFenceNVHandleAllocator.setBaseHandle(0);
517dca186668dcce899d5012b1ba73e9187021da5aGeoff Lang
52144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (shareContext != NULL)
53144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
54144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        mResourceManager = shareContext->mResourceManager;
55144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        mResourceManager->addRef();
56144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
57144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    else
58144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
59370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com        mResourceManager = new ResourceManager(mRenderer);
60144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
61144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
62144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // [OpenGL ES 2.0.24] section 3.7 page 83:
63144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have twodimensional
64144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // and cube map texture state vectors respectively associated with them.
65144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // In order that access to these initial textures not be lost, they are treated as texture
66144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // objects all of whose names are 0.
67144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
6876b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    mZeroTextures[GL_TEXTURE_2D].set(new Texture2D(mRenderer->createTexture(GL_TEXTURE_2D), 0));
6976b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    bindTexture(GL_TEXTURE_2D, 0);
7076b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang
7176b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    mZeroTextures[GL_TEXTURE_CUBE_MAP].set(new TextureCubeMap(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), 0));
7276b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    bindTexture(GL_TEXTURE_CUBE_MAP, 0);
7376b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang
7476b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    if (mClientVersion >= 3)
7576b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    {
7676b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        // TODO: These could also be enabled via extension
7776b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        mZeroTextures[GL_TEXTURE_3D].set(new Texture3D(mRenderer->createTexture(GL_TEXTURE_3D), 0));
7876b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        bindTexture(GL_TEXTURE_3D, 0);
7976b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang
8076b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        mZeroTextures[GL_TEXTURE_2D_ARRAY].set(new Texture2DArray(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), 0));
8176b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        bindTexture(GL_TEXTURE_2D_ARRAY, 0);
8276b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    }
83144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
8457a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    bindVertexArray(0);
85144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    bindArrayBuffer(0);
86144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    bindElementArrayBuffer(0);
8776b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang
88144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    bindReadFramebuffer(0);
89144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    bindDrawFramebuffer(0);
90144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    bindRenderbuffer(0);
91144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
92667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    bindGenericUniformBuffer(0);
93667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    for (int i = 0; i < IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS; i++)
94667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    {
95667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        bindIndexedUniformBuffer(0, i, 0, -1);
96667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    }
97667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com
98667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    bindGenericTransformFeedbackBuffer(0);
99667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    for (int i = 0; i < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS; i++)
100667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    {
101667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        bindIndexedTransformFeedbackBuffer(0, i, 0, -1);
102667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    }
103667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com
1045117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com    bindCopyReadBuffer(0);
1055117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com    bindCopyWriteBuffer(0);
106c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com    bindPixelPackBuffer(0);
107c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com    bindPixelUnpackBuffer(0);
1085117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com
109c8058451c87ec298683bf484813016b20bf36777Geoff Lang    // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
110c8058451c87ec298683bf484813016b20bf36777Geoff Lang    // In the initial state, a default transform feedback object is bound and treated as
111c8058451c87ec298683bf484813016b20bf36777Geoff Lang    // a transform feedback object with a name of zero. That object is bound any time
112c8058451c87ec298683bf484813016b20bf36777Geoff Lang    // BindTransformFeedback is called with id of zero
113db8ae16b8bbf6999a4f07dc65b0918938d78394cKenneth Russell    mTransformFeedbackZero.set(new TransformFeedback(mRenderer->createTransformFeedback(), 0));
114c8058451c87ec298683bf484813016b20bf36777Geoff Lang    bindTransformFeedback(0);
115c8058451c87ec298683bf484813016b20bf36777Geoff Lang
116144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mHasBeenCurrent = false;
117144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mContextLost = false;
118144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mResetStatus = GL_NO_ERROR;
119144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mResetStrategy = (notifyResets ? GL_LOSE_CONTEXT_ON_RESET_EXT : GL_NO_RESET_NOTIFICATION_EXT);
120144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mRobustAccess = robustAccess;
121144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
12253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setContext(this);
123144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
124144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
125144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgContext::~Context()
126144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
12753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    GLuint currentProgram = mState.getCurrentProgramId();
12853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (currentProgram != 0)
129144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
13053a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        Program *programObject = mResourceManager->getProgram(currentProgram);
131144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        if (programObject)
132144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
133144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            programObject->release();
134144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
13553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        currentProgram = 0;
136144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
13753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setCurrentProgram(0, NULL);
138144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
139144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    while (!mFramebufferMap.empty())
140144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
141144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        deleteFramebuffer(mFramebufferMap.begin()->first);
142144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
143144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
14433dc84394ba08700d700a3da692e8de18433a031Jamie Madill    while (!mFenceNVMap.empty())
145144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
14633dc84394ba08700d700a3da692e8de18433a031Jamie Madill        deleteFenceNV(mFenceNVMap.begin()->first);
147144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
148144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
149144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    while (!mQueryMap.empty())
150144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
151144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        deleteQuery(mQueryMap.begin()->first);
152144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
153144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
15457a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    while (!mVertexArrayMap.empty())
15557a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    {
15657a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill        deleteVertexArray(mVertexArrayMap.begin()->first);
15757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    }
15857a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
159c8058451c87ec298683bf484813016b20bf36777Geoff Lang    mTransformFeedbackZero.set(NULL);
160c8058451c87ec298683bf484813016b20bf36777Geoff Lang    while (!mTransformFeedbackMap.empty())
161c8058451c87ec298683bf484813016b20bf36777Geoff Lang    {
162c8058451c87ec298683bf484813016b20bf36777Geoff Lang        deleteTransformFeedback(mTransformFeedbackMap.begin()->first);
163c8058451c87ec298683bf484813016b20bf36777Geoff Lang    }
164c8058451c87ec298683bf484813016b20bf36777Geoff Lang
16576b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    for (TextureMap::iterator i = mIncompleteTextures.begin(); i != mIncompleteTextures.end(); i++)
166144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
16776b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        i->second.set(NULL);
168144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
16976b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    mIncompleteTextures.clear();
170144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
17176b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    for (TextureMap::iterator i = mZeroTextures.begin(); i != mZeroTextures.end(); i++)
17276b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    {
17376b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        i->second.set(NULL);
17476b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    }
17576b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    mZeroTextures.clear();
176144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
177144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mResourceManager->release();
178144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
179144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
180ad62987f1ef6e34ed362e7a7ee125ffcd1690241daniel@transgaming.comvoid Context::makeCurrent(egl::Surface *surface)
181144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
182144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (!mHasBeenCurrent)
183144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
184144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        initRendererString();
185cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang        initExtensionStrings();
186144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
18753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        mState.setViewportParams(0, 0, surface->getWidth(), surface->getHeight());
18853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        mState.setScissorParams(0, 0, surface->getWidth(), surface->getHeight());
189144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
190144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        mHasBeenCurrent = true;
191144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
192144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
193024786d7ca409dbbe1877b7c60f99f50e1647e5ddaniel@transgaming.com    // Wrap the existing swapchain resources into GL objects and assign them to the '0' names
19476d3e6e07b87d95baf43a0c40ec6f3df883fbf71daniel@transgaming.com    rx::SwapChain *swapchain = surface->getSwapChain();
195144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
19670062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com    Colorbuffer *colorbufferZero = new Colorbuffer(mRenderer, swapchain);
19770062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com    DepthStencilbuffer *depthStencilbufferZero = new DepthStencilbuffer(mRenderer, swapchain);
19816418b115610ebc2d40efc3c6e817b0584d8c6f7daniel@transgaming.com    Framebuffer *framebufferZero = new DefaultFramebuffer(mRenderer, colorbufferZero, depthStencilbufferZero);
199144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
200144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    setFramebufferZero(framebufferZero);
201785f1965dfbe45f4dfa35f745f4ea42420d24bf8shannon.woods%transgaming.com@gtempaccount.com
202785f1965dfbe45f4dfa35f745f4ea42420d24bf8shannon.woods%transgaming.com@gtempaccount.com    // Store the current client version in the renderer
203785f1965dfbe45f4dfa35f745f4ea42420d24bf8shannon.woods%transgaming.com@gtempaccount.com    mRenderer->setCurrentClientVersion(mClientVersion);
204144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
205144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
206f688c0d18c25940336d83e37befe76ead2844962daniel@transgaming.com// NOTE: this function should not assume that this context is current!
207144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::markContextLost()
208144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
209144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
210144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
211144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mContextLost = true;
212144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
213144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
214144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::isContextLost()
215144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
216144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return mContextLost;
217144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
218144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
219144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createBuffer()
220144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
221144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return mResourceManager->createBuffer();
222144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
223144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
224144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createProgram()
225144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
226144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return mResourceManager->createProgram();
227144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
228144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
229144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createShader(GLenum type)
230144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
231144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return mResourceManager->createShader(type);
232144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
233144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
234144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createTexture()
235144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
236144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return mResourceManager->createTexture();
237144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
238144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
239144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createRenderbuffer()
240144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
241144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return mResourceManager->createRenderbuffer();
242144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
243144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
244cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie MadillGLsync Context::createFenceSync(GLenum condition)
245cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill{
246cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill    GLuint handle = mResourceManager->createFenceSync();
247cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill
248cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill    gl::FenceSync *fenceSync = mResourceManager->getFenceSync(handle);
249cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill    ASSERT(fenceSync);
250cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill
251cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill    fenceSync->set(condition);
252cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill
253cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill    return reinterpret_cast<GLsync>(handle);
254cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill}
255cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill
25657a8972e5ddf7611860d9767c8aed4793c3929afJamie MadillGLuint Context::createVertexArray()
25757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill{
25857a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    GLuint handle = mVertexArrayHandleAllocator.allocate();
25957a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
260d102854814df2170aa3210c0699aab01cf080fd4Jamie Madill    // Although the spec states VAO state is not initialized until the object is bound,
261d102854814df2170aa3210c0699aab01cf080fd4Jamie Madill    // we create it immediately. The resulting behaviour is transparent to the application,
262d102854814df2170aa3210c0699aab01cf080fd4Jamie Madill    // since it's not currently possible to access the state until the object is bound.
263aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods    VertexArray *vertexArray = new VertexArray(mRenderer->createVertexArray(), handle, MAX_VERTEX_ATTRIBS);
264aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods    mVertexArrayMap[handle] = vertexArray;
26557a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    return handle;
26657a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill}
26757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
268dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie MadillGLuint Context::createSampler()
269dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{
270dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill    return mResourceManager->createSampler();
271dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill}
272dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill
273c8058451c87ec298683bf484813016b20bf36777Geoff LangGLuint Context::createTransformFeedback()
274c8058451c87ec298683bf484813016b20bf36777Geoff Lang{
275c8058451c87ec298683bf484813016b20bf36777Geoff Lang    GLuint handle = mTransformFeedbackAllocator.allocate();
276db8ae16b8bbf6999a4f07dc65b0918938d78394cKenneth Russell    TransformFeedback *transformFeedback = new TransformFeedback(mRenderer->createTransformFeedback(), handle);
277c8058451c87ec298683bf484813016b20bf36777Geoff Lang    transformFeedback->addRef();
278c8058451c87ec298683bf484813016b20bf36777Geoff Lang    mTransformFeedbackMap[handle] = transformFeedback;
279c8058451c87ec298683bf484813016b20bf36777Geoff Lang    return handle;
280c8058451c87ec298683bf484813016b20bf36777Geoff Lang}
281c8058451c87ec298683bf484813016b20bf36777Geoff Lang
282144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Returns an unused framebuffer name
283144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createFramebuffer()
284144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
285144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    GLuint handle = mFramebufferHandleAllocator.allocate();
286144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
287144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mFramebufferMap[handle] = NULL;
288144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
289144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return handle;
290144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
291144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
29233dc84394ba08700d700a3da692e8de18433a031Jamie MadillGLuint Context::createFenceNV()
293144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
29433dc84394ba08700d700a3da692e8de18433a031Jamie Madill    GLuint handle = mFenceNVHandleAllocator.allocate();
295144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
29633dc84394ba08700d700a3da692e8de18433a031Jamie Madill    mFenceNVMap[handle] = new FenceNV(mRenderer);
297144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
298144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return handle;
299144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
300144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
301144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Returns an unused query name
302144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLuint Context::createQuery()
303144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
304144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    GLuint handle = mQueryHandleAllocator.allocate();
305144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
306144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mQueryMap[handle] = NULL;
307144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
308144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return handle;
309144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
310144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
311144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteBuffer(GLuint buffer)
312144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
313144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (mResourceManager->getBuffer(buffer))
314144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
315144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        detachBuffer(buffer);
316144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
317893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill
318144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mResourceManager->deleteBuffer(buffer);
319144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
320144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
321144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteShader(GLuint shader)
322144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
323144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mResourceManager->deleteShader(shader);
324144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
325144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
326144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteProgram(GLuint program)
327144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
328144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mResourceManager->deleteProgram(program);
329144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
330144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
331144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteTexture(GLuint texture)
332144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
333144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (mResourceManager->getTexture(texture))
334144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
335144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        detachTexture(texture);
336144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
337144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
338144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mResourceManager->deleteTexture(texture);
339144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
340144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
341144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteRenderbuffer(GLuint renderbuffer)
342144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
343144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (mResourceManager->getRenderbuffer(renderbuffer))
344144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
345144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        detachRenderbuffer(renderbuffer);
346144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
347893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill
348144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mResourceManager->deleteRenderbuffer(renderbuffer);
349144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
350144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
351cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madillvoid Context::deleteFenceSync(GLsync fenceSync)
352cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill{
353cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill    // The spec specifies the underlying Fence object is not deleted until all current
354cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill    // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
355cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill    // and since our API is currently designed for being called from a single thread, we can delete
356cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill    // the fence immediately.
357cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill    mResourceManager->deleteFenceSync(reinterpret_cast<GLuint>(fenceSync));
358cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill}
359cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill
36057a8972e5ddf7611860d9767c8aed4793c3929afJamie Madillvoid Context::deleteVertexArray(GLuint vertexArray)
36157a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill{
36257a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    auto vertexArrayObject = mVertexArrayMap.find(vertexArray);
36357a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
36457a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    if (vertexArrayObject != mVertexArrayMap.end())
36557a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    {
36657a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill        detachVertexArray(vertexArray);
36757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
36857a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill        mVertexArrayHandleAllocator.release(vertexArrayObject->first);
36957a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill        delete vertexArrayObject->second;
37057a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill        mVertexArrayMap.erase(vertexArrayObject);
37157a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    }
37257a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill}
37357a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
374dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madillvoid Context::deleteSampler(GLuint sampler)
375dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{
376dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill    if (mResourceManager->getSampler(sampler))
377dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill    {
378dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill        detachSampler(sampler);
379dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill    }
380dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill
381dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill    mResourceManager->deleteSampler(sampler);
382dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill}
383dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill
384c8058451c87ec298683bf484813016b20bf36777Geoff Langvoid Context::deleteTransformFeedback(GLuint transformFeedback)
385c8058451c87ec298683bf484813016b20bf36777Geoff Lang{
386c8058451c87ec298683bf484813016b20bf36777Geoff Lang    TransformFeedbackMap::const_iterator iter = mTransformFeedbackMap.find(transformFeedback);
387c8058451c87ec298683bf484813016b20bf36777Geoff Lang    if (iter != mTransformFeedbackMap.end())
388c8058451c87ec298683bf484813016b20bf36777Geoff Lang    {
389c8058451c87ec298683bf484813016b20bf36777Geoff Lang        detachTransformFeedback(transformFeedback);
390c8058451c87ec298683bf484813016b20bf36777Geoff Lang        mTransformFeedbackAllocator.release(transformFeedback);
391c8058451c87ec298683bf484813016b20bf36777Geoff Lang        iter->second->release();
392c8058451c87ec298683bf484813016b20bf36777Geoff Lang        mTransformFeedbackMap.erase(iter);
393c8058451c87ec298683bf484813016b20bf36777Geoff Lang    }
394c8058451c87ec298683bf484813016b20bf36777Geoff Lang}
395c8058451c87ec298683bf484813016b20bf36777Geoff Lang
396144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteFramebuffer(GLuint framebuffer)
397144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
398144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    FramebufferMap::iterator framebufferObject = mFramebufferMap.find(framebuffer);
399144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
400144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (framebufferObject != mFramebufferMap.end())
401144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
402144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        detachFramebuffer(framebuffer);
403144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
404144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        mFramebufferHandleAllocator.release(framebufferObject->first);
405144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        delete framebufferObject->second;
406144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        mFramebufferMap.erase(framebufferObject);
407144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
408144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
409144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
41033dc84394ba08700d700a3da692e8de18433a031Jamie Madillvoid Context::deleteFenceNV(GLuint fence)
411144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
41233dc84394ba08700d700a3da692e8de18433a031Jamie Madill    FenceNVMap::iterator fenceObject = mFenceNVMap.find(fence);
413144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
41433dc84394ba08700d700a3da692e8de18433a031Jamie Madill    if (fenceObject != mFenceNVMap.end())
415144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
41633dc84394ba08700d700a3da692e8de18433a031Jamie Madill        mFenceNVHandleAllocator.release(fenceObject->first);
417144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        delete fenceObject->second;
41833dc84394ba08700d700a3da692e8de18433a031Jamie Madill        mFenceNVMap.erase(fenceObject);
419144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
420144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
421144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
422144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::deleteQuery(GLuint query)
423144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
424144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    QueryMap::iterator queryObject = mQueryMap.find(query);
425144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (queryObject != mQueryMap.end())
426144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
427144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        mQueryHandleAllocator.release(queryObject->first);
428144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        if (queryObject->second)
429144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
430144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            queryObject->second->release();
431144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
432144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        mQueryMap.erase(queryObject);
433144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
434144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
435144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
436144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgBuffer *Context::getBuffer(GLuint handle)
437144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
438144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return mResourceManager->getBuffer(handle);
439144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
440144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
44148dcae7b217420a7387c84a76651989e6f5f3576Geoff LangShader *Context::getShader(GLuint handle) const
442144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
443144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return mResourceManager->getShader(handle);
444144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
445144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
44648dcae7b217420a7387c84a76651989e6f5f3576Geoff LangProgram *Context::getProgram(GLuint handle) const
447144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
448144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return mResourceManager->getProgram(handle);
449144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
450144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
451570f7c84a7d353c99f7c001af3b7b73e21b316fbJamie MadillTexture *Context::getTexture(GLuint handle) const
452144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
453144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return mResourceManager->getTexture(handle);
454144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
455144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
4566c7b4ada6bcb8ec0d929ff929b33f07c653d8e82Jamie MadillRenderbuffer *Context::getRenderbuffer(GLuint handle)
457144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
458144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return mResourceManager->getRenderbuffer(handle);
459144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
460144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
461cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie MadillFenceSync *Context::getFenceSync(GLsync handle) const
462cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill{
463cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill    return mResourceManager->getFenceSync(reinterpret_cast<GLuint>(handle));
464cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill}
465cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill
46657a8972e5ddf7611860d9767c8aed4793c3929afJamie MadillVertexArray *Context::getVertexArray(GLuint handle) const
46757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill{
46857a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    auto vertexArray = mVertexArrayMap.find(handle);
46957a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
47057a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    if (vertexArray == mVertexArrayMap.end())
47157a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    {
47257a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill        return NULL;
47357a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    }
47457a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    else
47557a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    {
47657a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill        return vertexArray->second;
47757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    }
47857a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill}
47957a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
480dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie MadillSampler *Context::getSampler(GLuint handle) const
481dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{
482dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill    return mResourceManager->getSampler(handle);
483dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill}
484dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill
485c8058451c87ec298683bf484813016b20bf36777Geoff LangTransformFeedback *Context::getTransformFeedback(GLuint handle) const
486c8058451c87ec298683bf484813016b20bf36777Geoff Lang{
487c8058451c87ec298683bf484813016b20bf36777Geoff Lang    if (handle == 0)
488c8058451c87ec298683bf484813016b20bf36777Geoff Lang    {
489c8058451c87ec298683bf484813016b20bf36777Geoff Lang        return mTransformFeedbackZero.get();
490c8058451c87ec298683bf484813016b20bf36777Geoff Lang    }
491c8058451c87ec298683bf484813016b20bf36777Geoff Lang    else
492c8058451c87ec298683bf484813016b20bf36777Geoff Lang    {
493c8058451c87ec298683bf484813016b20bf36777Geoff Lang        TransformFeedbackMap::const_iterator iter = mTransformFeedbackMap.find(handle);
494c8058451c87ec298683bf484813016b20bf36777Geoff Lang        return (iter != mTransformFeedbackMap.end()) ? iter->second : NULL;
495c8058451c87ec298683bf484813016b20bf36777Geoff Lang    }
496c8058451c87ec298683bf484813016b20bf36777Geoff Lang}
497c8058451c87ec298683bf484813016b20bf36777Geoff Lang
498dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madillbool Context::isSampler(GLuint samplerName) const
499dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{
500dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill    return mResourceManager->isSampler(samplerName);
501dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill}
502dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill
503144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::bindArrayBuffer(unsigned int buffer)
504144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
505144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mResourceManager->checkBufferAllocation(buffer);
506144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
50753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setArrayBufferBinding(getBuffer(buffer));
508144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
509144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
510144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::bindElementArrayBuffer(unsigned int buffer)
511144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
512144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mResourceManager->checkBufferAllocation(buffer);
513144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
51453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.getVertexArray()->setElementArrayBuffer(getBuffer(buffer));
515144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
516144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
51776b10c9a9735c27627065d9fe68f78374ef48934Geoff Langvoid Context::bindTexture(GLenum target, GLuint texture)
51890dbc44c79052a9ceaab2c782a67e7d149da5385shannon.woods%transgaming.com@gtempaccount.com{
51976b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    mResourceManager->checkTextureAllocation(texture, target);
52090dbc44c79052a9ceaab2c782a67e7d149da5385shannon.woods%transgaming.com@gtempaccount.com
52176b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    mState.setSamplerTexture(target, getTexture(texture));
52290dbc44c79052a9ceaab2c782a67e7d149da5385shannon.woods%transgaming.com@gtempaccount.com}
52390dbc44c79052a9ceaab2c782a67e7d149da5385shannon.woods%transgaming.com@gtempaccount.com
524144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::bindReadFramebuffer(GLuint framebuffer)
525144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
526144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (!getFramebuffer(framebuffer))
527144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
528aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods        mFramebufferMap[framebuffer] = new Framebuffer(mRenderer, framebuffer);
529144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
530144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
53153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setReadFramebufferBinding(getFramebuffer(framebuffer));
532144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
533144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
534144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::bindDrawFramebuffer(GLuint framebuffer)
535144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
536144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (!getFramebuffer(framebuffer))
537144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
538aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods        mFramebufferMap[framebuffer] = new Framebuffer(mRenderer, framebuffer);
539144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
540144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
54153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setDrawFramebufferBinding(getFramebuffer(framebuffer));
542144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
543144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
544144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::bindRenderbuffer(GLuint renderbuffer)
545144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
546144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    mResourceManager->checkRenderbufferAllocation(renderbuffer);
547144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
54853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setRenderbufferBinding(getRenderbuffer(renderbuffer));
549144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
550144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
55157a8972e5ddf7611860d9767c8aed4793c3929afJamie Madillvoid Context::bindVertexArray(GLuint vertexArray)
55257a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill{
55357a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    if (!getVertexArray(vertexArray))
55457a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    {
555aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods        VertexArray *vertexArrayObject = new VertexArray(mRenderer->createVertexArray(), vertexArray, MAX_VERTEX_ATTRIBS);
556aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods        mVertexArrayMap[vertexArray] = vertexArrayObject;
55757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    }
55857a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
55953a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setVertexArrayBinding(getVertexArray(vertexArray));
56057a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill}
56157a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
562dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madillvoid Context::bindSampler(GLuint textureUnit, GLuint sampler)
563dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{
56476b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
565dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill    mResourceManager->checkSamplerAllocation(sampler);
566dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill
56753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setSamplerBinding(textureUnit, getSampler(sampler));
568dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill}
569dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill
570667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.comvoid Context::bindGenericUniformBuffer(GLuint buffer)
571667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com{
572667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    mResourceManager->checkBufferAllocation(buffer);
573667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com
57453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setGenericUniformBufferBinding(getBuffer(buffer));
575667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com}
576667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com
577667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.comvoid Context::bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
57834089354b04a78dc6a6c0bda15b4757a8f9a0401shannon.woods%transgaming.com@gtempaccount.com{
57934089354b04a78dc6a6c0bda15b4757a8f9a0401shannon.woods%transgaming.com@gtempaccount.com    mResourceManager->checkBufferAllocation(buffer);
58034089354b04a78dc6a6c0bda15b4757a8f9a0401shannon.woods%transgaming.com@gtempaccount.com
58153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setIndexedUniformBufferBinding(index, getBuffer(buffer), offset, size);
58234089354b04a78dc6a6c0bda15b4757a8f9a0401shannon.woods%transgaming.com@gtempaccount.com}
58334089354b04a78dc6a6c0bda15b4757a8f9a0401shannon.woods%transgaming.com@gtempaccount.com
584667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.comvoid Context::bindGenericTransformFeedbackBuffer(GLuint buffer)
585667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com{
586667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    mResourceManager->checkBufferAllocation(buffer);
587667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com
58853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setGenericTransformFeedbackBufferBinding(getBuffer(buffer));
589667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com}
590667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com
591667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.comvoid Context::bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
59234089354b04a78dc6a6c0bda15b4757a8f9a0401shannon.woods%transgaming.com@gtempaccount.com{
59334089354b04a78dc6a6c0bda15b4757a8f9a0401shannon.woods%transgaming.com@gtempaccount.com    mResourceManager->checkBufferAllocation(buffer);
59434089354b04a78dc6a6c0bda15b4757a8f9a0401shannon.woods%transgaming.com@gtempaccount.com
59553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setIndexedTransformFeedbackBufferBinding(index, getBuffer(buffer), offset, size);
59634089354b04a78dc6a6c0bda15b4757a8f9a0401shannon.woods%transgaming.com@gtempaccount.com}
59734089354b04a78dc6a6c0bda15b4757a8f9a0401shannon.woods%transgaming.com@gtempaccount.com
5985117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.comvoid Context::bindCopyReadBuffer(GLuint buffer)
5995117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com{
6005117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com    mResourceManager->checkBufferAllocation(buffer);
6015117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com
60253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setCopyReadBufferBinding(getBuffer(buffer));
6035117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com}
6045117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com
6055117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.comvoid Context::bindCopyWriteBuffer(GLuint buffer)
6065117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com{
6075117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com    mResourceManager->checkBufferAllocation(buffer);
6085117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com
60953a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setCopyWriteBufferBinding(getBuffer(buffer));
6105117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com}
6115117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com
612c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.comvoid Context::bindPixelPackBuffer(GLuint buffer)
613c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com{
614c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com    mResourceManager->checkBufferAllocation(buffer);
615c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com
61653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setPixelPackBufferBinding(getBuffer(buffer));
617c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com}
618c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com
619c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.comvoid Context::bindPixelUnpackBuffer(GLuint buffer)
620c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com{
621c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com    mResourceManager->checkBufferAllocation(buffer);
622c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com
62353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setPixelUnpackBufferBinding(getBuffer(buffer));
624c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com}
625c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com
626144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::useProgram(GLuint program)
627144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
62853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    GLuint priorProgramId = mState.getCurrentProgramId();
62953a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    Program *priorProgram = mResourceManager->getProgram(priorProgramId);
630144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
63153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (priorProgramId != program)
632144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
63353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        mState.setCurrentProgram(program, mResourceManager->getProgram(program));
634893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill
63553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        if (priorProgram)
636144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
63753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods            priorProgram->release();
638144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
639144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
640144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
641144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
64295d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.comvoid Context::linkProgram(GLuint program)
64395d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com{
64495d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com    Program *programObject = mResourceManager->getProgram(program);
64595d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com
64643a53e2434f4fe042bee061fc369a93314b710deBrandon Jones    bool linked = programObject->link(getCaps());
64712394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com
64812394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com    // if the current program was relinked successfully we
64912394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com    // need to install the new executables
65053a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (linked && program == mState.getCurrentProgramId())
65112394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com    {
65253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        mState.setCurrentProgramBinary(programObject->getProgramBinary());
65312394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com    }
65495d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com}
65595d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com
656900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Langvoid Context::setProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLint length)
65795d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com{
65895d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com    Program *programObject = mResourceManager->getProgram(program);
65995d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com
660900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang    bool loaded = programObject->setProgramBinary(binaryFormat, binary, length);
66112394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com
66212394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com    // if the current program was reloaded successfully we
66312394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com    // need to install the new executables
66453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (loaded && program == mState.getCurrentProgramId())
66512394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com    {
66653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        mState.setCurrentProgramBinary(programObject->getProgramBinary());
66712394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com    }
66812394cf7c27d10d2b4f34e69bcacfb7fb3bc5b23daniel@transgaming.com
66995d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com}
67095d294247b8fe82dddc1e8ddcbb7449074112e5ddaniel@transgaming.com
671c8058451c87ec298683bf484813016b20bf36777Geoff Langvoid Context::bindTransformFeedback(GLuint transformFeedback)
672c8058451c87ec298683bf484813016b20bf36777Geoff Lang{
67353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setTransformFeedbackBinding(getTransformFeedback(transformFeedback));
674c8058451c87ec298683bf484813016b20bf36777Geoff Lang}
675c8058451c87ec298683bf484813016b20bf36777Geoff Lang
6765aad96735332d3c033a8212d96899173631653c5Geoff LangError Context::beginQuery(GLenum target, GLuint query)
677144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
678144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    Query *queryObject = getQuery(query, true, target);
679db2f14c0b1133507215dd3b7a30155b70885973aJamie Madill    ASSERT(queryObject);
680144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
6815aad96735332d3c033a8212d96899173631653c5Geoff Lang    // begin query
6825aad96735332d3c033a8212d96899173631653c5Geoff Lang    Error error = queryObject->begin();
6835aad96735332d3c033a8212d96899173631653c5Geoff Lang    if (error.isError())
6845aad96735332d3c033a8212d96899173631653c5Geoff Lang    {
6855aad96735332d3c033a8212d96899173631653c5Geoff Lang        return error;
6865aad96735332d3c033a8212d96899173631653c5Geoff Lang    }
6875aad96735332d3c033a8212d96899173631653c5Geoff Lang
6885aad96735332d3c033a8212d96899173631653c5Geoff Lang    // set query as active for specified target only if begin succeeded
68953a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setActiveQuery(target, queryObject);
690144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
6915aad96735332d3c033a8212d96899173631653c5Geoff Lang    return Error(GL_NO_ERROR);
692144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
693144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
6945aad96735332d3c033a8212d96899173631653c5Geoff LangError Context::endQuery(GLenum target)
695144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
69653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    Query *queryObject = mState.getActiveQuery(target);
69745c785d35c270ca1d1168b6ca5517cb3a5a285ccJamie Madill    ASSERT(queryObject);
698144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
6995aad96735332d3c033a8212d96899173631653c5Geoff Lang    gl::Error error = queryObject->end();
700144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
7015aad96735332d3c033a8212d96899173631653c5Geoff Lang    // Always unbind the query, even if there was an error. This may delete the query object.
70253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.setActiveQuery(target, NULL);
7035aad96735332d3c033a8212d96899173631653c5Geoff Lang
7045aad96735332d3c033a8212d96899173631653c5Geoff Lang    return error;
705144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
706144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
707144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setFramebufferZero(Framebuffer *buffer)
708144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
709aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods    // First, check to see if the old default framebuffer
710aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods    // was set for draw or read framebuffer, and change
711aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods    // the bindings to point to the new one before deleting it.
71253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (mState.getDrawFramebuffer()->id() == 0)
713aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods    {
71453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        mState.setDrawFramebufferBinding(buffer);
715aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods    }
716aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods
71753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (mState.getReadFramebuffer()->id() == 0)
718144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
71953a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        mState.setReadFramebufferBinding(buffer);
720144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
721aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods
722aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods    delete mFramebufferMap[0];
723aa2ab7d8c9112231b623ea3ebb85e3f28c26e526Shannon Woods    mFramebufferMap[0] = buffer;
724144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
725144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
72670062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.comvoid Context::setRenderbufferStorage(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples)
727144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
7286cf8e1b906ebfcda10f0f1cc673df6688c81e0e0Geoff Lang    ASSERT(getTextureCaps().get(internalformat).renderable);
7292e1dcd59a6ecd44cabe70f12ca7fac0af33bbca0Geoff Lang
73070062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com    RenderbufferStorage *renderbuffer = NULL;
7312e1dcd59a6ecd44cabe70f12ca7fac0af33bbca0Geoff Lang
7325d601382b51c29d1670b58c01360416bd929842dGeoff Lang    const InternalFormat &formatInfo = GetInternalFormatInfo(internalformat);
7335d601382b51c29d1670b58c01360416bd929842dGeoff Lang    if (formatInfo.depthBits > 0 && formatInfo.stencilBits > 0)
7342e1dcd59a6ecd44cabe70f12ca7fac0af33bbca0Geoff Lang    {
73570062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com        renderbuffer = new gl::DepthStencilbuffer(mRenderer, width, height, samples);
7362e1dcd59a6ecd44cabe70f12ca7fac0af33bbca0Geoff Lang    }
7375d601382b51c29d1670b58c01360416bd929842dGeoff Lang    else if (formatInfo.depthBits > 0)
7382e1dcd59a6ecd44cabe70f12ca7fac0af33bbca0Geoff Lang    {
7392e1dcd59a6ecd44cabe70f12ca7fac0af33bbca0Geoff Lang        renderbuffer = new gl::Depthbuffer(mRenderer, width, height, samples);
7402e1dcd59a6ecd44cabe70f12ca7fac0af33bbca0Geoff Lang    }
7415d601382b51c29d1670b58c01360416bd929842dGeoff Lang    else if (formatInfo.stencilBits > 0)
7422e1dcd59a6ecd44cabe70f12ca7fac0af33bbca0Geoff Lang    {
7432e1dcd59a6ecd44cabe70f12ca7fac0af33bbca0Geoff Lang        renderbuffer = new gl::Stencilbuffer(mRenderer, width, height, samples);
7442e1dcd59a6ecd44cabe70f12ca7fac0af33bbca0Geoff Lang    }
7452e1dcd59a6ecd44cabe70f12ca7fac0af33bbca0Geoff Lang    else
7462e1dcd59a6ecd44cabe70f12ca7fac0af33bbca0Geoff Lang    {
7476cf8e1b906ebfcda10f0f1cc673df6688c81e0e0Geoff Lang        renderbuffer = new gl::Colorbuffer(mRenderer, width, height, internalformat, samples);
74870062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com    }
74970062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com
75053a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.getCurrentRenderbuffer()->setStorage(renderbuffer);
751144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
752144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
7531fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie MadillFramebuffer *Context::getFramebuffer(unsigned int handle) const
754144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
7551fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill    FramebufferMap::const_iterator framebuffer = mFramebufferMap.find(handle);
756144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
757144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (framebuffer == mFramebufferMap.end())
758144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
759144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        return NULL;
760144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
761144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    else
762144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
763144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        return framebuffer->second;
764144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
765144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
766144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
76733dc84394ba08700d700a3da692e8de18433a031Jamie MadillFenceNV *Context::getFenceNV(unsigned int handle)
768144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
76933dc84394ba08700d700a3da692e8de18433a031Jamie Madill    FenceNVMap::iterator fence = mFenceNVMap.find(handle);
770144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
77133dc84394ba08700d700a3da692e8de18433a031Jamie Madill    if (fence == mFenceNVMap.end())
772144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
773144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        return NULL;
774144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
775144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    else
776144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
777144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        return fence->second;
778144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
779144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
780144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
781144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgQuery *Context::getQuery(unsigned int handle, bool create, GLenum type)
782144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
783144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    QueryMap::iterator query = mQueryMap.find(handle);
784144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
785144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (query == mQueryMap.end())
786144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
787144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        return NULL;
788144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
789144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    else
790144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
791144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        if (!query->second && create)
792144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
7933b579e36984d34a1b29d2062ca233630f5840ac5Brandon Jones            query->second = new Query(mRenderer->createQuery(type), handle);
794144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            query->second->addRef();
795144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
796144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        return query->second;
797144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
798144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
799144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
8001fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie MadillTexture *Context::getTargetTexture(GLenum target) const
8011fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill{
8021fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill    if (!ValidTextureTarget(this, target))
8031fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill    {
8041fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill        return NULL;
8051fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill    }
8061fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill
8071fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill    switch (target)
8081fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill    {
8091fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill      case GL_TEXTURE_2D:       return getTexture2D();
8101fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill      case GL_TEXTURE_CUBE_MAP: return getTextureCubeMap();
8111fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill      case GL_TEXTURE_3D:       return getTexture3D();
8121fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill      case GL_TEXTURE_2D_ARRAY: return getTexture2DArray();
8131fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill      default:                  return NULL;
8141fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill    }
8151fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill}
8161fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie Madill
8171fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie MadillTexture2D *Context::getTexture2D() const
818144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
81976b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    return static_cast<Texture2D*>(getSamplerTexture(mState.getActiveSampler(), GL_TEXTURE_2D));
820144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
821144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
8221fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie MadillTextureCubeMap *Context::getTextureCubeMap() const
823144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
82476b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    return static_cast<TextureCubeMap*>(getSamplerTexture(mState.getActiveSampler(), GL_TEXTURE_CUBE_MAP));
825144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
826144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
8271fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie MadillTexture3D *Context::getTexture3D() const
828c416e1cc09f1404d3dbcf23cd55956d37ebe67d2shannon.woods%transgaming.com@gtempaccount.com{
82976b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    return static_cast<Texture3D*>(getSamplerTexture(mState.getActiveSampler(), GL_TEXTURE_3D));
830c416e1cc09f1404d3dbcf23cd55956d37ebe67d2shannon.woods%transgaming.com@gtempaccount.com}
831c416e1cc09f1404d3dbcf23cd55956d37ebe67d2shannon.woods%transgaming.com@gtempaccount.com
8321fc7e2c5961207aa2bd1a99978d661b4cbcbf144Jamie MadillTexture2DArray *Context::getTexture2DArray() const
83390dbc44c79052a9ceaab2c782a67e7d149da5385shannon.woods%transgaming.com@gtempaccount.com{
83476b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    return static_cast<Texture2DArray*>(getSamplerTexture(mState.getActiveSampler(), GL_TEXTURE_2D_ARRAY));
835c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com}
836c926e5f1808efd73b617ac0f204f1455cf8f600dshannon.woods%transgaming.com@gtempaccount.com
83776b10c9a9735c27627065d9fe68f78374ef48934Geoff LangTexture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const
838144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
83953a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (mState.getSamplerTextureId(sampler, type) == 0)
840144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
84176b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        return mZeroTextures.at(type).get();
842144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
84353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    else
84453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    {
84553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        return mState.getSamplerTexture(sampler, type);
84653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    }
847144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
848144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
849893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madillvoid Context::getBooleanv(GLenum pname, GLboolean *params)
850144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
851144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    switch (pname)
852144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
853f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com      case GL_SHADER_COMPILER:           *params = GL_TRUE;                             break;
854f39967e136759e6d196793122638431c74db1d7fdaniel@transgaming.com      case GL_CONTEXT_ROBUST_ACCESS_EXT: *params = mRobustAccess ? GL_TRUE : GL_FALSE;  break;
855144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      default:
85653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        mState.getBooleanv(pname, params);
857893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill        break;
858144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
859144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
860144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
861893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madillvoid Context::getFloatv(GLenum pname, GLfloat *params)
862144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
86353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Queries about context capabilities and maximums are answered by Context.
86453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Queries about current GL state values are answered by State.
865144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    switch (pname)
866144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
867144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_ALIASED_LINE_WIDTH_RANGE:
868c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang        params[0] = mCaps.minAliasedLineWidth;
869c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang        params[1] = mCaps.maxAliasedLineWidth;
870144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        break;
871144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_ALIASED_POINT_SIZE_RANGE:
872c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang        params[0] = mCaps.minAliasedPointSize;
873c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang        params[1] = mCaps.maxAliasedPointSize;
874144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        break;
87507ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com      case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
876c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang        ASSERT(mExtensions.textureFilterAnisotropic);
877c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang        *params = mExtensions.maxTextureAnisotropy;
87807ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com        break;
879144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      default:
88053a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        mState.getFloatv(pname, params);
881893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill        break;
882144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
883144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
884144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
885893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madillvoid Context::getIntegerv(GLenum pname, GLint *params)
886144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
88753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Queries about context capabilities and maximums are answered by Context.
88853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Queries about current GL state values are answered by State.
889bc373e53243e5e45067bbf67702b3aa66bd10dc6shannon.woods%transgaming.com@gtempaccount.com
890144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    switch (pname)
891144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
892301d161d7e8459a3985281a32824bb733b11d778Geoff Lang      case GL_MAX_VERTEX_ATTRIBS:                       *params = mCaps.maxVertexAttributes;                            break;
893301d161d7e8459a3985281a32824bb733b11d778Geoff Lang      case GL_MAX_VERTEX_UNIFORM_VECTORS:               *params = mCaps.maxVertexUniformVectors;                        break;
894301d161d7e8459a3985281a32824bb733b11d778Geoff Lang      case GL_MAX_VERTEX_UNIFORM_COMPONENTS:            *params = mCaps.maxVertexUniformComponents;                     break;
8953a61c321e7ea779f23a4da72db977286897b1168Geoff Lang      case GL_MAX_VARYING_VECTORS:                      *params = mCaps.maxVaryingVectors;                              break;
8963a61c321e7ea779f23a4da72db977286897b1168Geoff Lang      case GL_MAX_VARYING_COMPONENTS:                   *params = mCaps.maxVertexOutputComponents;                      break;
8973a61c321e7ea779f23a4da72db977286897b1168Geoff Lang      case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:         *params = mCaps.maxCombinedTextureImageUnits;                   break;
898301d161d7e8459a3985281a32824bb733b11d778Geoff Lang      case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:           *params = mCaps.maxVertexTextureImageUnits;                     break;
899301d161d7e8459a3985281a32824bb733b11d778Geoff Lang      case GL_MAX_TEXTURE_IMAGE_UNITS:                  *params = mCaps.maxTextureImageUnits;                           break;
900301d161d7e8459a3985281a32824bb733b11d778Geoff Lang      case GL_MAX_FRAGMENT_UNIFORM_VECTORS:             *params = mCaps.maxFragmentUniformVectors;                      break;
901301d161d7e8459a3985281a32824bb733b11d778Geoff Lang      case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:          *params = mCaps.maxFragmentInputComponents;                     break;
902c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang      case GL_MAX_RENDERBUFFER_SIZE:                    *params = mCaps.maxRenderbufferSize;                            break;
903c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang      case GL_MAX_COLOR_ATTACHMENTS_EXT:                *params = mCaps.maxColorAttachments;                            break;
904c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang      case GL_MAX_DRAW_BUFFERS_EXT:                     *params = mCaps.maxDrawBuffers;                                 break;
9051caff07674c62ca097d6301ee4423df25dad333dJamie Madill      //case GL_FRAMEBUFFER_BINDING:                    // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
9061caff07674c62ca097d6301ee4423df25dad333dJamie Madill      case GL_SUBPIXEL_BITS:                            *params = 4;                                                    break;
907c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang      case GL_MAX_TEXTURE_SIZE:                         *params = mCaps.max2DTextureSize;                               break;
908c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang      case GL_MAX_CUBE_MAP_TEXTURE_SIZE:                *params = mCaps.maxCubeMapTextureSize;                          break;
909c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang      case GL_MAX_3D_TEXTURE_SIZE:                      *params = mCaps.max3DTextureSize;                               break;
910c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang      case GL_MAX_ARRAY_TEXTURE_LAYERS:                 *params = mCaps.maxArrayTextureLayers;                          break;
9113a61c321e7ea779f23a4da72db977286897b1168Geoff Lang      case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:          *params = mCaps.uniformBufferOffsetAlignment;                   break;
9123a61c321e7ea779f23a4da72db977286897b1168Geoff Lang      case GL_MAX_UNIFORM_BUFFER_BINDINGS:              *params = mCaps.maxUniformBufferBindings;                       break;
913301d161d7e8459a3985281a32824bb733b11d778Geoff Lang      case GL_MAX_VERTEX_UNIFORM_BLOCKS:                *params = mCaps.maxVertexUniformBlocks;                         break;
914301d161d7e8459a3985281a32824bb733b11d778Geoff Lang      case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:              *params = mCaps.maxFragmentUniformBlocks;                       break;
9153a61c321e7ea779f23a4da72db977286897b1168Geoff Lang      case GL_MAX_COMBINED_UNIFORM_BLOCKS:              *params = mCaps.maxCombinedTextureImageUnits;                   break;
916ee7010d49f0c6a5e4382b6930fbee25638932929Jamie Madill      case GL_MAJOR_VERSION:                            *params = mClientVersion;                                       break;
917ee7010d49f0c6a5e4382b6930fbee25638932929Jamie Madill      case GL_MINOR_VERSION:                            *params = 0;                                                    break;
918900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang      case GL_MAX_ELEMENTS_INDICES:                     *params = mCaps.maxElementsIndices;                             break;
919900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang      case GL_MAX_ELEMENTS_VERTICES:                    *params = mCaps.maxElementsVertices;                            break;
92005881a0f2ac8830b61e3bf85e08115258e52178aGeoff Lang      case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: *params = mCaps.maxTransformFeedbackInterleavedComponents; break;
92105881a0f2ac8830b61e3bf85e08115258e52178aGeoff Lang      case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:       *params = mCaps.maxTransformFeedbackSeparateAttributes;    break;
92205881a0f2ac8830b61e3bf85e08115258e52178aGeoff Lang      case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:    *params = mCaps.maxTransformFeedbackSeparateComponents;    break;
923900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang      case GL_NUM_COMPRESSED_TEXTURE_FORMATS:           *params = mCaps.compressedTextureFormats.size();                break;
9245f4c46363bf8e7eb6852c3af42a2e57157e72113Geoff Lang      case GL_MAX_SAMPLES_ANGLE:                        *params = mExtensions.maxSamples;                               break;
92542944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com      case GL_IMPLEMENTATION_COLOR_READ_TYPE:
92642944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com      case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
92742944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com        {
928005df41f8900641ed1df60700c8e2eca659a33cbGeoff Lang            GLenum internalFormat, format, type;
929893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill            getCurrentReadFormatType(&internalFormat, &format, &type);
930893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill            if (pname == GL_IMPLEMENTATION_COLOR_READ_FORMAT)
931893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill                *params = format;
932893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill            else
933893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill                *params = type;
93442944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com        }
93542944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com        break;
936144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_MAX_VIEWPORT_DIMS:
937144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
938c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang            params[0] = mCaps.maxViewportWidth;
939c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang            params[1] = mCaps.maxViewportHeight;
940144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
941144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        break;
942144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_COMPRESSED_TEXTURE_FORMATS:
943900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang        std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(), params);
944144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        break;
945144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_RESET_NOTIFICATION_STRATEGY_EXT:
946144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        *params = mResetStrategy;
947144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        break;
948900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang      case GL_NUM_SHADER_BINARY_FORMATS:
949900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang        *params = mCaps.shaderBinaryFormats.size();
950144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        break;
951900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang      case GL_SHADER_BINARY_FORMATS:
952900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang        std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
953900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang        break;
954900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang      case GL_NUM_PROGRAM_BINARY_FORMATS:
955900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang        *params = mCaps.programBinaryFormats.size();
956900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang        break;
957900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang      case GL_PROGRAM_BINARY_FORMATS:
958900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang        std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
959144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        break;
96023c8169f50874a896b96e004f7ec084034f483e0Geoff Lang      case GL_NUM_EXTENSIONS:
961cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang        *params = static_cast<GLint>(mExtensionStrings.size());
96223c8169f50874a896b96e004f7ec084034f483e0Geoff Lang        break;
963144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      default:
96453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        mState.getIntegerv(pname, params);
965893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill        break;
966144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
967144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
968144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
969893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madillvoid Context::getInteger64v(GLenum pname, GLint64 *params)
9700fda98687c2103ada393a6c39640c8efddc7994aJamie Madill{
97153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Queries about context capabilities and maximums are answered by Context.
97253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Queries about current GL state values are answered by State.
9730fda98687c2103ada393a6c39640c8efddc7994aJamie Madill    switch (pname)
9740fda98687c2103ada393a6c39640c8efddc7994aJamie Madill    {
9750fda98687c2103ada393a6c39640c8efddc7994aJamie Madill      case GL_MAX_ELEMENT_INDEX:
976c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang        *params = mCaps.maxElementIndex;
9770fda98687c2103ada393a6c39640c8efddc7994aJamie Madill        break;
9780fda98687c2103ada393a6c39640c8efddc7994aJamie Madill      case GL_MAX_UNIFORM_BLOCK_SIZE:
9793a61c321e7ea779f23a4da72db977286897b1168Geoff Lang        *params = mCaps.maxUniformBlockSize;
9800fda98687c2103ada393a6c39640c8efddc7994aJamie Madill        break;
9810fda98687c2103ada393a6c39640c8efddc7994aJamie Madill      case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
9823a61c321e7ea779f23a4da72db977286897b1168Geoff Lang        *params = mCaps.maxCombinedVertexUniformComponents;
9830fda98687c2103ada393a6c39640c8efddc7994aJamie Madill        break;
9840fda98687c2103ada393a6c39640c8efddc7994aJamie Madill      case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
9853a61c321e7ea779f23a4da72db977286897b1168Geoff Lang        *params = mCaps.maxCombinedFragmentUniformComponents;
9860fda98687c2103ada393a6c39640c8efddc7994aJamie Madill        break;
9870fda98687c2103ada393a6c39640c8efddc7994aJamie Madill      case GL_MAX_SERVER_WAIT_TIMEOUT:
988900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang        *params = mCaps.maxServerWaitTimeout;
9890fda98687c2103ada393a6c39640c8efddc7994aJamie Madill        break;
9900fda98687c2103ada393a6c39640c8efddc7994aJamie Madill      default:
991893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill        UNREACHABLE();
992893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill        break;
9930fda98687c2103ada393a6c39640c8efddc7994aJamie Madill    }
9940fda98687c2103ada393a6c39640c8efddc7994aJamie Madill}
9950fda98687c2103ada393a6c39640c8efddc7994aJamie Madill
9961b2fb85341de62622377aee456523f9805818955Shannon Woodsbool Context::getIndexedIntegerv(GLenum target, GLuint index, GLint *data)
9971b2fb85341de62622377aee456523f9805818955Shannon Woods{
99853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Queries about context capabilities and maximums are answered by Context.
99953a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Queries about current GL state values are answered by State.
100053a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Indexed integer queries all refer to current state, so this function is a
100153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // mere passthrough.
100253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    return mState.getIndexedIntegerv(target, index, data);
10031b2fb85341de62622377aee456523f9805818955Shannon Woods}
10041b2fb85341de62622377aee456523f9805818955Shannon Woods
10051b2fb85341de62622377aee456523f9805818955Shannon Woodsbool Context::getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data)
10061b2fb85341de62622377aee456523f9805818955Shannon Woods{
100753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Queries about context capabilities and maximums are answered by Context.
100853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Queries about current GL state values are answered by State.
100953a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Indexed integer queries all refer to current state, so this function is a
101053a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // mere passthrough.
101153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    return mState.getIndexedInteger64v(target, index, data);
10121b2fb85341de62622377aee456523f9805818955Shannon Woods}
10131b2fb85341de62622377aee456523f9805818955Shannon Woods
1014144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
1015144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
1016bc373e53243e5e45067bbf67702b3aa66bd10dc6shannon.woods%transgaming.com@gtempaccount.com    if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
1017bc373e53243e5e45067bbf67702b3aa66bd10dc6shannon.woods%transgaming.com@gtempaccount.com    {
1018bc373e53243e5e45067bbf67702b3aa66bd10dc6shannon.woods%transgaming.com@gtempaccount.com        *type = GL_INT;
1019bc373e53243e5e45067bbf67702b3aa66bd10dc6shannon.woods%transgaming.com@gtempaccount.com        *numParams = 1;
1020bc373e53243e5e45067bbf67702b3aa66bd10dc6shannon.woods%transgaming.com@gtempaccount.com        return true;
1021bc373e53243e5e45067bbf67702b3aa66bd10dc6shannon.woods%transgaming.com@gtempaccount.com    }
1022bc373e53243e5e45067bbf67702b3aa66bd10dc6shannon.woods%transgaming.com@gtempaccount.com
1023144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
1024144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
1025144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // to the fact that it is stored internally as a float, and so would require conversion
1026893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill    // if returned from Context::getIntegerv. Since this conversion is already implemented
1027144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
1028144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
1029144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // application.
1030144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    switch (pname)
1031144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
1032144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_COMPRESSED_TEXTURE_FORMATS:
1033144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1034144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *type = GL_INT;
1035900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang            *numParams = mCaps.compressedTextureFormats.size();
1036900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang        }
1037900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang        return true;
1038900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang      case GL_PROGRAM_BINARY_FORMATS_OES:
1039900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang        {
1040900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang            *type = GL_INT;
1041900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang            *numParams = mCaps.programBinaryFormats.size();
1042144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1043667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        return true;
1044144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_SHADER_BINARY_FORMATS:
1045144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1046144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *type = GL_INT;
1047900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang            *numParams = mCaps.shaderBinaryFormats.size();
1048144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1049667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        return true;
1050144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_MAX_VERTEX_ATTRIBS:
1051144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_MAX_VERTEX_UNIFORM_VECTORS:
1052144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_MAX_VARYING_VECTORS:
1053144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1054144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
1055144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_MAX_TEXTURE_IMAGE_UNITS:
1056144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1057144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_MAX_RENDERBUFFER_SIZE:
10589790c470600b564b4909cf529833284555613adbshannon.woods%transgaming.com@gtempaccount.com      case GL_MAX_COLOR_ATTACHMENTS_EXT:
1059bc373e53243e5e45067bbf67702b3aa66bd10dc6shannon.woods%transgaming.com@gtempaccount.com      case GL_MAX_DRAW_BUFFERS_EXT:
1060144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_NUM_SHADER_BINARY_FORMATS:
1061144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1062144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_ARRAY_BUFFER_BINDING:
10631e514358eae1c77654cdd3c1efae702cba6bb374Vladimir Vukicevic      //case GL_FRAMEBUFFER_BINDING: // equivalent to DRAW_FRAMEBUFFER_BINDING_ANGLE
10641e514358eae1c77654cdd3c1efae702cba6bb374Vladimir Vukicevic      case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:
10651e514358eae1c77654cdd3c1efae702cba6bb374Vladimir Vukicevic      case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
1066144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_RENDERBUFFER_BINDING:
1067144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_CURRENT_PROGRAM:
1068144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_PACK_ALIGNMENT:
1069144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
1070144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_UNPACK_ALIGNMENT:
1071144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_GENERATE_MIPMAP_HINT:
1072144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
1073144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_RED_BITS:
1074144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_GREEN_BITS:
1075144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_BLUE_BITS:
1076144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_ALPHA_BITS:
1077144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_DEPTH_BITS:
1078144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_BITS:
1079144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_ELEMENT_ARRAY_BUFFER_BINDING:
1080144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_CULL_FACE_MODE:
1081144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_FRONT_FACE:
1082144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_ACTIVE_TEXTURE:
1083144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_FUNC:
1084144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_VALUE_MASK:
1085144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_REF:
1086144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_FAIL:
1087144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_PASS_DEPTH_FAIL:
1088144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_PASS_DEPTH_PASS:
1089144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_BACK_FUNC:
1090144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_BACK_VALUE_MASK:
1091144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_BACK_REF:
1092144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_BACK_FAIL:
1093144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
1094144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_BACK_PASS_DEPTH_PASS:
1095144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_DEPTH_FUNC:
1096144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_BLEND_SRC_RGB:
1097144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_BLEND_SRC_ALPHA:
1098144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_BLEND_DST_RGB:
1099144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_BLEND_DST_ALPHA:
1100144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_BLEND_EQUATION_RGB:
1101144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_BLEND_EQUATION_ALPHA:
1102144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_WRITEMASK:
1103144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_BACK_WRITEMASK:
1104144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_CLEAR_VALUE:
1105144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_SUBPIXEL_BITS:
1106144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_MAX_TEXTURE_SIZE:
1107144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1108144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_SAMPLE_BUFFERS:
1109144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_SAMPLES:
1110144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_IMPLEMENTATION_COLOR_READ_TYPE:
1111144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
1112144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_TEXTURE_BINDING_2D:
1113144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_TEXTURE_BINDING_CUBE_MAP:
1114144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1115144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
1116144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1117144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *type = GL_INT;
1118144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *numParams = 1;
1119144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1120667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        return true;
1121144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_MAX_SAMPLES_ANGLE:
1122144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1123c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang            if (mExtensions.framebufferMultisample)
1124144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            {
1125144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org                *type = GL_INT;
1126144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org                *numParams = 1;
1127144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            }
1128144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            else
1129144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            {
1130144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org                return false;
1131144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            }
1132144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1133667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        return true;
1134158c43846f00a3c283c20898ddaf2e6705b51103Shannon Woods      case GL_PIXEL_PACK_BUFFER_BINDING:
1135158c43846f00a3c283c20898ddaf2e6705b51103Shannon Woods      case GL_PIXEL_UNPACK_BUFFER_BINDING:
1136158c43846f00a3c283c20898ddaf2e6705b51103Shannon Woods        {
1137c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang            if (mExtensions.pixelBufferObject)
1138158c43846f00a3c283c20898ddaf2e6705b51103Shannon Woods            {
1139158c43846f00a3c283c20898ddaf2e6705b51103Shannon Woods                *type = GL_INT;
1140158c43846f00a3c283c20898ddaf2e6705b51103Shannon Woods                *numParams = 1;
1141158c43846f00a3c283c20898ddaf2e6705b51103Shannon Woods            }
1142158c43846f00a3c283c20898ddaf2e6705b51103Shannon Woods            else
1143158c43846f00a3c283c20898ddaf2e6705b51103Shannon Woods            {
1144158c43846f00a3c283c20898ddaf2e6705b51103Shannon Woods                return false;
1145158c43846f00a3c283c20898ddaf2e6705b51103Shannon Woods            }
1146158c43846f00a3c283c20898ddaf2e6705b51103Shannon Woods        }
1147158c43846f00a3c283c20898ddaf2e6705b51103Shannon Woods        return true;
1148144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_MAX_VIEWPORT_DIMS:
1149144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1150144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *type = GL_INT;
1151144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *numParams = 2;
1152144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1153667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        return true;
1154144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_VIEWPORT:
1155144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_SCISSOR_BOX:
1156144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1157144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *type = GL_INT;
1158144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *numParams = 4;
1159144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1160667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        return true;
1161144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_SHADER_COMPILER:
1162144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_SAMPLE_COVERAGE_INVERT:
1163144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_DEPTH_WRITEMASK:
1164144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_CULL_FACE:                // CULL_FACE through DITHER are natural to IsEnabled,
1165144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_POLYGON_OFFSET_FILL:      // but can be retrieved through the Get{Type}v queries.
1166144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as bool-natural
1167144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_SAMPLE_COVERAGE:
1168144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_SCISSOR_TEST:
1169144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_STENCIL_TEST:
1170144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_DEPTH_TEST:
1171144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_BLEND:
1172144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_DITHER:
1173144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_CONTEXT_ROBUST_ACCESS_EXT:
1174144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1175144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *type = GL_BOOL;
1176144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *numParams = 1;
1177144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1178667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        return true;
1179144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_COLOR_WRITEMASK:
1180144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1181144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *type = GL_BOOL;
1182144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *numParams = 4;
1183144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1184667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        return true;
1185144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_POLYGON_OFFSET_FACTOR:
1186144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_POLYGON_OFFSET_UNITS:
1187144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_SAMPLE_COVERAGE_VALUE:
1188144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_DEPTH_CLEAR_VALUE:
1189144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_LINE_WIDTH:
1190144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1191144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *type = GL_FLOAT;
1192144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *numParams = 1;
1193144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1194667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        return true;
1195144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_ALIASED_LINE_WIDTH_RANGE:
1196144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_ALIASED_POINT_SIZE_RANGE:
1197144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_DEPTH_RANGE:
1198144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1199144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *type = GL_FLOAT;
1200144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *numParams = 2;
1201144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1202667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        return true;
1203144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_COLOR_CLEAR_VALUE:
1204144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org      case GL_BLEND_COLOR:
1205144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1206144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *type = GL_FLOAT;
1207144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            *numParams = 4;
1208144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1209667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        return true;
121007ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com      case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1211c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang        if (!mExtensions.maxTextureAnisotropy)
121207ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com        {
121307ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com            return false;
121407ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com        }
121507ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com        *type = GL_FLOAT;
121607ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com        *numParams = 1;
1217667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        return true;
1218667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    }
1219667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com
1220667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    if (mClientVersion < 3)
1221667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    {
1222144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        return false;
1223144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1224144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1225667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    // Check for ES3.0+ parameter names
1226667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    switch (pname)
1227667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    {
122897c3d501704adb4b41a0ef7374f684fb762ee11dshannonwoods@chromium.org      case GL_MAX_UNIFORM_BUFFER_BINDINGS:
122997c3d501704adb4b41a0ef7374f684fb762ee11dshannonwoods@chromium.org      case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1230667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com      case GL_UNIFORM_BUFFER_BINDING:
1231667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com      case GL_TRANSFORM_FEEDBACK_BINDING:
12325117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com      case GL_COPY_READ_BUFFER_BINDING:
12335117188c23be8525da72c7672ff26ce7363824bbshannon.woods%transgaming.com@gtempaccount.com      case GL_COPY_WRITE_BUFFER_BINDING:
1234c416e1cc09f1404d3dbcf23cd55956d37ebe67d2shannon.woods%transgaming.com@gtempaccount.com      case GL_TEXTURE_BINDING_3D:
123590dbc44c79052a9ceaab2c782a67e7d149da5385shannon.woods%transgaming.com@gtempaccount.com      case GL_TEXTURE_BINDING_2D_ARRAY:
1236c1fdf6baa488d6bf4a16d68c5d83caf2c95563dcshannon.woods%transgaming.com@gtempaccount.com      case GL_MAX_3D_TEXTURE_SIZE:
1237a98a8111a4b82a2715de171fcf2c7417a9cbfc6fshannon.woods%transgaming.com@gtempaccount.com      case GL_MAX_ARRAY_TEXTURE_LAYERS:
1238f2d76f80850ed4a7184f33fa0dbfbc0c47144525shannonwoods@chromium.org      case GL_MAX_VERTEX_UNIFORM_BLOCKS:
1239f2d76f80850ed4a7184f33fa0dbfbc0c47144525shannonwoods@chromium.org      case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
1240f2d76f80850ed4a7184f33fa0dbfbc0c47144525shannonwoods@chromium.org      case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1241d3ff90090a11257e4a6fa6d3663d3d2296aba161Geoff Lang      case GL_MAX_VARYING_COMPONENTS:
1242efb3bd1a8397b344fd3a4b7e2e22bb0ac22a0237Jamie Madill      case GL_VERTEX_ARRAY_BINDING:
124338850df8783932ed8dce9f7676141c74d1ff0d55Jamie Madill      case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
124438850df8783932ed8dce9f7676141c74d1ff0d55Jamie Madill      case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
124523c8169f50874a896b96e004f7ec084034f483e0Geoff Lang      case GL_NUM_EXTENSIONS:
1246ee7010d49f0c6a5e4382b6930fbee25638932929Jamie Madill      case GL_MAJOR_VERSION:
1247ee7010d49f0c6a5e4382b6930fbee25638932929Jamie Madill      case GL_MINOR_VERSION:
124813a2f85b8d01c1685d1835bd7f7d734eb13ae60fJamie Madill      case GL_MAX_ELEMENTS_INDICES:
124913a2f85b8d01c1685d1835bd7f7d734eb13ae60fJamie Madill      case GL_MAX_ELEMENTS_VERTICES:
12501b6edcb636b4ed9c473cca9774c5784768f7d346Geoff Lang      case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
12512e5035577c48a5d46dd42cf09539355aeda83074Jamie Madill      case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
12521b6edcb636b4ed9c473cca9774c5784768f7d346Geoff Lang      case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1253667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        {
1254667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com            *type = GL_INT;
1255667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com            *numParams = 1;
1256667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        }
1257667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com        return true;
12580fda98687c2103ada393a6c39640c8efddc7994aJamie Madill
12590fda98687c2103ada393a6c39640c8efddc7994aJamie Madill      case GL_MAX_ELEMENT_INDEX:
12600fda98687c2103ada393a6c39640c8efddc7994aJamie Madill      case GL_MAX_UNIFORM_BLOCK_SIZE:
12610fda98687c2103ada393a6c39640c8efddc7994aJamie Madill      case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
12620fda98687c2103ada393a6c39640c8efddc7994aJamie Madill      case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
12630fda98687c2103ada393a6c39640c8efddc7994aJamie Madill      case GL_MAX_SERVER_WAIT_TIMEOUT:
12640fda98687c2103ada393a6c39640c8efddc7994aJamie Madill        {
12650fda98687c2103ada393a6c39640c8efddc7994aJamie Madill            *type = GL_INT_64_ANGLEX;
12660fda98687c2103ada393a6c39640c8efddc7994aJamie Madill            *numParams = 1;
12670fda98687c2103ada393a6c39640c8efddc7994aJamie Madill        }
12680fda98687c2103ada393a6c39640c8efddc7994aJamie Madill        return true;
12692e5035577c48a5d46dd42cf09539355aeda83074Jamie Madill
12702e5035577c48a5d46dd42cf09539355aeda83074Jamie Madill      case GL_TRANSFORM_FEEDBACK_ACTIVE:
12711b6edcb636b4ed9c473cca9774c5784768f7d346Geoff Lang      case GL_TRANSFORM_FEEDBACK_PAUSED:
12722e5035577c48a5d46dd42cf09539355aeda83074Jamie Madill        {
12732e5035577c48a5d46dd42cf09539355aeda83074Jamie Madill            *type = GL_BOOL;
12742e5035577c48a5d46dd42cf09539355aeda83074Jamie Madill            *numParams = 1;
12752e5035577c48a5d46dd42cf09539355aeda83074Jamie Madill        }
12762e5035577c48a5d46dd42cf09539355aeda83074Jamie Madill        return true;
1277667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    }
1278667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com
1279667a29cf4c8dc2d0ccafd3b0464d2e6b01d087bcshannon.woods%transgaming.com@gtempaccount.com    return false;
1280144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1281144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
12821b2fb85341de62622377aee456523f9805818955Shannon Woodsbool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
12831b2fb85341de62622377aee456523f9805818955Shannon Woods{
12841b2fb85341de62622377aee456523f9805818955Shannon Woods    if (mClientVersion < 3)
12851b2fb85341de62622377aee456523f9805818955Shannon Woods    {
12861b2fb85341de62622377aee456523f9805818955Shannon Woods        return false;
12871b2fb85341de62622377aee456523f9805818955Shannon Woods    }
12881b2fb85341de62622377aee456523f9805818955Shannon Woods
12891b2fb85341de62622377aee456523f9805818955Shannon Woods    switch (target)
12901b2fb85341de62622377aee456523f9805818955Shannon Woods    {
12911b2fb85341de62622377aee456523f9805818955Shannon Woods      case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
12921b2fb85341de62622377aee456523f9805818955Shannon Woods      case GL_UNIFORM_BUFFER_BINDING:
12931b2fb85341de62622377aee456523f9805818955Shannon Woods        {
12941b2fb85341de62622377aee456523f9805818955Shannon Woods            *type = GL_INT;
12951b2fb85341de62622377aee456523f9805818955Shannon Woods            *numParams = 1;
12961b2fb85341de62622377aee456523f9805818955Shannon Woods        }
12971b2fb85341de62622377aee456523f9805818955Shannon Woods        return true;
12981b2fb85341de62622377aee456523f9805818955Shannon Woods      case GL_TRANSFORM_FEEDBACK_BUFFER_START:
12991b2fb85341de62622377aee456523f9805818955Shannon Woods      case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
13001b2fb85341de62622377aee456523f9805818955Shannon Woods      case GL_UNIFORM_BUFFER_START:
13011b2fb85341de62622377aee456523f9805818955Shannon Woods      case GL_UNIFORM_BUFFER_SIZE:
13021b2fb85341de62622377aee456523f9805818955Shannon Woods        {
13031b2fb85341de62622377aee456523f9805818955Shannon Woods            *type = GL_INT_64_ANGLEX;
13041b2fb85341de62622377aee456523f9805818955Shannon Woods            *numParams = 1;
13051b2fb85341de62622377aee456523f9805818955Shannon Woods        }
13061b2fb85341de62622377aee456523f9805818955Shannon Woods    }
13071b2fb85341de62622377aee456523f9805818955Shannon Woods
13081b2fb85341de62622377aee456523f9805818955Shannon Woods    return false;
13091b2fb85341de62622377aee456523f9805818955Shannon Woods}
13101b2fb85341de62622377aee456523f9805818955Shannon Woods
1311144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Applies the render target surface, depth stencil surface, viewport rectangle and
13121298518804934fac7f8ecd37ad58a5ac100cff36daniel@transgaming.com// scissor rectangle to the renderer
131302f18b883992598ffc22c2747720f17da65a330eGeoff Langvoid Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport)
1314144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
131553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    Framebuffer *framebufferObject = mState.getDrawFramebuffer();
131613f7d7dc0b09fd7e508172c7d804ce65219b2bb5Jamie Madill    ASSERT(framebufferObject && framebufferObject->completeness() == GL_FRAMEBUFFER_COMPLETE);
1317144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
13188a8b24c7fc14768f035ea3e68bd5c9cee552566adaniel@transgaming.com    mRenderer->applyRenderTarget(framebufferObject);
13198a8b24c7fc14768f035ea3e68bd5c9cee552566adaniel@transgaming.com
132053a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    float nearZ, farZ;
132153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.getDepthRange(&nearZ, &farZ);
132202f18b883992598ffc22c2747720f17da65a330eGeoff Lang    mRenderer->setViewport(mState.getViewport(), nearZ, farZ, drawMode, mState.getRasterizerState().frontFace,
132302f18b883992598ffc22c2747720f17da65a330eGeoff Lang                           ignoreViewport);
1324144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
132553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mRenderer->setScissorRectangle(mState.getScissor(), mState.isScissorTestEnabled());
1326144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1327144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1328144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Applies the fixed-function state (culling, depth test, alpha blending, stenciling, etc) to the Direct3D 9 device
1329144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::applyState(GLenum drawMode)
1330144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
133153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    Framebuffer *framebufferObject = mState.getDrawFramebuffer();
1332fd39655df035e8a5f7c6feaa97e950cde85a84aeNicolas Capens    int samples = framebufferObject->getSamples();
1333fd39655df035e8a5f7c6feaa97e950cde85a84aeNicolas Capens
133453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    RasterizerState rasterizer = mState.getRasterizerState();
133553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    rasterizer.pointDrawMode = (drawMode == GL_POINTS);
133653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    rasterizer.multiSample = (samples != 0);
133753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods
133853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mRenderer->setRasterizerState(rasterizer);
1339144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
13402e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com    unsigned int mask = 0;
134153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (mState.isSampleCoverageEnabled())
1342144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
134353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        GLclampf coverageValue;
134453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        bool coverageInvert = false;
134553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        mState.getSampleCoverageParams(&coverageValue, &coverageInvert);
134653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        if (coverageValue != 0)
1347144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1348893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill
13492e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com            float threshold = 0.5f;
13502e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com
1351fd39655df035e8a5f7c6feaa97e950cde85a84aeNicolas Capens            for (int i = 0; i < samples; ++i)
1352144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            {
13532e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com                mask <<= 1;
1354144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
135553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods                if ((i + 1) * coverageValue >= threshold)
1356144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org                {
13572e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com                    threshold += 1.0f;
13582e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com                    mask |= 1;
1359144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org                }
1360144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            }
1361144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
13622e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com
136353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        if (coverageInvert)
1364144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
13652e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com            mask = ~mask;
1366144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1367144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
13682e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com    else
1369144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
13702e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com        mask = 0xFFFFFFFF;
1371144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
137253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mRenderer->setBlendState(framebufferObject, mState.getBlendState(), mState.getBlendColor(), mask);
13732e25864460c1561c5a74a0033b4fc9946f8770d1daniel@transgaming.com
137453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mRenderer->setDepthStencilState(mState.getDepthStencilState(), mState.getStencilRef(), mState.getStencilBackRef(),
137553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods                                    rasterizer.frontFace == GL_CCW);
1376144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1377144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1378144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Applies the shaders and shader constants to the Direct3D 9 device
13794c5c6bbb82f96de2d3abe0c7c7c7d72fba5217c9Geoff Langvoid Context::applyShaders(ProgramBinary *programBinary, bool transformFeedbackActive)
1380144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
138153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    const VertexAttribute *vertexAttributes = mState.getVertexArray()->getVertexAttributes();
1382c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill
13835b5d1244d9089bb4a9e74cc34265a524b84ec258Jamie Madill    VertexFormat inputLayout[MAX_VERTEX_ATTRIBS];
138453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    VertexFormat::GetInputLayout(inputLayout, programBinary, vertexAttributes, mState.getVertexAttribCurrentValues());
1385c5a8300026be5bd38ca022211ce7e078e92b9377Jamie Madill
138653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    const Framebuffer *fbo = mState.getDrawFramebuffer();
138704fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang
138853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mRenderer->applyShaders(programBinary, inputLayout, fbo, mState.getRasterizerState().rasterizerDiscard, transformFeedbackActive);
13890550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang
1390144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    programBinary->applyUniforms();
1391144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1392144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
139376b10c9a9735c27627065d9fe68f78374ef48934Geoff Langvoid Context::generateSwizzles(ProgramBinary *programBinary, SamplerType type)
1394e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang{
139543b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang    size_t samplerRange = programBinary->getUsedSamplerRange(type);
139676b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang
139743b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang    for (size_t i = 0; i < samplerRange; i++)
1398e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang    {
139976b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        GLenum textureType = programBinary->getSamplerTextureType(type, i);
140076b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        GLint textureUnit = programBinary->getSamplerMapping(type, i, getCaps());
140143b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang        if (textureUnit != -1)
1402e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang        {
140376b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang            Texture* texture = getSamplerTexture(textureUnit, textureType);
140476b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang            if (texture->getSamplerState().swizzleRequired())
140543b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang            {
140676b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang                mRenderer->generateSwizzle(texture);
140743b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang            }
140843b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang        }
1409e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang    }
1410e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang}
1411e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang
141276b10c9a9735c27627065d9fe68f78374ef48934Geoff Langvoid Context::generateSwizzles(ProgramBinary *programBinary)
1413e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang{
141476b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    generateSwizzles(programBinary, SAMPLER_VERTEX);
141576b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    generateSwizzles(programBinary, SAMPLER_PIXEL);
1416e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang}
1417e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang
1418e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang// For each Direct3D sampler of either the pixel or vertex stage,
1419144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// looks up the corresponding OpenGL texture image unit and texture type,
1420144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// and sets the texture and its addressing/filtering state (or NULL when inactive).
142176b10c9a9735c27627065d9fe68f78374ef48934Geoff Langvoid Context::applyTextures(ProgramBinary *programBinary, SamplerType shaderType,
142276b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang                            const FramebufferTextureSerialArray &framebufferSerials, size_t framebufferSerialCount)
1423144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
142476b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    size_t samplerRange = programBinary->getUsedSamplerRange(shaderType);
142576b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    for (size_t samplerIndex = 0; samplerIndex < samplerRange; samplerIndex++)
1426144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
142776b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        GLenum textureType = programBinary->getSamplerTextureType(shaderType, samplerIndex);
142876b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        GLint textureUnit = programBinary->getSamplerMapping(shaderType, samplerIndex, getCaps());
142976b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        if (textureUnit != -1)
1430144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
143176b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang            SamplerState sampler;
143276b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang            Texture* texture = getSamplerTexture(textureUnit, textureType);
143376b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang            texture->getSamplerStateWithNativeOffset(&sampler);
143476b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang
143576b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang            Sampler *samplerObject = mState.getSampler(textureUnit);
143676b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang            if (samplerObject)
143776b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang            {
143876b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang                samplerObject->getState(&sampler);
143976b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang            }
144076b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang
144143b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang            // TODO: std::binary_search may become unavailable using older versions of GCC
14426053a52e8d529c1bc7d35a8f92430bf8d93938b2Brandon Jones            if (texture->isSamplerComplete(sampler, mTextureCaps, mExtensions, mClientVersion) &&
144343b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang                !std::binary_search(framebufferSerials.begin(), framebufferSerials.begin() + framebufferSerialCount, texture->getTextureSerial()))
1444144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            {
144543b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang                mRenderer->setSamplerState(shaderType, samplerIndex, sampler);
144643b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang                mRenderer->setTexture(shaderType, samplerIndex, texture);
1447144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            }
1448e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com            else
1449e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com            {
145076b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang                // Texture is not sampler complete or it is in use by the framebuffer.  Bind the incomplete texture.
145143b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang                Texture *incompleteTexture = getIncompleteTexture(textureType);
145243b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang                mRenderer->setTexture(shaderType, samplerIndex, incompleteTexture);
1453e33c8bfa0799f8dcd74a0ac88aacd4247f302386daniel@transgaming.com            }
1454144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1455144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        else
1456144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
145776b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang            // No texture bound to this slot even though it is used by the shader, bind a NULL texture
145843b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang            mRenderer->setTexture(shaderType, samplerIndex, NULL);
1459144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1460144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1461144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
146276b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    // Set all the remaining textures to NULL
146376b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    size_t samplerCount = (shaderType == SAMPLER_PIXEL) ? mCaps.maxTextureImageUnits
146476b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang                                                        : mCaps.maxVertexTextureImageUnits;
146576b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    for (size_t samplerIndex = samplerRange; samplerIndex < samplerCount; samplerIndex++)
1466144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
146743b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang        mRenderer->setTexture(shaderType, samplerIndex, NULL);
1468144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1469144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1470144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
147176b10c9a9735c27627065d9fe68f78374ef48934Geoff Langvoid Context::applyTextures(ProgramBinary *programBinary)
147276b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang{
147376b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    FramebufferTextureSerialArray framebufferSerials;
147476b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    size_t framebufferSerialCount = getBoundFramebufferTextureSerials(&framebufferSerials);
147576b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang
147676b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    applyTextures(programBinary, SAMPLER_VERTEX, framebufferSerials, framebufferSerialCount);
147776b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    applyTextures(programBinary, SAMPLER_PIXEL, framebufferSerials, framebufferSerialCount);
147876b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang}
147976b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang
14801bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.orgbool Context::applyUniformBuffers()
14811bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org{
148253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    Program *programObject = getProgram(mState.getCurrentProgramId());
14831bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org    ProgramBinary *programBinary = programObject->getProgramBinary();
14841bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org
14855b5d1244d9089bb4a9e74cc34265a524b84ec258Jamie Madill    std::vector<Buffer*> boundBuffers;
14861bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org
14871bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org    for (unsigned int uniformBlockIndex = 0; uniformBlockIndex < programBinary->getActiveUniformBlockCount(); uniformBlockIndex++)
14881bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org    {
14891bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org        GLuint blockBinding = programObject->getUniformBlockBinding(uniformBlockIndex);
149053a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods
149153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        if (mState.getIndexedUniformBuffer(blockBinding)->id() == 0)
14921bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org        {
14931bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org            // undefined behaviour
14941bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org            return false;
14951bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org        }
14961bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org        else
14971bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org        {
149853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods            Buffer *uniformBuffer = mState.getIndexedUniformBuffer(blockBinding);
14991bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org            ASSERT(uniformBuffer);
15001bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org            boundBuffers.push_back(uniformBuffer);
15011bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org        }
15021bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org    }
15031bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org
150443a53e2434f4fe042bee061fc369a93314b710deBrandon Jones    return programBinary->applyUniformBuffers(boundBuffers, getCaps());
15051bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org}
15061bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org
1507eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Langbool Context::applyTransformFeedbackBuffers()
1508eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang{
150953a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    TransformFeedback *curTransformFeedback = mState.getCurrentTransformFeedback();
1510eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1511eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    {
1512eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        Buffer *transformFeedbackBuffers[IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS];
1513eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        GLintptr transformFeedbackOffsets[IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS];
1514eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        for (size_t i = 0; i < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS; i++)
1515eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        {
151653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods            transformFeedbackBuffers[i] = mState.getIndexedTransformFeedbackBuffer(i);
151753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods            transformFeedbackOffsets[i] = mState.getIndexedTransformFeedbackBufferOffset(i);
1518eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        }
1519eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        mRenderer->applyTransformFeedbackBuffers(transformFeedbackBuffers, transformFeedbackOffsets);
1520eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        return true;
1521eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    }
1522eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    else
1523eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    {
1524eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        return false;
1525eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    }
1526eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang}
1527144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1528eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Langvoid Context::markTransformFeedbackUsage()
1529eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang{
1530eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    for (size_t i = 0; i < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS; i++)
1531eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    {
153253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        Buffer *buffer = mState.getIndexedTransformFeedbackBuffer(i);
1533eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        if (buffer)
1534eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        {
1535eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang            buffer->markTransformFeedbackUsage();
1536eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        }
1537eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    }
1538eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang}
1539144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1540cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff LangError Context::clear(GLbitfield mask)
1541144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
154253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (mState.isRasterizerDiscardEnabled())
15430550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    {
1544cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff Lang        return Error(GL_NO_ERROR);
15450550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    }
15460550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang
154753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    ClearParameters clearParams = mState.getClearParameters(mask);
1548144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
154902f18b883992598ffc22c2747720f17da65a330eGeoff Lang    applyRenderTarget(GL_TRIANGLES, true);   // Clips the clear to the scissor rectangle but not the viewport
1550144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1551cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff Lang    return mRenderer->clear(clearParams, mState.getDrawFramebuffer());
1552144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1553144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1554cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff LangError Context::clearBufferfv(GLenum buffer, int drawbuffer, const float *values)
155542359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang{
155653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (mState.isRasterizerDiscardEnabled())
15570550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    {
1558cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff Lang        return Error(GL_NO_ERROR);
15590550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    }
156042359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
15610550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    // glClearBufferfv can be called to clear the color buffer or depth buffer
156253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    ClearParameters clearParams = mState.getClearParameters(0);
156342359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
156442359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    if (buffer == GL_COLOR)
156542359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    {
156642359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
156742359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        {
156842359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang            clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
156942359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        }
157042359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        clearParams.colorFClearValue = ColorF(values[0], values[1], values[2], values[3]);
157142359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        clearParams.colorClearType = GL_FLOAT;
157242359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    }
157342359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
157442359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    if (buffer == GL_DEPTH)
157542359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    {
157642359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        clearParams.clearDepth = true;
157742359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        clearParams.depthClearValue = values[0];
157842359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    }
157942359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
158002f18b883992598ffc22c2747720f17da65a330eGeoff Lang    applyRenderTarget(GL_TRIANGLES, true);   // Clips the clear to the scissor rectangle but not the viewport
158142359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
1582cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff Lang    return mRenderer->clear(clearParams, mState.getDrawFramebuffer());
158342359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang}
158442359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
1585cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff LangError Context::clearBufferuiv(GLenum buffer, int drawbuffer, const unsigned int *values)
158642359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang{
158753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (mState.isRasterizerDiscardEnabled())
15880550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    {
1589cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff Lang        return Error(GL_NO_ERROR);
15900550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    }
159142359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
15920550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    // glClearBufferuv can only be called to clear a color buffer
159353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    ClearParameters clearParams = mState.getClearParameters(0);
159442359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
159542359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    {
159642359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
159742359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    }
159842359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    clearParams.colorUIClearValue = ColorUI(values[0], values[1], values[2], values[3]);
159942359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    clearParams.colorClearType = GL_UNSIGNED_INT;
160042359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
160102f18b883992598ffc22c2747720f17da65a330eGeoff Lang    applyRenderTarget(GL_TRIANGLES, true);   // Clips the clear to the scissor rectangle but not the viewport
160242359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
1603cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff Lang    return mRenderer->clear(clearParams, mState.getDrawFramebuffer());
160442359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang}
160542359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
1606cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff LangError Context::clearBufferiv(GLenum buffer, int drawbuffer, const int *values)
160742359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang{
160853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (mState.isRasterizerDiscardEnabled())
16090550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    {
1610cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff Lang        return Error(GL_NO_ERROR);
16110550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    }
161242359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
16130550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    // glClearBufferfv can be called to clear the color buffer or stencil buffer
161453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    ClearParameters clearParams = mState.getClearParameters(0);
161542359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
161642359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    if (buffer == GL_COLOR)
161742359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    {
161842359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        for (unsigned int i = 0; i < ArraySize(clearParams.clearColor); i++)
161942359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        {
162042359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang            clearParams.clearColor[i] = (drawbuffer == static_cast<int>(i));
162142359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        }
162242359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        clearParams.colorIClearValue = ColorI(values[0], values[1], values[2], values[3]);
162342359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        clearParams.colorClearType = GL_INT;
162442359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    }
162542359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
162642359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    if (buffer == GL_STENCIL)
162742359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    {
162842359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        clearParams.clearStencil = true;
162942359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang        clearParams.stencilClearValue = values[1];
163042359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    }
163142359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
163202f18b883992598ffc22c2747720f17da65a330eGeoff Lang    applyRenderTarget(GL_TRIANGLES, true);   // Clips the clear to the scissor rectangle but not the viewport
163342359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
1634cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff Lang    return mRenderer->clear(clearParams, mState.getDrawFramebuffer());
163542359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang}
163642359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
1637cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff LangError Context::clearBufferfi(GLenum buffer, int drawbuffer, float depth, int stencil)
163842359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang{
163953a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (mState.isRasterizerDiscardEnabled())
16400550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    {
1641cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff Lang        return Error(GL_NO_ERROR);
16420550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    }
164342359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
16440550d0389a59a50a1df0df3484ecefc864715e26Geoff Lang    // glClearBufferfi can only be called to clear a depth stencil buffer
164553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    ClearParameters clearParams = mState.getClearParameters(0);
164642359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    clearParams.clearDepth = true;
164742359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    clearParams.depthClearValue = depth;
164842359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    clearParams.clearStencil = true;
164942359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang    clearParams.stencilClearValue = stencil;
165042359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
165102f18b883992598ffc22c2747720f17da65a330eGeoff Lang    applyRenderTarget(GL_TRIANGLES, true);   // Clips the clear to the scissor rectangle but not the viewport
165242359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
1653cc79b8c6b3c713904fa6d0613018b3e2f7fd8eacGeoff Lang    return mRenderer->clear(clearParams, mState.getDrawFramebuffer());
165442359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang}
165542359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
165663d2fc7f40d626342a0f9a82457b3fe0a81efca7Geoff LangError Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
165763d2fc7f40d626342a0f9a82457b3fe0a81efca7Geoff Lang                          GLenum format, GLenum type, GLsizei *bufSize, void* pixels)
165842359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang{
16595b5d1244d9089bb4a9e74cc34265a524b84ec258Jamie Madill    Framebuffer *framebuffer = mState.getReadFramebuffer();
166042359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
16615d601382b51c29d1670b58c01360416bd929842dGeoff Lang    GLenum sizedInternalFormat = GetSizedInternalFormat(format, type);
16625d601382b51c29d1670b58c01360416bd929842dGeoff Lang    const InternalFormat &sizedFormatInfo = GetInternalFormatInfo(sizedInternalFormat);
16635d601382b51c29d1670b58c01360416bd929842dGeoff Lang    GLuint outputPitch = sizedFormatInfo.computeRowPitch(type, width, mState.getPackAlignment());
166442359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
166563d2fc7f40d626342a0f9a82457b3fe0a81efca7Geoff Lang    return mRenderer->readPixels(framebuffer, x, y, width, height, format, type, outputPitch, mState.getPackState(),
166663d2fc7f40d626342a0f9a82457b3fe0a81efca7Geoff Lang                                 reinterpret_cast<uint8_t*>(pixels));
166742359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang}
166842359ca9f0b51aca23f07439109bd28a83c7f998Geoff Lang
1669144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instances)
1670144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
167153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    ASSERT(mState.getCurrentProgramId() != 0);
1672144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
167353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    ProgramBinary *programBinary = mState.getCurrentProgramBinary();
1674d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill    programBinary->updateSamplerMapping();
1675e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang
167676b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    generateSwizzles(programBinary);
1677e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang
167891207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com    if (!mRenderer->applyPrimitiveType(mode, count))
1679144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
1680144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        return;
1681144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1682144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
168302f18b883992598ffc22c2747720f17da65a330eGeoff Lang    applyRenderTarget(mode, false);
1684144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    applyState(mode);
1685144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1686f7100b981f0856b238252e6052509eecf8e5adedGeoff Lang    Error error = mRenderer->applyVertexBuffer(programBinary, mState.getVertexArray()->getVertexAttributes(), mState.getVertexAttribCurrentValues(), first, count, instances);
1687f7100b981f0856b238252e6052509eecf8e5adedGeoff Lang    if (error.isError())
1688144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
1689f7100b981f0856b238252e6052509eecf8e5adedGeoff Lang        return gl::error(error.getCode());
1690144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1691144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1692eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    bool transformFeedbackActive = applyTransformFeedbackBuffers();
1693eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang
16944c5c6bbb82f96de2d3abe0c7c7c7d72fba5217c9Geoff Lang    applyShaders(programBinary, transformFeedbackActive);
169543b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang
169676b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    applyTextures(programBinary);
1697144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
16981bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org    if (!applyUniformBuffers())
16991bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org    {
17001bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org        return;
17011bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org    }
17021bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org
1703087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com    if (!skipDraw(mode))
1704144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
17054c5c6bbb82f96de2d3abe0c7c7c7d72fba5217c9Geoff Lang        mRenderer->drawArrays(mode, count, instances, transformFeedbackActive);
1706eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang
1707eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        if (transformFeedbackActive)
1708eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        {
1709eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang            markTransformFeedbackUsage();
1710eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang        }
1711144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1712144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1713144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
17142b97681b9ac01909bc60f5c6caecef3599b2acf9Jamie Madillvoid Context::drawElements(GLenum mode, GLsizei count, GLenum type,
17152b97681b9ac01909bc60f5c6caecef3599b2acf9Jamie Madill                           const GLvoid *indices, GLsizei instances,
17162b97681b9ac01909bc60f5c6caecef3599b2acf9Jamie Madill                           const rx::RangeUI &indexRange)
1717144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
171853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    ASSERT(mState.getCurrentProgramId() != 0);
1719e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang
172053a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    ProgramBinary *programBinary = mState.getCurrentProgramBinary();
1721d4cfa57df4df85546a969f66ec50d364f6e6d4feJamie Madill    programBinary->updateSamplerMapping();
1722e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang
172376b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    generateSwizzles(programBinary);
1724e2e0ce0cd1b4b1845c5df4fc87d75b36ef6a8d6cGeoff Lang
172591207b79c85830aff4420dea395fb12ff20c3f4edaniel@transgaming.com    if (!mRenderer->applyPrimitiveType(mode, count))
1726144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
1727144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        return;
1728144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1729144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
173002f18b883992598ffc22c2747720f17da65a330eGeoff Lang    applyRenderTarget(mode, false);
1731144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    applyState(mode);
1732144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
173353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    VertexArray *vao = mState.getVertexArray();
1734312404870905e1eff46e21632c1c2f2143af4694daniel@transgaming.com    rx::TranslatedIndexData indexInfo;
17352b97681b9ac01909bc60f5c6caecef3599b2acf9Jamie Madill    indexInfo.indexRange = indexRange;
1736c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang    Error error = mRenderer->applyIndexBuffer(indices, vao->getElementArrayBuffer(), count, mode, type, &indexInfo);
1737c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang    if (error.isError())
1738144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
1739c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang        return gl::error(error.getCode());
1740144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1741144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
174239b434637523ef3a8f6b3e984979022af8379d10Jamie Madill    GLsizei vertexCount = indexInfo.indexRange.length() + 1;
1743f7100b981f0856b238252e6052509eecf8e5adedGeoff Lang    error = mRenderer->applyVertexBuffer(programBinary, vao->getVertexAttributes(),
1744f7100b981f0856b238252e6052509eecf8e5adedGeoff Lang                                         mState.getVertexAttribCurrentValues(),
1745f7100b981f0856b238252e6052509eecf8e5adedGeoff Lang                                         indexInfo.indexRange.start, vertexCount, instances);
1746f7100b981f0856b238252e6052509eecf8e5adedGeoff Lang    if (error.isError())
1747144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
1748f7100b981f0856b238252e6052509eecf8e5adedGeoff Lang        return gl::error(error.getCode());
1749144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1750144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1751eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    bool transformFeedbackActive = applyTransformFeedbackBuffers();
1752eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    // Transform feedback is not allowed for DrawElements, this error should have been caught at the API validation
1753eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    // layer.
1754eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang    ASSERT(!transformFeedbackActive);
1755eeba6e1e88a04ab30db442c2af77bf53034ef332Geoff Lang
17564c5c6bbb82f96de2d3abe0c7c7c7d72fba5217c9Geoff Lang    applyShaders(programBinary, transformFeedbackActive);
175743b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang
175876b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    applyTextures(programBinary);
1759144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
17601bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org    if (!applyUniformBuffers())
17611bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org    {
17621bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org        return;
17631bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org    }
17641bddfb984b4ce6f8422a877097e60aca956f5661shannonwoods@chromium.org
1765087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com    if (!skipDraw(mode))
1766144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
176757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill        mRenderer->drawElements(mode, count, type, indices, vao->getElementArrayBuffer(), indexInfo, instances);
1768144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1769144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1770144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1771144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Implements glFlush when block is false, glFinish when block is true
1772144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::sync(bool block)
1773144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
1774ef21ab295564e9577d30fb389eec67ca71b42be1daniel@transgaming.com    mRenderer->sync(block);
1775144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1776144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1777da5777cf9f131dbafcf91c88026624545db2cc87Geoff Langvoid Context::recordError(const Error &error)
1778144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
1779da5777cf9f131dbafcf91c88026624545db2cc87Geoff Lang    if (error.isError())
1780da5777cf9f131dbafcf91c88026624545db2cc87Geoff Lang    {
1781da5777cf9f131dbafcf91c88026624545db2cc87Geoff Lang        mErrors.insert(error.getCode());
1782da5777cf9f131dbafcf91c88026624545db2cc87Geoff Lang    }
1783144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1784144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1785144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// Get one of the recorded errors and clear its flag, if any.
1786144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org// [OpenGL ES 2.0.24] section 2.5 page 13.
1787144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLenum Context::getError()
1788144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
1789da5777cf9f131dbafcf91c88026624545db2cc87Geoff Lang    if (mErrors.empty())
1790144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
1791da5777cf9f131dbafcf91c88026624545db2cc87Geoff Lang        return GL_NO_ERROR;
1792144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1793da5777cf9f131dbafcf91c88026624545db2cc87Geoff Lang    else
1794144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
1795da5777cf9f131dbafcf91c88026624545db2cc87Geoff Lang        GLenum error = *mErrors.begin();
1796da5777cf9f131dbafcf91c88026624545db2cc87Geoff Lang        mErrors.erase(mErrors.begin());
1797da5777cf9f131dbafcf91c88026624545db2cc87Geoff Lang        return error;
1798144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1799144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1800144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1801144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgGLenum Context::getResetStatus()
1802144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
1803ddd6c80eaf97858d74d2e2effca558051fac5481shannon.woods@transgaming.com    if (mResetStatus == GL_NO_ERROR && !mContextLost)
1804144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
1805f688c0d18c25940336d83e37befe76ead2844962daniel@transgaming.com        // mResetStatus will be set by the markContextLost callback
1806f688c0d18c25940336d83e37befe76ead2844962daniel@transgaming.com        // in the case a notification is sent
1807f688c0d18c25940336d83e37befe76ead2844962daniel@transgaming.com        mRenderer->testDeviceLost(true);
1808144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1809144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1810144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    GLenum status = mResetStatus;
1811144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1812144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (mResetStatus != GL_NO_ERROR)
1813144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
1814ddd6c80eaf97858d74d2e2effca558051fac5481shannon.woods@transgaming.com        ASSERT(mContextLost);
1815ddd6c80eaf97858d74d2e2effca558051fac5481shannon.woods@transgaming.com
1816621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com        if (mRenderer->testDeviceResettable())
1817144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1818144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            mResetStatus = GL_NO_ERROR;
1819144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1820144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1821893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill
1822144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return status;
1823144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1824144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1825144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgbool Context::isResetNotificationEnabled()
1826144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
1827144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
1828144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1829144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1830daea4b4584cdbd8c82dd9946eb07a32ab2f278b7shannon.woods%transgaming.com@gtempaccount.comint Context::getClientVersion() const
1831daea4b4584cdbd8c82dd9946eb07a32ab2f278b7shannon.woods%transgaming.com@gtempaccount.com{
1832daea4b4584cdbd8c82dd9946eb07a32ab2f278b7shannon.woods%transgaming.com@gtempaccount.com    return mClientVersion;
1833daea4b4584cdbd8c82dd9946eb07a32ab2f278b7shannon.woods%transgaming.com@gtempaccount.com}
1834daea4b4584cdbd8c82dd9946eb07a32ab2f278b7shannon.woods%transgaming.com@gtempaccount.com
1835cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Langconst Caps &Context::getCaps() const
1836cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang{
1837c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    return mCaps;
1838c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang}
1839c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang
1840c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Langconst TextureCapsMap &Context::getTextureCaps() const
1841c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang{
1842c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    return mTextureCaps;
1843c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang}
1844c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang
1845c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Langconst Extensions &Context::getExtensions() const
1846c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang{
1847c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    return mExtensions;
1848cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang}
1849cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang
1850893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madillvoid Context::getCurrentReadFormatType(GLenum *internalFormat, GLenum *format, GLenum *type)
185142944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com{
185253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    Framebuffer *framebuffer = mState.getReadFramebuffer();
1853893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill    ASSERT(framebuffer && framebuffer->completeness() == GL_FRAMEBUFFER_COMPLETE);
185442944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com
18553c7fa226aeb81469b93142b54e339f13a46ab835Jamie Madill    FramebufferAttachment *attachment = framebuffer->getReadColorbuffer();
18563c7fa226aeb81469b93142b54e339f13a46ab835Jamie Madill    ASSERT(attachment);
185742944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com
18585d601382b51c29d1670b58c01360416bd929842dGeoff Lang    GLenum actualFormat = attachment->getActualFormat();
18595d601382b51c29d1670b58c01360416bd929842dGeoff Lang    const InternalFormat &actualFormatInfo = GetInternalFormatInfo(actualFormat);
18605d601382b51c29d1670b58c01360416bd929842dGeoff Lang
18615d601382b51c29d1670b58c01360416bd929842dGeoff Lang    *internalFormat = actualFormat;
18625d601382b51c29d1670b58c01360416bd929842dGeoff Lang    *format = actualFormatInfo.format;
18635d601382b51c29d1670b58c01360416bd929842dGeoff Lang    *type = actualFormatInfo.type;
186442944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com}
186542944b02334905a221eaf15f4f3d14747a60ee91daniel@transgaming.com
186653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woodsvoid Context::detachTexture(GLuint texture)
186753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods{
186853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Simple pass-through to State's detachTexture method, as textures do not require
186953a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // allocation map management either here or in the resource manager at detach time.
187053a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Zero textures are held by the Context, and we don't attempt to request them from
187153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // the State.
187253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.detachTexture(texture);
187353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods}
187453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods
1875144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::detachBuffer(GLuint buffer)
1876144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
187753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Buffer detachment is handled by Context, because the buffer must also be
187853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // attached from any VAOs in existence, and Context holds the VAO map.
187953a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods
1880144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // [OpenGL ES 2.0.24] section 2.9 page 22:
1881144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // If a buffer object is deleted while it is bound, all bindings to that object in the current context
1882144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // (i.e. in the thread that called Delete-Buffers) are reset to zero.
1883144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
188453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.removeArrayBufferBinding(buffer);
1885144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
188657a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    // mark as freed among the vertex array objects
188757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    for (auto vaoIt = mVertexArrayMap.begin(); vaoIt != mVertexArrayMap.end(); vaoIt++)
1888144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
188957a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill        vaoIt->second->detachBuffer(buffer);
1890144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1891144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1892144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1893144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::detachFramebuffer(GLuint framebuffer)
1894144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
189553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Framebuffer detachment is handled by Context, because 0 is a valid
189653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Framebuffer object, and a pointer to it must be passed from Context
189753a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // to State at binding time.
189853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods
1899144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // [OpenGL ES 2.0.24] section 4.4 page 107:
1900144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though
1901144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    // BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero.
1902144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
190353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (mState.removeReadFramebufferBinding(framebuffer))
1904144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
1905144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        bindReadFramebuffer(0);
1906144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1907144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
190853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (mState.removeDrawFramebufferBinding(framebuffer))
1909144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
1910144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        bindDrawFramebuffer(0);
1911144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
1912144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1913144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1914144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::detachRenderbuffer(GLuint renderbuffer)
1915144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
191653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.detachRenderbuffer(renderbuffer);
1917144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
1918144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
191957a8972e5ddf7611860d9767c8aed4793c3929afJamie Madillvoid Context::detachVertexArray(GLuint vertexArray)
192057a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill{
192153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // Vertex array detachment is handled by Context, because 0 is a valid
192253a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // VAO, and a pointer to it must be passed from Context to State at
192353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    // binding time.
192453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods
192557a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    // [OpenGL ES 3.0.2] section 2.10 page 43:
192657a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    // If a vertex array object that is currently bound is deleted, the binding
192757a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    // for that object reverts to zero and the default vertex array becomes current.
192853a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    if (mState.removeVertexArrayBinding(vertexArray))
192957a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    {
193057a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill        bindVertexArray(0);
193157a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill    }
193257a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill}
193357a8972e5ddf7611860d9767c8aed4793c3929afJamie Madill
1934c8058451c87ec298683bf484813016b20bf36777Geoff Langvoid Context::detachTransformFeedback(GLuint transformFeedback)
1935c8058451c87ec298683bf484813016b20bf36777Geoff Lang{
193653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.detachTransformFeedback(transformFeedback);
1937c8058451c87ec298683bf484813016b20bf36777Geoff Lang}
1938c8058451c87ec298683bf484813016b20bf36777Geoff Lang
1939dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madillvoid Context::detachSampler(GLuint sampler)
1940dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{
194153a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.detachSampler(sampler);
1942dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill}
1943dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill
194476b10c9a9735c27627065d9fe68f78374ef48934Geoff LangTexture *Context::getIncompleteTexture(GLenum type)
1945144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
194676b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    if (mIncompleteTextures.find(type) == mIncompleteTextures.end())
1947144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
194888f18f458dec5c2aff302db93c57e51d89fbffa2Jamie Madill        const GLubyte color[] = { 0, 0, 0, 255 };
194988f18f458dec5c2aff302db93c57e51d89fbffa2Jamie Madill        const PixelUnpackState incompleteUnpackState(1);
1950144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
195176b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang        Texture* t = NULL;
1952144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        switch (type)
1953144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        {
1954144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org          default:
1955144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            UNREACHABLE();
1956144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            // default falls through to TEXTURE_2D
1957144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
195876b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang          case GL_TEXTURE_2D:
1959144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            {
19606053a52e8d529c1bc7d35a8f92430bf8d93938b2Brandon Jones                Texture2D *incomplete2d = new Texture2D(mRenderer->createTexture(GL_TEXTURE_2D), Texture::INCOMPLETE_TEXTURE_ID);
196188f18f458dec5c2aff302db93c57e51d89fbffa2Jamie Madill                incomplete2d->setImage(0, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
1962144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org                t = incomplete2d;
1963144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            }
1964144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            break;
1965144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
196676b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang          case GL_TEXTURE_CUBE_MAP:
1967144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            {
19686053a52e8d529c1bc7d35a8f92430bf8d93938b2Brandon Jones              TextureCubeMap *incompleteCube = new TextureCubeMap(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), Texture::INCOMPLETE_TEXTURE_ID);
1969144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
197088f18f458dec5c2aff302db93c57e51d89fbffa2Jamie Madill              incompleteCube->setImagePosX(0, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
197188f18f458dec5c2aff302db93c57e51d89fbffa2Jamie Madill              incompleteCube->setImageNegX(0, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
197288f18f458dec5c2aff302db93c57e51d89fbffa2Jamie Madill              incompleteCube->setImagePosY(0, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
197388f18f458dec5c2aff302db93c57e51d89fbffa2Jamie Madill              incompleteCube->setImageNegY(0, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
197488f18f458dec5c2aff302db93c57e51d89fbffa2Jamie Madill              incompleteCube->setImagePosZ(0, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
197588f18f458dec5c2aff302db93c57e51d89fbffa2Jamie Madill              incompleteCube->setImageNegZ(0, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
1976144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
1977144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org              t = incompleteCube;
1978144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            }
1979144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org            break;
198018029cdc7864d063a580ac1e66de81081abf1d2bshannonwoods@chromium.org
198176b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang          case GL_TEXTURE_3D:
198218029cdc7864d063a580ac1e66de81081abf1d2bshannonwoods@chromium.org            {
19836053a52e8d529c1bc7d35a8f92430bf8d93938b2Brandon Jones                Texture3D *incomplete3d = new Texture3D(mRenderer->createTexture(GL_TEXTURE_3D), Texture::INCOMPLETE_TEXTURE_ID);
198488f18f458dec5c2aff302db93c57e51d89fbffa2Jamie Madill                incomplete3d->setImage(0, 1, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
198518029cdc7864d063a580ac1e66de81081abf1d2bshannonwoods@chromium.org
198618029cdc7864d063a580ac1e66de81081abf1d2bshannonwoods@chromium.org                t = incomplete3d;
198718029cdc7864d063a580ac1e66de81081abf1d2bshannonwoods@chromium.org            }
198818029cdc7864d063a580ac1e66de81081abf1d2bshannonwoods@chromium.org            break;
198918029cdc7864d063a580ac1e66de81081abf1d2bshannonwoods@chromium.org
199076b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang          case GL_TEXTURE_2D_ARRAY:
199118029cdc7864d063a580ac1e66de81081abf1d2bshannonwoods@chromium.org            {
19926053a52e8d529c1bc7d35a8f92430bf8d93938b2Brandon Jones                Texture2DArray *incomplete2darray = new Texture2DArray(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), Texture::INCOMPLETE_TEXTURE_ID);
199388f18f458dec5c2aff302db93c57e51d89fbffa2Jamie Madill                incomplete2darray->setImage(0, 1, 1, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
199418029cdc7864d063a580ac1e66de81081abf1d2bshannonwoods@chromium.org
199518029cdc7864d063a580ac1e66de81081abf1d2bshannonwoods@chromium.org                t = incomplete2darray;
199618029cdc7864d063a580ac1e66de81081abf1d2bshannonwoods@chromium.org            }
199718029cdc7864d063a580ac1e66de81081abf1d2bshannonwoods@chromium.org            break;
1998144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        }
1999144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2000144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        mIncompleteTextures[type].set(t);
2001144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
2002144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
200376b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang    return mIncompleteTextures[type].get();
2004144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2005144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2006087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.combool Context::skipDraw(GLenum drawMode)
2007144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
2008087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com    if (drawMode == GL_POINTS)
2009087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com    {
2010087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com        // ProgramBinary assumes non-point rendering if gl_PointSize isn't written,
2011087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com        // which affects varying interpolation. Since the value of gl_PointSize is
2012087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com        // undefined when not written, just skip drawing to avoid unexpected results.
201353a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        if (!mState.getCurrentProgramBinary()->usesPointSize())
2014087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com        {
2015893ab0878d3358c45ced6a6fb048ea048e1faa97Jamie Madill            // This is stictly speaking not an error, but developers should be
2016087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com            // notified of risking undefined behavior.
2017087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com            ERR("Point rendering without writing to gl_PointSize.");
2018087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com
2019087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com            return true;
2020087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com        }
2021087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com    }
202297c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com    else if (IsTriangleMode(drawMode))
2023087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com    {
202453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods        if (mState.getRasterizerState().cullFace && mState.getRasterizerState().cullMode == GL_FRONT_AND_BACK)
2025087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com        {
2026087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com            return true;
2027087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com        }
2028087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com    }
2029087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com
2030087e57890abbf89bc36e8769abdb1354ba6aeb06daniel@transgaming.com    return false;
2031144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2032144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2033144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid Context::setVertexAttribDivisor(GLuint index, GLuint divisor)
2034144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
203553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    mState.getVertexArray()->setVertexAttribDivisor(index, divisor);
2036144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2037144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2038e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madillvoid Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2039e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill{
2040e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill    mResourceManager->checkSamplerAllocation(sampler);
2041e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill
2042e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill    Sampler *samplerObject = getSampler(sampler);
2043e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill    ASSERT(samplerObject);
2044e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill
2045e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill    switch (pname)
2046e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill    {
2047e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill      case GL_TEXTURE_MIN_FILTER:    samplerObject->setMinFilter(static_cast<GLenum>(param));       break;
2048e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill      case GL_TEXTURE_MAG_FILTER:    samplerObject->setMagFilter(static_cast<GLenum>(param));       break;
2049e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill      case GL_TEXTURE_WRAP_S:        samplerObject->setWrapS(static_cast<GLenum>(param));           break;
2050e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill      case GL_TEXTURE_WRAP_T:        samplerObject->setWrapT(static_cast<GLenum>(param));           break;
2051e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill      case GL_TEXTURE_WRAP_R:        samplerObject->setWrapR(static_cast<GLenum>(param));           break;
2052e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill      case GL_TEXTURE_MIN_LOD:       samplerObject->setMinLod(static_cast<GLfloat>(param));         break;
2053e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill      case GL_TEXTURE_MAX_LOD:       samplerObject->setMaxLod(static_cast<GLfloat>(param));         break;
2054e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill      case GL_TEXTURE_COMPARE_MODE:  samplerObject->setComparisonMode(static_cast<GLenum>(param));  break;
2055e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill      case GL_TEXTURE_COMPARE_FUNC:  samplerObject->setComparisonFunc(static_cast<GLenum>(param));  break;
2056e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill      default:                       UNREACHABLE(); break;
2057e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill    }
2058e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill}
2059e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill
2060e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madillvoid Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2061e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill{
2062e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill    mResourceManager->checkSamplerAllocation(sampler);
2063e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill
2064e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill    Sampler *samplerObject = getSampler(sampler);
2065e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill    ASSERT(samplerObject);
2066e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill
2067e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill    switch (pname)
2068e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill    {
20699675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_MIN_FILTER:    samplerObject->setMinFilter(uiround<GLenum>(param));       break;
20709675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_MAG_FILTER:    samplerObject->setMagFilter(uiround<GLenum>(param));       break;
20719675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_WRAP_S:        samplerObject->setWrapS(uiround<GLenum>(param));           break;
20729675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_WRAP_T:        samplerObject->setWrapT(uiround<GLenum>(param));           break;
20739675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_WRAP_R:        samplerObject->setWrapR(uiround<GLenum>(param));           break;
207453a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods      case GL_TEXTURE_MIN_LOD:       samplerObject->setMinLod(param);                           break;
207553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods      case GL_TEXTURE_MAX_LOD:       samplerObject->setMaxLod(param);                           break;
20769675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_COMPARE_MODE:  samplerObject->setComparisonMode(uiround<GLenum>(param));  break;
20779675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_COMPARE_FUNC:  samplerObject->setComparisonFunc(uiround<GLenum>(param));  break;
2078e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill      default:                       UNREACHABLE(); break;
2079e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill    }
2080e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill}
2081e29d1672345b37f61f76a01fbaa63b5c12b57ab3Jamie Madill
20829675b80889202319355597a20e76c6f38b213cd1Jamie MadillGLint Context::getSamplerParameteri(GLuint sampler, GLenum pname)
20839675b80889202319355597a20e76c6f38b213cd1Jamie Madill{
20849675b80889202319355597a20e76c6f38b213cd1Jamie Madill    mResourceManager->checkSamplerAllocation(sampler);
20859675b80889202319355597a20e76c6f38b213cd1Jamie Madill
20869675b80889202319355597a20e76c6f38b213cd1Jamie Madill    Sampler *samplerObject = getSampler(sampler);
20879675b80889202319355597a20e76c6f38b213cd1Jamie Madill    ASSERT(samplerObject);
20889675b80889202319355597a20e76c6f38b213cd1Jamie Madill
20899675b80889202319355597a20e76c6f38b213cd1Jamie Madill    switch (pname)
20909675b80889202319355597a20e76c6f38b213cd1Jamie Madill    {
20919675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_MIN_FILTER:    return static_cast<GLint>(samplerObject->getMinFilter());
20929675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_MAG_FILTER:    return static_cast<GLint>(samplerObject->getMagFilter());
20939675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_WRAP_S:        return static_cast<GLint>(samplerObject->getWrapS());
20949675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_WRAP_T:        return static_cast<GLint>(samplerObject->getWrapT());
20959675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_WRAP_R:        return static_cast<GLint>(samplerObject->getWrapR());
20969675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_MIN_LOD:       return uiround<GLint>(samplerObject->getMinLod());
20979675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_MAX_LOD:       return uiround<GLint>(samplerObject->getMaxLod());
20989675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_COMPARE_MODE:  return static_cast<GLint>(samplerObject->getComparisonMode());
20999675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_COMPARE_FUNC:  return static_cast<GLint>(samplerObject->getComparisonFunc());
21009675b80889202319355597a20e76c6f38b213cd1Jamie Madill      default:                       UNREACHABLE(); return 0;
21019675b80889202319355597a20e76c6f38b213cd1Jamie Madill    }
21029675b80889202319355597a20e76c6f38b213cd1Jamie Madill}
21039675b80889202319355597a20e76c6f38b213cd1Jamie Madill
21049675b80889202319355597a20e76c6f38b213cd1Jamie MadillGLfloat Context::getSamplerParameterf(GLuint sampler, GLenum pname)
21059675b80889202319355597a20e76c6f38b213cd1Jamie Madill{
21069675b80889202319355597a20e76c6f38b213cd1Jamie Madill    mResourceManager->checkSamplerAllocation(sampler);
21079675b80889202319355597a20e76c6f38b213cd1Jamie Madill
21089675b80889202319355597a20e76c6f38b213cd1Jamie Madill    Sampler *samplerObject = getSampler(sampler);
21099675b80889202319355597a20e76c6f38b213cd1Jamie Madill    ASSERT(samplerObject);
21109675b80889202319355597a20e76c6f38b213cd1Jamie Madill
21119675b80889202319355597a20e76c6f38b213cd1Jamie Madill    switch (pname)
21129675b80889202319355597a20e76c6f38b213cd1Jamie Madill    {
21139675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_MIN_FILTER:    return static_cast<GLfloat>(samplerObject->getMinFilter());
21149675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_MAG_FILTER:    return static_cast<GLfloat>(samplerObject->getMagFilter());
21159675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_WRAP_S:        return static_cast<GLfloat>(samplerObject->getWrapS());
21169675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_WRAP_T:        return static_cast<GLfloat>(samplerObject->getWrapT());
21179675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_WRAP_R:        return static_cast<GLfloat>(samplerObject->getWrapR());
21189675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_MIN_LOD:       return samplerObject->getMinLod();
21199675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_MAX_LOD:       return samplerObject->getMaxLod();
21209675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_COMPARE_MODE:  return static_cast<GLfloat>(samplerObject->getComparisonMode());
21219675b80889202319355597a20e76c6f38b213cd1Jamie Madill      case GL_TEXTURE_COMPARE_FUNC:  return static_cast<GLfloat>(samplerObject->getComparisonFunc());
21229675b80889202319355597a20e76c6f38b213cd1Jamie Madill      default:                       UNREACHABLE(); return 0;
21239675b80889202319355597a20e76c6f38b213cd1Jamie Madill    }
21249675b80889202319355597a20e76c6f38b213cd1Jamie Madill}
21259675b80889202319355597a20e76c6f38b213cd1Jamie Madill
2126cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Langvoid Context::initRendererString()
2127144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
2128cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    std::ostringstream rendererString;
2129cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    rendererString << "ANGLE (";
2130cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    rendererString << mRenderer->getRendererDescription();
2131cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    rendererString << ")";
2132ca1ac1f113e18815bab14a3465039bd57b41c10ddaniel@transgaming.com
2133cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    mRendererString = MakeStaticString(rendererString.str());
2134302df74cc22fdf426334aebd9dbad4d7b3df5be2shannonwoods@chromium.org}
2135302df74cc22fdf426334aebd9dbad4d7b3df5be2shannonwoods@chromium.org
2136c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Langconst std::string &Context::getRendererString() const
2137302df74cc22fdf426334aebd9dbad4d7b3df5be2shannonwoods@chromium.org{
2138cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    return mRendererString;
2139302df74cc22fdf426334aebd9dbad4d7b3df5be2shannonwoods@chromium.org}
2140302df74cc22fdf426334aebd9dbad4d7b3df5be2shannonwoods@chromium.org
2141cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Langvoid Context::initExtensionStrings()
2142302df74cc22fdf426334aebd9dbad4d7b3df5be2shannonwoods@chromium.org{
2143493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    mExtensionStrings = mExtensions.getStrings();
2144cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang
2145c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    std::ostringstream combinedStringStream;
2146c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    std::copy(mExtensionStrings.begin(), mExtensionStrings.end(), std::ostream_iterator<std::string>(combinedStringStream, " "));
2147c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    mExtensionString = combinedStringStream.str();
2148144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2149144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2150c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Langconst std::string &Context::getExtensionString() const
2151144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
2152cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    return mExtensionString;
2153144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2154144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2155c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Langconst std::string &Context::getExtensionString(size_t idx) const
2156144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
2157cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    return mExtensionStrings[idx];
2158144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2159144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2160cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Langsize_t Context::getExtensionStringCount() const
2161144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
2162cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    return mExtensionStrings.size();
2163144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2164144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
216543b004269af441999f2535cd1a9e7bb45e945b08Geoff Langsize_t Context::getBoundFramebufferTextureSerials(FramebufferTextureSerialArray *outSerialArray)
2166cdf22f94acaf86ebfb02e123deafcb41010cfccfGeoff Lang{
216743b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang    size_t serialCount = 0;
2168cdf22f94acaf86ebfb02e123deafcb41010cfccfGeoff Lang
216953a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    Framebuffer *drawFramebuffer = mState.getDrawFramebuffer();
2170cdf22f94acaf86ebfb02e123deafcb41010cfccfGeoff Lang    for (unsigned int i = 0; i < IMPLEMENTATION_MAX_DRAW_BUFFERS; i++)
2171cdf22f94acaf86ebfb02e123deafcb41010cfccfGeoff Lang    {
21723c7fa226aeb81469b93142b54e339f13a46ab835Jamie Madill        FramebufferAttachment *attachment = drawFramebuffer->getColorbuffer(i);
21733c7fa226aeb81469b93142b54e339f13a46ab835Jamie Madill        if (attachment && attachment->isTexture())
2174cdf22f94acaf86ebfb02e123deafcb41010cfccfGeoff Lang        {
21755b5d1244d9089bb4a9e74cc34265a524b84ec258Jamie Madill            Texture *texture = attachment->getTexture();
21765b5d1244d9089bb4a9e74cc34265a524b84ec258Jamie Madill            (*outSerialArray)[serialCount++] = texture->getTextureSerial();
2177cdf22f94acaf86ebfb02e123deafcb41010cfccfGeoff Lang        }
2178cdf22f94acaf86ebfb02e123deafcb41010cfccfGeoff Lang    }
2179cdf22f94acaf86ebfb02e123deafcb41010cfccfGeoff Lang
21803c7fa226aeb81469b93142b54e339f13a46ab835Jamie Madill    FramebufferAttachment *depthStencilAttachment = drawFramebuffer->getDepthOrStencilbuffer();
21813c7fa226aeb81469b93142b54e339f13a46ab835Jamie Madill    if (depthStencilAttachment && depthStencilAttachment->isTexture())
2182cdf22f94acaf86ebfb02e123deafcb41010cfccfGeoff Lang    {
21835b5d1244d9089bb4a9e74cc34265a524b84ec258Jamie Madill        Texture *depthStencilTexture = depthStencilAttachment->getTexture();
21845b5d1244d9089bb4a9e74cc34265a524b84ec258Jamie Madill        (*outSerialArray)[serialCount++] = depthStencilTexture->getTextureSerial();
2185cdf22f94acaf86ebfb02e123deafcb41010cfccfGeoff Lang    }
2186cdf22f94acaf86ebfb02e123deafcb41010cfccfGeoff Lang
218743b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang    std::sort(outSerialArray->begin(), outSerialArray->begin() + serialCount);
218843b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang
218943b004269af441999f2535cd1a9e7bb45e945b08Geoff Lang    return serialCount;
2190cdf22f94acaf86ebfb02e123deafcb41010cfccfGeoff Lang}
2191cdf22f94acaf86ebfb02e123deafcb41010cfccfGeoff Lang
2192758d5b2158ed4df145974c475df68a35bf476a00Geoff Langvoid Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
2193758d5b2158ed4df145974c475df68a35bf476a00Geoff Lang                              GLbitfield mask, GLenum filter)
2194758d5b2158ed4df145974c475df68a35bf476a00Geoff Lang{
219553a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    Framebuffer *readFramebuffer = mState.getReadFramebuffer();
219653a94a8238621e36e437975e7a17a91cf995aed9Shannon Woods    Framebuffer *drawFramebuffer = mState.getDrawFramebuffer();
2197144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2198758d5b2158ed4df145974c475df68a35bf476a00Geoff Lang    bool blitRenderTarget = false;
2199685806d62991e99b9cde6e639a6a4b9263f28e70Geoff Lang    bool blitDepth = false;
2200685806d62991e99b9cde6e639a6a4b9263f28e70Geoff Lang    bool blitStencil = false;
2201758d5b2158ed4df145974c475df68a35bf476a00Geoff Lang    if ((mask & GL_COLOR_BUFFER_BIT) && readFramebuffer->getReadColorbuffer() && drawFramebuffer->getFirstColorbuffer())
2202758d5b2158ed4df145974c475df68a35bf476a00Geoff Lang    {
2203144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        blitRenderTarget = true;
2204144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
2205758d5b2158ed4df145974c475df68a35bf476a00Geoff Lang    if ((mask & GL_STENCIL_BUFFER_BIT) && readFramebuffer->getStencilbuffer() && drawFramebuffer->getStencilbuffer())
2206144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
2207685806d62991e99b9cde6e639a6a4b9263f28e70Geoff Lang        blitStencil = true;
2208758d5b2158ed4df145974c475df68a35bf476a00Geoff Lang    }
2209758d5b2158ed4df145974c475df68a35bf476a00Geoff Lang    if ((mask & GL_DEPTH_BUFFER_BIT) && readFramebuffer->getDepthbuffer() && drawFramebuffer->getDepthbuffer())
2210758d5b2158ed4df145974c475df68a35bf476a00Geoff Lang    {
2211685806d62991e99b9cde6e639a6a4b9263f28e70Geoff Lang        blitDepth = true;
2212758d5b2158ed4df145974c475df68a35bf476a00Geoff Lang    }
2213144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
22145b5d1244d9089bb4a9e74cc34265a524b84ec258Jamie Madill    Rectangle srcRect(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
22155b5d1244d9089bb4a9e74cc34265a524b84ec258Jamie Madill    Rectangle dstRect(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
2216685806d62991e99b9cde6e639a6a4b9263f28e70Geoff Lang    if (blitRenderTarget || blitDepth || blitStencil)
2217144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
22185b5d1244d9089bb4a9e74cc34265a524b84ec258Jamie Madill        const Rectangle *scissor = mState.isScissorTestEnabled() ? &mState.getScissor() : NULL;
2219125deab6241c659dab0c9bb9f55c08daecc2f534Geoff Lang        mRenderer->blitRect(readFramebuffer, srcRect, drawFramebuffer, dstRect, scissor,
2220685806d62991e99b9cde6e639a6a4b9263f28e70Geoff Lang                            blitRenderTarget, blitDepth, blitStencil, filter);
2221144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
2222144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2223144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2224f05cdee4ce4adc73e79adb1d01ba76e742b3f892Brandon Jonesvoid Context::releaseShaderCompiler()
2225f05cdee4ce4adc73e79adb1d01ba76e742b3f892Brandon Jones{
2226f05cdee4ce4adc73e79adb1d01ba76e742b3f892Brandon Jones    mRenderer->releaseShaderCompiler();
2227f05cdee4ce4adc73e79adb1d01ba76e742b3f892Brandon Jones}
2228f05cdee4ce4adc73e79adb1d01ba76e742b3f892Brandon Jones
2229493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Langvoid Context::initCaps(GLuint clientVersion)
2230493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang{
2231493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    mCaps = mRenderer->getRendererCaps();
2232493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang
2233493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    mExtensions = mRenderer->getRendererExtensions();
2234493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang
2235493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    if (clientVersion < 3)
2236493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    {
2237493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang        // Disable ES3+ extensions
2238493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang        mExtensions.colorBufferFloat = false;
2239493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    }
2240493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang
2241493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    if (clientVersion > 2)
2242493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    {
2243493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang        // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
2244493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang        //mExtensions.sRGB = false;
2245493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    }
2246493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang
2247301d161d7e8459a3985281a32824bb733b11d778Geoff Lang    // Apply implementation limits
2248301d161d7e8459a3985281a32824bb733b11d778Geoff Lang    mCaps.maxVertexAttributes = std::min<GLuint>(mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
2249301d161d7e8459a3985281a32824bb733b11d778Geoff Lang    mCaps.maxVertexUniformBlocks = std::min<GLuint>(mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
2250301d161d7e8459a3985281a32824bb733b11d778Geoff Lang    mCaps.maxVertexOutputComponents = std::min<GLuint>(mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2251301d161d7e8459a3985281a32824bb733b11d778Geoff Lang
2252301d161d7e8459a3985281a32824bb733b11d778Geoff Lang    mCaps.maxFragmentInputComponents = std::min<GLuint>(mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
22533a61c321e7ea779f23a4da72db977286897b1168Geoff Lang
22545f4c46363bf8e7eb6852c3af42a2e57157e72113Geoff Lang    GLuint maxSamples = 0;
2255900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang    mCaps.compressedTextureFormats.clear();
2256900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang
2257493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    const TextureCapsMap &rendererFormats = mRenderer->getRendererTextureCaps();
2258493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    for (TextureCapsMap::const_iterator i = rendererFormats.begin(); i != rendererFormats.end(); i++)
2259493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    {
2260493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang        GLenum format = i->first;
2261493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang        TextureCaps formatCaps = i->second;
2262493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang
22635d601382b51c29d1670b58c01360416bd929842dGeoff Lang        const InternalFormat &formatInfo = GetInternalFormatInfo(format);
22645d601382b51c29d1670b58c01360416bd929842dGeoff Lang        if (formatCaps.texturable && formatInfo.textureSupport(clientVersion, mExtensions))
2265493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang        {
2266493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang            // Update the format caps based on the client version and extensions
22675d601382b51c29d1670b58c01360416bd929842dGeoff Lang            formatCaps.renderable = formatInfo.renderSupport(clientVersion, mExtensions);
22685d601382b51c29d1670b58c01360416bd929842dGeoff Lang            formatCaps.filterable = formatInfo.filterSupport(clientVersion, mExtensions);
22695f4c46363bf8e7eb6852c3af42a2e57157e72113Geoff Lang
22705f4c46363bf8e7eb6852c3af42a2e57157e72113Geoff Lang            // OpenGL ES does not support multisampling with integer formats
22715d601382b51c29d1670b58c01360416bd929842dGeoff Lang            if (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)
22725f4c46363bf8e7eb6852c3af42a2e57157e72113Geoff Lang            {
22735f4c46363bf8e7eb6852c3af42a2e57157e72113Geoff Lang                formatCaps.sampleCounts.clear();
22745f4c46363bf8e7eb6852c3af42a2e57157e72113Geoff Lang            }
22755f4c46363bf8e7eb6852c3af42a2e57157e72113Geoff Lang            maxSamples = std::max(maxSamples, formatCaps.getMaxSamples());
22765f4c46363bf8e7eb6852c3af42a2e57157e72113Geoff Lang
2277900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang            if (formatInfo.compressed)
2278900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang            {
2279900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang                mCaps.compressedTextureFormats.push_back(format);
2280900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang            }
2281900013cd6b1d0ed2cdc5ee5ca0f4210624b0d8efGeoff Lang
2282493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang            mTextureCaps.insert(format, formatCaps);
2283493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang        }
2284493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang    }
22855f4c46363bf8e7eb6852c3af42a2e57157e72113Geoff Lang
22865f4c46363bf8e7eb6852c3af42a2e57157e72113Geoff Lang    mExtensions.maxSamples = maxSamples;
2287493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang}
2288493daf5a3b71164126f4d2e889ab6a45f6d35823Geoff Lang
2289144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2290144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2291144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgextern "C"
2292144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
2293daea4b4584cdbd8c82dd9946eb07a32ab2f278b7shannon.woods%transgaming.com@gtempaccount.comgl::Context *glCreateContext(int clientVersion, const gl::Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess)
2294144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
2295daea4b4584cdbd8c82dd9946eb07a32ab2f278b7shannon.woods%transgaming.com@gtempaccount.com    return new gl::Context(clientVersion, shareContext, renderer, notifyResets, robustAccess);
2296144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2297144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2298144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid glDestroyContext(gl::Context *context)
2299144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
2300144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    delete context;
2301144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2302144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    if (context == gl::getContext())
2303144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    {
2304144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org        gl::makeCurrent(NULL, NULL, NULL);
2305144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    }
2306144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2307144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2308144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orgvoid glMakeCurrent(gl::Context *context, egl::Display *display, egl::Surface *surface)
2309144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
2310144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    gl::makeCurrent(context, display, surface);
2311144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2312144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org
2313144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.orggl::Context *glGetCurrentContext()
2314144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org{
2315144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org    return gl::getContext();
2316144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2317621ce053c1a3048c2357b8b070ca934ef5e3dabfdaniel@transgaming.com
2318144f28048b4ff779ba8867d21d94baef8e7493feapatrick@chromium.org}
2319