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