blob: 2ab9f3ae11f6af4158e5d18c23ce0736cbba76ea [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000011
Jamie Madillb9293972015-02-19 11:07:54 -050012#include <iterator>
13#include <sstream>
14
Geoff Lang0b7eef72014-06-12 14:10:47 -040015#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050016#include "common/utilities.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050017#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050018#include "libANGLE/Compiler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050019#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050020#include "libANGLE/Fence.h"
21#include "libANGLE/Framebuffer.h"
22#include "libANGLE/FramebufferAttachment.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050023#include "libANGLE/Program.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050024#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050025#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050026#include "libANGLE/ResourceManager.h"
27#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050028#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050029#include "libANGLE/Texture.h"
30#include "libANGLE/TransformFeedback.h"
31#include "libANGLE/VertexArray.h"
32#include "libANGLE/formatutils.h"
33#include "libANGLE/validationES.h"
Jamie Madill437fa652016-05-03 15:13:24 -040034#include "libANGLE/renderer/ContextImpl.h"
Jamie Madill53ea9cc2016-05-17 10:12:52 -040035#include "libANGLE/renderer/EGLImplFactory.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000036
Geoff Langf6db0982015-08-25 13:04:00 -040037namespace
38{
39
Ian Ewell3ffd78b2016-01-22 16:09:42 -050040template <typename T>
41gl::Error GetQueryObjectParameter(gl::Context *context, GLuint id, GLenum pname, T *params)
42{
43 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
44 ASSERT(queryObject != nullptr);
45
46 switch (pname)
47 {
48 case GL_QUERY_RESULT_EXT:
49 return queryObject->getResult(params);
50 case GL_QUERY_RESULT_AVAILABLE_EXT:
51 {
52 bool available;
53 gl::Error error = queryObject->isResultAvailable(&available);
54 if (!error.isError())
55 {
56 *params = static_cast<T>(available ? GL_TRUE : GL_FALSE);
57 }
58 return error;
59 }
60 default:
61 UNREACHABLE();
62 return gl::Error(GL_INVALID_OPERATION, "Unreachable Error");
63 }
64}
65
Geoff Langf6db0982015-08-25 13:04:00 -040066void MarkTransformFeedbackBufferUsage(gl::TransformFeedback *transformFeedback)
67{
Geoff Lang1a683462015-09-29 15:09:59 -040068 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -040069 {
70 for (size_t tfBufferIndex = 0; tfBufferIndex < transformFeedback->getIndexedBufferCount();
71 tfBufferIndex++)
72 {
73 const OffsetBindingPointer<gl::Buffer> &buffer =
74 transformFeedback->getIndexedBuffer(tfBufferIndex);
75 if (buffer.get() != nullptr)
76 {
77 buffer->onTransformFeedback();
78 }
79 }
80 }
81}
Jamie Madill46e6c7a2016-01-18 14:42:30 -050082
83// Attribute map queries.
84EGLint GetClientVersion(const egl::AttributeMap &attribs)
85{
Ian Ewellec2c0c52016-04-05 13:46:26 -040086 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -050087}
88
89GLenum GetResetStrategy(const egl::AttributeMap &attribs)
90{
Ian Ewellec2c0c52016-04-05 13:46:26 -040091 EGLAttrib attrib = attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
92 EGL_NO_RESET_NOTIFICATION_EXT);
Jamie Madill46e6c7a2016-01-18 14:42:30 -050093 switch (attrib)
94 {
95 case EGL_NO_RESET_NOTIFICATION:
96 return GL_NO_RESET_NOTIFICATION_EXT;
97 case EGL_LOSE_CONTEXT_ON_RESET:
98 return GL_LOSE_CONTEXT_ON_RESET_EXT;
99 default:
100 UNREACHABLE();
101 return GL_NONE;
102 }
103}
104
105bool GetRobustAccess(const egl::AttributeMap &attribs)
106{
107 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE);
108}
109
110bool GetDebug(const egl::AttributeMap &attribs)
111{
112 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE);
113}
114
115bool GetNoError(const egl::AttributeMap &attribs)
116{
117 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
118}
119
Geoff Langf6db0982015-08-25 13:04:00 -0400120} // anonymous namespace
121
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000122namespace gl
123{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000124
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400125Context::Context(rx::EGLImplFactory *implFactory,
126 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400127 const Context *shareContext,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500128 const egl::AttributeMap &attribs)
129 : ValidationContext(GetClientVersion(attribs),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700130 &mGLState,
Jamie Madillf25855c2015-11-03 11:06:18 -0500131 mCaps,
132 mTextureCaps,
133 mExtensions,
134 nullptr,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500135 mLimitations,
136 GetNoError(attribs)),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700137 mImplementation(implFactory->createContext(mState)),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500138 mCompiler(nullptr),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500139 mClientVersion(GetClientVersion(attribs)),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400140 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500141 mClientType(EGL_OPENGL_ES_API),
142 mHasBeenCurrent(false),
143 mContextLost(false),
144 mResetStatus(GL_NO_ERROR),
145 mResetStrategy(GetResetStrategy(attribs)),
146 mRobustAccess(GetRobustAccess(attribs)),
147 mCurrentSurface(nullptr),
148 mResourceManager(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000149{
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500150 ASSERT(!mRobustAccess); // Unimplemented
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000151
Jamie Madill00ed7a12016-05-19 13:13:38 -0400152 initCaps();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400153
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700154 mGLState.initialize(mCaps, mExtensions, mClientVersion, GetDebug(attribs));
Régis Fénéon83107972015-02-05 12:57:44 +0100155
Shannon Woods53a94a82014-06-24 15:20:36 -0400156 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400157
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400158 if (shareContext != nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000159 {
160 mResourceManager = shareContext->mResourceManager;
161 mResourceManager->addRef();
162 }
163 else
164 {
Jamie Madill901b3792016-05-26 09:20:40 -0400165 mResourceManager = new ResourceManager();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000166 }
167
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700168 mState.mResourceManager = mResourceManager;
Jamie Madillc185cb82015-04-28 12:39:08 -0400169
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000170 // [OpenGL ES 2.0.24] section 3.7 page 83:
171 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have twodimensional
172 // and cube map texture state vectors respectively associated with them.
173 // In order that access to these initial textures not be lost, they are treated as texture
174 // objects all of whose names are 0.
175
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400176 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500177 mZeroTextures[GL_TEXTURE_2D].set(zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500178
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400179 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, GL_TEXTURE_CUBE_MAP);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500180 mZeroTextures[GL_TEXTURE_CUBE_MAP].set(zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400181
182 if (mClientVersion >= 3)
183 {
184 // TODO: These could also be enabled via extension
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400185 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, GL_TEXTURE_3D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500186 mZeroTextures[GL_TEXTURE_3D].set(zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400187
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400188 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_ARRAY);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500189 mZeroTextures[GL_TEXTURE_2D_ARRAY].set(zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400190 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000191
Ian Ewellbda75592016-04-18 17:25:54 -0400192 if (mExtensions.eglImageExternal || mExtensions.eglStreamConsumerExternal)
193 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400194 Texture *zeroTextureExternal =
195 new Texture(mImplementation.get(), 0, GL_TEXTURE_EXTERNAL_OES);
Ian Ewellbda75592016-04-18 17:25:54 -0400196 mZeroTextures[GL_TEXTURE_EXTERNAL_OES].set(zeroTextureExternal);
197 }
198
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700199 mGLState.initializeZeroTextures(mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500200
Jamie Madill57a89722013-07-02 11:57:03 -0400201 bindVertexArray(0);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000202 bindArrayBuffer(0);
203 bindElementArrayBuffer(0);
Geoff Lang76b10c92014-09-05 16:28:14 -0400204
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000205 bindRenderbuffer(0);
206
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000207 bindGenericUniformBuffer(0);
Shannon Woodsf3acaf92014-09-23 18:07:11 -0400208 for (unsigned int i = 0; i < mCaps.maxCombinedUniformBlocks; i++)
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000209 {
210 bindIndexedUniformBuffer(0, i, 0, -1);
211 }
212
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000213 bindCopyReadBuffer(0);
214 bindCopyWriteBuffer(0);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000215 bindPixelPackBuffer(0);
216 bindPixelUnpackBuffer(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000217
Geoff Lang1a683462015-09-29 15:09:59 -0400218 if (mClientVersion >= 3)
219 {
220 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
221 // In the initial state, a default transform feedback object is bound and treated as
222 // a transform feedback object with a name of zero. That object is bound any time
223 // BindTransformFeedback is called with id of zero
Geoff Lang1a683462015-09-29 15:09:59 -0400224 bindTransformFeedback(0);
225 }
Geoff Langc8058452014-02-03 12:04:11 -0500226
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700227 mCompiler = new Compiler(mImplementation.get(), mState);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500228
229 // Initialize dirty bit masks
230 // TODO(jmadill): additional ES3 state
231 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ALIGNMENT);
232 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ROW_LENGTH);
233 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_IMAGE_HEIGHT);
234 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_IMAGES);
235 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_ROWS);
236 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_PIXELS);
Corentin Wallezbbd663a2016-04-20 17:49:17 -0400237 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500238 // No dirty objects.
239
240 // Readpixels uses the pack state and read FBO
241 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ALIGNMENT);
242 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
243 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ROW_LENGTH);
244 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_ROWS);
245 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_PIXELS);
Corentin Wallezbbd663a2016-04-20 17:49:17 -0400246 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500247 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
248
249 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
250 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
251 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
252 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
253 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
254 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
255 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
256 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
257 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
258 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
259 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
260 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
261
262 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
263 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
264 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
265 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400266
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400267 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000268}
269
270Context::~Context()
271{
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700272 mGLState.reset();
Geoff Lang21329412014-12-02 20:50:30 +0000273
Corentin Wallez37c39792015-08-20 14:19:46 -0400274 for (auto framebuffer : mFramebufferMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000275 {
Corentin Wallez37c39792015-08-20 14:19:46 -0400276 // Default framebuffer are owned by their respective Surface
Geoff Langf6227922015-09-04 11:05:47 -0400277 if (framebuffer.second != nullptr && framebuffer.second->id() != 0)
Corentin Wallez37c39792015-08-20 14:19:46 -0400278 {
279 SafeDelete(framebuffer.second);
280 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000281 }
282
Corentin Wallez80b24112015-08-25 16:41:57 -0400283 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000284 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400285 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000286 }
287
Corentin Wallez80b24112015-08-25 16:41:57 -0400288 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000289 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400290 if (query.second != nullptr)
291 {
292 query.second->release();
293 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000294 }
295
Corentin Wallez80b24112015-08-25 16:41:57 -0400296 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400297 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400298 SafeDelete(vertexArray.second);
Jamie Madill57a89722013-07-02 11:57:03 -0400299 }
300
Corentin Wallez80b24112015-08-25 16:41:57 -0400301 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500302 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500303 if (transformFeedback.second != nullptr)
304 {
305 transformFeedback.second->release();
306 }
Geoff Langc8058452014-02-03 12:04:11 -0500307 }
308
Jamie Madilldedd7b92014-11-05 16:30:36 -0500309 for (auto &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400310 {
Jamie Madilldedd7b92014-11-05 16:30:36 -0500311 zeroTexture.second.set(NULL);
Geoff Lang76b10c92014-09-05 16:28:14 -0400312 }
313 mZeroTextures.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000314
Corentin Wallez51706ea2015-08-07 14:39:22 -0400315 if (mCurrentSurface != nullptr)
316 {
317 releaseSurface();
318 }
319
Jamie Madill1e9ae072014-11-06 15:27:21 -0500320 if (mResourceManager)
321 {
322 mResourceManager->release();
323 }
Geoff Lang492a7e42014-11-05 13:27:06 -0500324
325 SafeDelete(mCompiler);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000326}
327
daniel@transgaming.comad629872012-11-28 19:32:06 +0000328void Context::makeCurrent(egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000329{
Jamie Madill77a72f62015-04-14 11:18:32 -0400330 ASSERT(surface != nullptr);
331
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000332 if (!mHasBeenCurrent)
333 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000334 initRendererString();
Geoff Langcec35902014-04-16 10:52:36 -0400335 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000336
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700337 mGLState.setViewportParams(0, 0, surface->getWidth(), surface->getHeight());
338 mGLState.setScissorParams(0, 0, surface->getWidth(), surface->getHeight());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000339
340 mHasBeenCurrent = true;
341 }
342
Jamie Madill1b94d432015-08-07 13:23:23 -0400343 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700344 mGLState.setAllDirtyBits();
Jamie Madill1b94d432015-08-07 13:23:23 -0400345
Corentin Wallez51706ea2015-08-07 14:39:22 -0400346 if (mCurrentSurface)
347 {
348 releaseSurface();
349 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000350 surface->setIsCurrent(true);
Corentin Wallez37c39792015-08-20 14:19:46 -0400351 mCurrentSurface = surface;
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000352
Corentin Wallez37c39792015-08-20 14:19:46 -0400353 // Update default framebuffer, the binding of the previous default
354 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400355 {
Corentin Wallez37c39792015-08-20 14:19:46 -0400356 Framebuffer *newDefault = surface->getDefaultFramebuffer();
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700357 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400358 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700359 mGLState.setReadFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400360 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700361 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400362 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700363 mGLState.setDrawFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400364 }
365 mFramebufferMap[0] = newDefault;
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400366 }
Ian Ewell292f0052016-02-04 10:37:32 -0500367
368 // Notify the renderer of a context switch
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700369 mImplementation->onMakeCurrent(mState);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000370}
371
Jamie Madill77a72f62015-04-14 11:18:32 -0400372void Context::releaseSurface()
373{
Corentin Wallez37c39792015-08-20 14:19:46 -0400374 ASSERT(mCurrentSurface != nullptr);
375
376 // Remove the default framebuffer
Corentin Wallez51706ea2015-08-07 14:39:22 -0400377 {
Corentin Wallez37c39792015-08-20 14:19:46 -0400378 Framebuffer *currentDefault = mCurrentSurface->getDefaultFramebuffer();
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700379 if (mGLState.getReadFramebuffer() == currentDefault)
Corentin Wallez37c39792015-08-20 14:19:46 -0400380 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700381 mGLState.setReadFramebufferBinding(nullptr);
Corentin Wallez37c39792015-08-20 14:19:46 -0400382 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700383 if (mGLState.getDrawFramebuffer() == currentDefault)
Corentin Wallez37c39792015-08-20 14:19:46 -0400384 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700385 mGLState.setDrawFramebufferBinding(nullptr);
Corentin Wallez37c39792015-08-20 14:19:46 -0400386 }
387 mFramebufferMap.erase(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400388 }
389
Corentin Wallez51706ea2015-08-07 14:39:22 -0400390 mCurrentSurface->setIsCurrent(false);
391 mCurrentSurface = nullptr;
Jamie Madill77a72f62015-04-14 11:18:32 -0400392}
393
daniel@transgaming.comf688c0d2012-10-31 17:52:57 +0000394// NOTE: this function should not assume that this context is current!
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000395void Context::markContextLost()
396{
397 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
398 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
399 mContextLost = true;
400}
401
402bool Context::isContextLost()
403{
404 return mContextLost;
405}
406
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000407GLuint Context::createBuffer()
408{
409 return mResourceManager->createBuffer();
410}
411
412GLuint Context::createProgram()
413{
Jamie Madill901b3792016-05-26 09:20:40 -0400414 return mResourceManager->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000415}
416
417GLuint Context::createShader(GLenum type)
418{
Jamie Madill901b3792016-05-26 09:20:40 -0400419 return mResourceManager->createShader(mImplementation.get(),
420 mImplementation->getNativeLimitations(), type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000421}
422
423GLuint Context::createTexture()
424{
425 return mResourceManager->createTexture();
426}
427
428GLuint Context::createRenderbuffer()
429{
430 return mResourceManager->createRenderbuffer();
431}
432
Geoff Lang882033e2014-09-30 11:26:07 -0400433GLsync Context::createFenceSync()
Jamie Madillcd055f82013-07-26 11:55:15 -0400434{
Jamie Madill901b3792016-05-26 09:20:40 -0400435 GLuint handle = mResourceManager->createFenceSync(mImplementation.get());
Jamie Madillcd055f82013-07-26 11:55:15 -0400436
Cooper Partind8e62a32015-01-29 15:21:25 -0800437 return reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madillcd055f82013-07-26 11:55:15 -0400438}
439
Jamie Madill57a89722013-07-02 11:57:03 -0400440GLuint Context::createVertexArray()
441{
Geoff Lang36167ab2015-12-07 10:27:14 -0500442 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
443 mVertexArrayMap[vertexArray] = nullptr;
444 return vertexArray;
Jamie Madill57a89722013-07-02 11:57:03 -0400445}
446
Jamie Madilldc356042013-07-19 16:36:57 -0400447GLuint Context::createSampler()
448{
449 return mResourceManager->createSampler();
450}
451
Geoff Langc8058452014-02-03 12:04:11 -0500452GLuint Context::createTransformFeedback()
453{
Geoff Lang36167ab2015-12-07 10:27:14 -0500454 GLuint transformFeedback = mTransformFeedbackAllocator.allocate();
455 mTransformFeedbackMap[transformFeedback] = nullptr;
456 return transformFeedback;
Geoff Langc8058452014-02-03 12:04:11 -0500457}
458
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000459// Returns an unused framebuffer name
460GLuint Context::createFramebuffer()
461{
462 GLuint handle = mFramebufferHandleAllocator.allocate();
463
464 mFramebufferMap[handle] = NULL;
465
466 return handle;
467}
468
Jamie Madill33dc8432013-07-26 11:55:05 -0400469GLuint Context::createFenceNV()
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000470{
Jamie Madill33dc8432013-07-26 11:55:05 -0400471 GLuint handle = mFenceNVHandleAllocator.allocate();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000472
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400473 mFenceNVMap[handle] = new FenceNV(mImplementation->createFenceNV());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000474
475 return handle;
476}
477
478// Returns an unused query name
479GLuint Context::createQuery()
480{
481 GLuint handle = mQueryHandleAllocator.allocate();
482
483 mQueryMap[handle] = NULL;
484
485 return handle;
486}
487
488void Context::deleteBuffer(GLuint buffer)
489{
490 if (mResourceManager->getBuffer(buffer))
491 {
492 detachBuffer(buffer);
493 }
Jamie Madill893ab082014-05-16 16:56:10 -0400494
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000495 mResourceManager->deleteBuffer(buffer);
496}
497
498void Context::deleteShader(GLuint shader)
499{
500 mResourceManager->deleteShader(shader);
501}
502
503void Context::deleteProgram(GLuint program)
504{
505 mResourceManager->deleteProgram(program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000506}
507
508void Context::deleteTexture(GLuint texture)
509{
510 if (mResourceManager->getTexture(texture))
511 {
512 detachTexture(texture);
513 }
514
515 mResourceManager->deleteTexture(texture);
516}
517
518void Context::deleteRenderbuffer(GLuint renderbuffer)
519{
520 if (mResourceManager->getRenderbuffer(renderbuffer))
521 {
522 detachRenderbuffer(renderbuffer);
523 }
Jamie Madill893ab082014-05-16 16:56:10 -0400524
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000525 mResourceManager->deleteRenderbuffer(renderbuffer);
526}
527
Jamie Madillcd055f82013-07-26 11:55:15 -0400528void Context::deleteFenceSync(GLsync fenceSync)
529{
530 // The spec specifies the underlying Fence object is not deleted until all current
531 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
532 // and since our API is currently designed for being called from a single thread, we can delete
533 // the fence immediately.
Minmin Gong794e0002015-04-07 18:31:54 -0700534 mResourceManager->deleteFenceSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(fenceSync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400535}
536
Jamie Madill57a89722013-07-02 11:57:03 -0400537void Context::deleteVertexArray(GLuint vertexArray)
538{
Geoff Lang36167ab2015-12-07 10:27:14 -0500539 auto iter = mVertexArrayMap.find(vertexArray);
540 if (iter != mVertexArrayMap.end())
Geoff Lang50b3fe82015-12-08 14:49:12 +0000541 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500542 VertexArray *vertexArrayObject = iter->second;
543 if (vertexArrayObject != nullptr)
544 {
545 detachVertexArray(vertexArray);
546 delete vertexArrayObject;
547 }
Geoff Lang50b3fe82015-12-08 14:49:12 +0000548
Geoff Lang36167ab2015-12-07 10:27:14 -0500549 mVertexArrayMap.erase(iter);
550 mVertexArrayHandleAllocator.release(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -0400551 }
552}
553
Jamie Madilldc356042013-07-19 16:36:57 -0400554void Context::deleteSampler(GLuint sampler)
555{
556 if (mResourceManager->getSampler(sampler))
557 {
558 detachSampler(sampler);
559 }
560
561 mResourceManager->deleteSampler(sampler);
562}
563
Geoff Langc8058452014-02-03 12:04:11 -0500564void Context::deleteTransformFeedback(GLuint transformFeedback)
565{
Jamie Madill5fd0b2d2015-01-05 13:38:44 -0500566 auto iter = mTransformFeedbackMap.find(transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -0500567 if (iter != mTransformFeedbackMap.end())
568 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500569 TransformFeedback *transformFeedbackObject = iter->second;
570 if (transformFeedbackObject != nullptr)
571 {
572 detachTransformFeedback(transformFeedback);
573 transformFeedbackObject->release();
574 }
575
Geoff Lang50b3fe82015-12-08 14:49:12 +0000576 mTransformFeedbackMap.erase(iter);
Geoff Lang36167ab2015-12-07 10:27:14 -0500577 mTransformFeedbackAllocator.release(transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -0500578 }
579}
580
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000581void Context::deleteFramebuffer(GLuint framebuffer)
582{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500583 auto framebufferObject = mFramebufferMap.find(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000584
585 if (framebufferObject != mFramebufferMap.end())
586 {
587 detachFramebuffer(framebuffer);
588
589 mFramebufferHandleAllocator.release(framebufferObject->first);
590 delete framebufferObject->second;
591 mFramebufferMap.erase(framebufferObject);
592 }
593}
594
Jamie Madill33dc8432013-07-26 11:55:05 -0400595void Context::deleteFenceNV(GLuint fence)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000596{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500597 auto fenceObject = mFenceNVMap.find(fence);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000598
Jamie Madill33dc8432013-07-26 11:55:05 -0400599 if (fenceObject != mFenceNVMap.end())
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000600 {
Jamie Madill33dc8432013-07-26 11:55:05 -0400601 mFenceNVHandleAllocator.release(fenceObject->first);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000602 delete fenceObject->second;
Jamie Madill33dc8432013-07-26 11:55:05 -0400603 mFenceNVMap.erase(fenceObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000604 }
605}
606
607void Context::deleteQuery(GLuint query)
608{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500609 auto queryObject = mQueryMap.find(query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000610 if (queryObject != mQueryMap.end())
611 {
612 mQueryHandleAllocator.release(queryObject->first);
613 if (queryObject->second)
614 {
615 queryObject->second->release();
616 }
617 mQueryMap.erase(queryObject);
618 }
619}
620
Geoff Lang70d0f492015-12-10 17:45:46 -0500621Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000622{
623 return mResourceManager->getBuffer(handle);
624}
625
Geoff Lang48dcae72014-02-05 16:28:24 -0500626Shader *Context::getShader(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000627{
628 return mResourceManager->getShader(handle);
629}
630
Geoff Lang48dcae72014-02-05 16:28:24 -0500631Program *Context::getProgram(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000632{
633 return mResourceManager->getProgram(handle);
634}
635
Jamie Madill570f7c82014-07-03 10:38:54 -0400636Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000637{
638 return mResourceManager->getTexture(handle);
639}
640
Geoff Lang70d0f492015-12-10 17:45:46 -0500641Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000642{
643 return mResourceManager->getRenderbuffer(handle);
644}
645
Jamie Madillcd055f82013-07-26 11:55:15 -0400646FenceSync *Context::getFenceSync(GLsync handle) const
647{
Minmin Gong794e0002015-04-07 18:31:54 -0700648 return mResourceManager->getFenceSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400649}
650
Jamie Madill57a89722013-07-02 11:57:03 -0400651VertexArray *Context::getVertexArray(GLuint handle) const
652{
653 auto vertexArray = mVertexArrayMap.find(handle);
Geoff Lang36167ab2015-12-07 10:27:14 -0500654 return (vertexArray != mVertexArrayMap.end()) ? vertexArray->second : nullptr;
Jamie Madill57a89722013-07-02 11:57:03 -0400655}
656
Jamie Madilldc356042013-07-19 16:36:57 -0400657Sampler *Context::getSampler(GLuint handle) const
658{
659 return mResourceManager->getSampler(handle);
660}
661
Geoff Langc8058452014-02-03 12:04:11 -0500662TransformFeedback *Context::getTransformFeedback(GLuint handle) const
663{
Geoff Lang36167ab2015-12-07 10:27:14 -0500664 auto iter = mTransformFeedbackMap.find(handle);
665 return (iter != mTransformFeedbackMap.end()) ? iter->second : nullptr;
Geoff Langc8058452014-02-03 12:04:11 -0500666}
667
Geoff Lang70d0f492015-12-10 17:45:46 -0500668LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
669{
670 switch (identifier)
671 {
672 case GL_BUFFER:
673 return getBuffer(name);
674 case GL_SHADER:
675 return getShader(name);
676 case GL_PROGRAM:
677 return getProgram(name);
678 case GL_VERTEX_ARRAY:
679 return getVertexArray(name);
680 case GL_QUERY:
681 return getQuery(name);
682 case GL_TRANSFORM_FEEDBACK:
683 return getTransformFeedback(name);
684 case GL_SAMPLER:
685 return getSampler(name);
686 case GL_TEXTURE:
687 return getTexture(name);
688 case GL_RENDERBUFFER:
689 return getRenderbuffer(name);
690 case GL_FRAMEBUFFER:
691 return getFramebuffer(name);
692 default:
693 UNREACHABLE();
694 return nullptr;
695 }
696}
697
698LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
699{
700 return getFenceSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
701}
702
Jamie Madilldc356042013-07-19 16:36:57 -0400703bool Context::isSampler(GLuint samplerName) const
704{
705 return mResourceManager->isSampler(samplerName);
706}
707
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500708void Context::bindArrayBuffer(GLuint bufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000709{
Jamie Madill901b3792016-05-26 09:20:40 -0400710 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700711 mGLState.setArrayBufferBinding(buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000712}
713
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500714void Context::bindElementArrayBuffer(GLuint bufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000715{
Jamie Madill901b3792016-05-26 09:20:40 -0400716 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700717 mGLState.getVertexArray()->setElementArrayBuffer(buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000718}
719
Jamie Madilldedd7b92014-11-05 16:30:36 -0500720void Context::bindTexture(GLenum target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000721{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500722 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000723
Jamie Madilldedd7b92014-11-05 16:30:36 -0500724 if (handle == 0)
725 {
726 texture = mZeroTextures[target].get();
727 }
728 else
729 {
Jamie Madill901b3792016-05-26 09:20:40 -0400730 texture = mResourceManager->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500731 }
732
733 ASSERT(texture);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700734 mGLState.setSamplerTexture(target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000735}
736
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500737void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000738{
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500739 Framebuffer *framebuffer = checkFramebufferAllocation(framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700740 mGLState.setReadFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000741}
742
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500743void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000744{
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500745 Framebuffer *framebuffer = checkFramebufferAllocation(framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700746 mGLState.setDrawFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000747}
748
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500749void Context::bindRenderbuffer(GLuint renderbufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000750{
Jamie Madill901b3792016-05-26 09:20:40 -0400751 Renderbuffer *renderbuffer =
752 mResourceManager->checkRenderbufferAllocation(mImplementation.get(), renderbufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700753 mGLState.setRenderbufferBinding(renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000754}
755
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500756void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -0400757{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500758 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700759 mGLState.setVertexArrayBinding(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -0400760}
761
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500762void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -0400763{
Geoff Lang76b10c92014-09-05 16:28:14 -0400764 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -0400765 Sampler *sampler =
766 mResourceManager->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700767 mGLState.setSamplerBinding(textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -0400768}
769
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500770void Context::bindGenericUniformBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000771{
Jamie Madill901b3792016-05-26 09:20:40 -0400772 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700773 mGLState.setGenericUniformBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000774}
775
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500776void Context::bindIndexedUniformBuffer(GLuint bufferHandle,
777 GLuint index,
778 GLintptr offset,
779 GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +0000780{
Jamie Madill901b3792016-05-26 09:20:40 -0400781 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700782 mGLState.setIndexedUniformBufferBinding(index, buffer, offset, size);
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +0000783}
784
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500785void Context::bindGenericTransformFeedbackBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000786{
Jamie Madill901b3792016-05-26 09:20:40 -0400787 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700788 mGLState.getCurrentTransformFeedback()->bindGenericBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000789}
790
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500791void Context::bindIndexedTransformFeedbackBuffer(GLuint bufferHandle,
792 GLuint index,
793 GLintptr offset,
794 GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +0000795{
Jamie Madill901b3792016-05-26 09:20:40 -0400796 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700797 mGLState.getCurrentTransformFeedback()->bindIndexedBuffer(index, buffer, offset, size);
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +0000798}
799
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500800void Context::bindCopyReadBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000801{
Jamie Madill901b3792016-05-26 09:20:40 -0400802 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700803 mGLState.setCopyReadBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000804}
805
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500806void Context::bindCopyWriteBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000807{
Jamie Madill901b3792016-05-26 09:20:40 -0400808 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700809 mGLState.setCopyWriteBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000810}
811
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500812void Context::bindPixelPackBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000813{
Jamie Madill901b3792016-05-26 09:20:40 -0400814 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700815 mGLState.setPixelPackBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000816}
817
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500818void Context::bindPixelUnpackBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000819{
Jamie Madill901b3792016-05-26 09:20:40 -0400820 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700821 mGLState.setPixelUnpackBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000822}
823
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000824void Context::useProgram(GLuint program)
825{
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700826 mGLState.setProgram(getProgram(program));
daniel@transgaming.com95d29422012-07-24 18:36:10 +0000827}
828
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500829void Context::bindTransformFeedback(GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -0500830{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500831 TransformFeedback *transformFeedback =
832 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700833 mGLState.setTransformFeedbackBinding(transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -0500834}
835
Geoff Lang5aad9672014-09-08 11:10:42 -0400836Error Context::beginQuery(GLenum target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000837{
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000838 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -0400839 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000840
Geoff Lang5aad9672014-09-08 11:10:42 -0400841 // begin query
842 Error error = queryObject->begin();
843 if (error.isError())
844 {
845 return error;
846 }
847
848 // set query as active for specified target only if begin succeeded
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700849 mGLState.setActiveQuery(target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000850
Geoff Lang5aad9672014-09-08 11:10:42 -0400851 return Error(GL_NO_ERROR);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000852}
853
Geoff Lang5aad9672014-09-08 11:10:42 -0400854Error Context::endQuery(GLenum target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000855{
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700856 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -0400857 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000858
Geoff Lang5aad9672014-09-08 11:10:42 -0400859 gl::Error error = queryObject->end();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000860
Geoff Lang5aad9672014-09-08 11:10:42 -0400861 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700862 mGLState.setActiveQuery(target, NULL);
Geoff Lang5aad9672014-09-08 11:10:42 -0400863
864 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000865}
866
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500867Error Context::queryCounter(GLuint id, GLenum target)
868{
869 ASSERT(target == GL_TIMESTAMP_EXT);
870
871 Query *queryObject = getQuery(id, true, target);
872 ASSERT(queryObject);
873
874 return queryObject->queryCounter();
875}
876
877void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
878{
879 switch (pname)
880 {
881 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700882 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500883 break;
884 case GL_QUERY_COUNTER_BITS_EXT:
885 switch (target)
886 {
887 case GL_TIME_ELAPSED_EXT:
888 params[0] = getExtensions().queryCounterBitsTimeElapsed;
889 break;
890 case GL_TIMESTAMP_EXT:
891 params[0] = getExtensions().queryCounterBitsTimestamp;
892 break;
893 default:
894 UNREACHABLE();
895 params[0] = 0;
896 break;
897 }
898 break;
899 default:
900 UNREACHABLE();
901 return;
902 }
903}
904
905Error Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
906{
907 return GetQueryObjectParameter(this, id, pname, params);
908}
909
910Error Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
911{
912 return GetQueryObjectParameter(this, id, pname, params);
913}
914
915Error Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
916{
917 return GetQueryObjectParameter(this, id, pname, params);
918}
919
920Error Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
921{
922 return GetQueryObjectParameter(this, id, pname, params);
923}
924
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500925Framebuffer *Context::getFramebuffer(unsigned int handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000926{
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500927 auto framebufferIt = mFramebufferMap.find(handle);
928 return ((framebufferIt == mFramebufferMap.end()) ? nullptr : framebufferIt->second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000929}
930
Jamie Madill33dc8432013-07-26 11:55:05 -0400931FenceNV *Context::getFenceNV(unsigned int handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000932{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500933 auto fence = mFenceNVMap.find(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000934
Jamie Madill33dc8432013-07-26 11:55:05 -0400935 if (fence == mFenceNVMap.end())
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000936 {
937 return NULL;
938 }
939 else
940 {
941 return fence->second;
942 }
943}
944
945Query *Context::getQuery(unsigned int handle, bool create, GLenum type)
946{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500947 auto query = mQueryMap.find(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000948
949 if (query == mQueryMap.end())
950 {
951 return NULL;
952 }
953 else
954 {
955 if (!query->second && create)
956 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400957 query->second = new Query(mImplementation->createQuery(type), handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000958 query->second->addRef();
959 }
960 return query->second;
961 }
962}
963
Geoff Lang70d0f492015-12-10 17:45:46 -0500964Query *Context::getQuery(GLuint handle) const
965{
966 auto iter = mQueryMap.find(handle);
967 return (iter != mQueryMap.end()) ? iter->second : nullptr;
968}
969
Jamie Madill1fc7e2c2014-01-21 16:47:10 -0500970Texture *Context::getTargetTexture(GLenum target) const
971{
Ian Ewellbda75592016-04-18 17:25:54 -0400972 ASSERT(ValidTextureTarget(this, target) || ValidTextureExternalTarget(this, target));
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700973 return mGLState.getTargetTexture(target);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000974}
975
Geoff Lang76b10c92014-09-05 16:28:14 -0400976Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000977{
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700978 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000979}
980
Geoff Lang492a7e42014-11-05 13:27:06 -0500981Compiler *Context::getCompiler() const
982{
983 return mCompiler;
984}
985
Jamie Madill893ab082014-05-16 16:56:10 -0400986void Context::getBooleanv(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000987{
988 switch (pname)
989 {
daniel@transgaming.comf39967e2012-11-28 19:35:56 +0000990 case GL_SHADER_COMPILER: *params = GL_TRUE; break;
daniel@transgaming.comf39967e2012-11-28 19:35:56 +0000991 case GL_CONTEXT_ROBUST_ACCESS_EXT: *params = mRobustAccess ? GL_TRUE : GL_FALSE; break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000992 default:
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700993 mGLState.getBooleanv(pname, params);
994 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000995 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000996}
997
Jamie Madill893ab082014-05-16 16:56:10 -0400998void Context::getFloatv(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000999{
Shannon Woods53a94a82014-06-24 15:20:36 -04001000 // Queries about context capabilities and maximums are answered by Context.
1001 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001002 switch (pname)
1003 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001004 case GL_ALIASED_LINE_WIDTH_RANGE:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001005 params[0] = mCaps.minAliasedLineWidth;
1006 params[1] = mCaps.maxAliasedLineWidth;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001007 break;
1008 case GL_ALIASED_POINT_SIZE_RANGE:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001009 params[0] = mCaps.minAliasedPointSize;
1010 params[1] = mCaps.maxAliasedPointSize;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001011 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00001012 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001013 ASSERT(mExtensions.textureFilterAnisotropic);
1014 *params = mExtensions.maxTextureAnisotropy;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00001015 break;
Geoff Lange6d4e122015-06-29 13:33:55 -04001016 case GL_MAX_TEXTURE_LOD_BIAS:
1017 *params = mCaps.maxLODBias;
1018 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001019 default:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001020 mGLState.getFloatv(pname, params);
1021 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001022 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001023}
1024
Jamie Madill893ab082014-05-16 16:56:10 -04001025void Context::getIntegerv(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001026{
Shannon Woods53a94a82014-06-24 15:20:36 -04001027 // Queries about context capabilities and maximums are answered by Context.
1028 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001029
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001030 switch (pname)
1031 {
Geoff Lang301d1612014-07-09 10:34:37 -04001032 case GL_MAX_VERTEX_ATTRIBS: *params = mCaps.maxVertexAttributes; break;
1033 case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = mCaps.maxVertexUniformVectors; break;
1034 case GL_MAX_VERTEX_UNIFORM_COMPONENTS: *params = mCaps.maxVertexUniformComponents; break;
Geoff Lang3a61c322014-07-10 13:01:54 -04001035 case GL_MAX_VARYING_VECTORS: *params = mCaps.maxVaryingVectors; break;
1036 case GL_MAX_VARYING_COMPONENTS: *params = mCaps.maxVertexOutputComponents; break;
1037 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = mCaps.maxCombinedTextureImageUnits; break;
Geoff Lang301d1612014-07-09 10:34:37 -04001038 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxVertexTextureImageUnits; break;
1039 case GL_MAX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxTextureImageUnits; break;
1040 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = mCaps.maxFragmentUniformVectors; break;
Geoff Lange7468902015-10-02 10:46:24 -04001041 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: *params = mCaps.maxFragmentUniformComponents; break;
Geoff Langc0b9ef42014-07-02 10:02:37 -04001042 case GL_MAX_RENDERBUFFER_SIZE: *params = mCaps.maxRenderbufferSize; break;
1043 case GL_MAX_COLOR_ATTACHMENTS_EXT: *params = mCaps.maxColorAttachments; break;
1044 case GL_MAX_DRAW_BUFFERS_EXT: *params = mCaps.maxDrawBuffers; break;
Jamie Madill1caff072013-07-19 16:36:56 -04001045 //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
Jamie Madill1caff072013-07-19 16:36:56 -04001046 case GL_SUBPIXEL_BITS: *params = 4; break;
Geoff Langc0b9ef42014-07-02 10:02:37 -04001047 case GL_MAX_TEXTURE_SIZE: *params = mCaps.max2DTextureSize; break;
1048 case GL_MAX_CUBE_MAP_TEXTURE_SIZE: *params = mCaps.maxCubeMapTextureSize; break;
1049 case GL_MAX_3D_TEXTURE_SIZE: *params = mCaps.max3DTextureSize; break;
1050 case GL_MAX_ARRAY_TEXTURE_LAYERS: *params = mCaps.maxArrayTextureLayers; break;
Geoff Lang3a61c322014-07-10 13:01:54 -04001051 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: *params = mCaps.uniformBufferOffsetAlignment; break;
1052 case GL_MAX_UNIFORM_BUFFER_BINDINGS: *params = mCaps.maxUniformBufferBindings; break;
Geoff Lang301d1612014-07-09 10:34:37 -04001053 case GL_MAX_VERTEX_UNIFORM_BLOCKS: *params = mCaps.maxVertexUniformBlocks; break;
1054 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS: *params = mCaps.maxFragmentUniformBlocks; break;
Geoff Lang3a61c322014-07-10 13:01:54 -04001055 case GL_MAX_COMBINED_UNIFORM_BLOCKS: *params = mCaps.maxCombinedTextureImageUnits; break;
Geoff Lange6d4e122015-06-29 13:33:55 -04001056 case GL_MAX_VERTEX_OUTPUT_COMPONENTS: *params = mCaps.maxVertexOutputComponents; break;
1057 case GL_MAX_FRAGMENT_INPUT_COMPONENTS: *params = mCaps.maxFragmentInputComponents; break;
1058 case GL_MIN_PROGRAM_TEXEL_OFFSET: *params = mCaps.minProgramTexelOffset; break;
1059 case GL_MAX_PROGRAM_TEXEL_OFFSET: *params = mCaps.maxProgramTexelOffset; break;
Jamie Madillee7010d2013-10-17 10:45:47 -04001060 case GL_MAJOR_VERSION: *params = mClientVersion; break;
1061 case GL_MINOR_VERSION: *params = 0; break;
Geoff Lang900013c2014-07-07 11:32:19 -04001062 case GL_MAX_ELEMENTS_INDICES: *params = mCaps.maxElementsIndices; break;
1063 case GL_MAX_ELEMENTS_VERTICES: *params = mCaps.maxElementsVertices; break;
Geoff Lang05881a02014-07-10 14:05:30 -04001064 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: *params = mCaps.maxTransformFeedbackInterleavedComponents; break;
1065 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: *params = mCaps.maxTransformFeedbackSeparateAttributes; break;
1066 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: *params = mCaps.maxTransformFeedbackSeparateComponents; break;
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001067 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1068 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1069 break;
Geoff Langdef624b2015-04-13 10:46:56 -04001070 case GL_MAX_SAMPLES_ANGLE: *params = mCaps.maxSamples; break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001071 case GL_MAX_VIEWPORT_DIMS:
1072 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001073 params[0] = mCaps.maxViewportWidth;
1074 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001075 }
1076 break;
1077 case GL_COMPRESSED_TEXTURE_FORMATS:
Geoff Lang900013c2014-07-07 11:32:19 -04001078 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(), params);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001079 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001080 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1081 *params = mResetStrategy;
1082 break;
Geoff Lang900013c2014-07-07 11:32:19 -04001083 case GL_NUM_SHADER_BINARY_FORMATS:
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001084 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001085 break;
Geoff Lang900013c2014-07-07 11:32:19 -04001086 case GL_SHADER_BINARY_FORMATS:
1087 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1088 break;
1089 case GL_NUM_PROGRAM_BINARY_FORMATS:
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001090 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
Geoff Lang900013c2014-07-07 11:32:19 -04001091 break;
1092 case GL_PROGRAM_BINARY_FORMATS:
1093 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001094 break;
Geoff Lang23c81692013-08-12 10:46:58 -04001095 case GL_NUM_EXTENSIONS:
Geoff Langcec35902014-04-16 10:52:36 -04001096 *params = static_cast<GLint>(mExtensionStrings.size());
Geoff Lang23c81692013-08-12 10:46:58 -04001097 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001098
1099 // GL_KHR_debug
1100 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1101 *params = mExtensions.maxDebugMessageLength;
1102 break;
1103 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1104 *params = mExtensions.maxDebugLoggedMessages;
1105 break;
1106 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1107 *params = mExtensions.maxDebugGroupStackDepth;
1108 break;
1109 case GL_MAX_LABEL_LENGTH:
1110 *params = mExtensions.maxLabelLength;
1111 break;
1112
Ian Ewell53f59f42016-01-28 17:36:55 -05001113 // GL_EXT_disjoint_timer_query
1114 case GL_GPU_DISJOINT_EXT:
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001115 *params = mImplementation->getGPUDisjoint();
Ian Ewell53f59f42016-01-28 17:36:55 -05001116 break;
1117
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001118 default:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001119 mGLState.getIntegerv(mState, pname, params);
1120 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001121 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001122}
1123
Jamie Madill893ab082014-05-16 16:56:10 -04001124void Context::getInteger64v(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001125{
Shannon Woods53a94a82014-06-24 15:20:36 -04001126 // Queries about context capabilities and maximums are answered by Context.
1127 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001128 switch (pname)
1129 {
1130 case GL_MAX_ELEMENT_INDEX:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001131 *params = mCaps.maxElementIndex;
Jamie Madill0fda9862013-07-19 16:36:55 -04001132 break;
1133 case GL_MAX_UNIFORM_BLOCK_SIZE:
Geoff Lang3a61c322014-07-10 13:01:54 -04001134 *params = mCaps.maxUniformBlockSize;
Jamie Madill0fda9862013-07-19 16:36:55 -04001135 break;
1136 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Geoff Lang3a61c322014-07-10 13:01:54 -04001137 *params = mCaps.maxCombinedVertexUniformComponents;
Jamie Madill0fda9862013-07-19 16:36:55 -04001138 break;
1139 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Geoff Lang3a61c322014-07-10 13:01:54 -04001140 *params = mCaps.maxCombinedFragmentUniformComponents;
Jamie Madill0fda9862013-07-19 16:36:55 -04001141 break;
1142 case GL_MAX_SERVER_WAIT_TIMEOUT:
Geoff Lang900013c2014-07-07 11:32:19 -04001143 *params = mCaps.maxServerWaitTimeout;
Jamie Madill0fda9862013-07-19 16:36:55 -04001144 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001145
1146 // GL_EXT_disjoint_timer_query
1147 case GL_TIMESTAMP_EXT:
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001148 *params = mImplementation->getTimestamp();
Ian Ewell53f59f42016-01-28 17:36:55 -05001149 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001150 default:
Jamie Madill893ab082014-05-16 16:56:10 -04001151 UNREACHABLE();
1152 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001153 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001154}
1155
Geoff Lang70d0f492015-12-10 17:45:46 -05001156void Context::getPointerv(GLenum pname, void **params) const
1157{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001158 mGLState.getPointerv(pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001159}
1160
Shannon Woods1b2fb852013-08-19 14:28:48 -04001161bool Context::getIndexedIntegerv(GLenum target, GLuint index, GLint *data)
1162{
Shannon Woods53a94a82014-06-24 15:20:36 -04001163 // Queries about context capabilities and maximums are answered by Context.
1164 // Queries about current GL state values are answered by State.
Jamie Madill77a72f62015-04-14 11:18:32 -04001165 // Indexed integer queries all refer to current state, so this function is a
Shannon Woods53a94a82014-06-24 15:20:36 -04001166 // mere passthrough.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001167 return mGLState.getIndexedIntegerv(target, index, data);
Shannon Woods1b2fb852013-08-19 14:28:48 -04001168}
1169
1170bool Context::getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data)
1171{
Shannon Woods53a94a82014-06-24 15:20:36 -04001172 // Queries about context capabilities and maximums are answered by Context.
1173 // Queries about current GL state values are answered by State.
Jamie Madill77a72f62015-04-14 11:18:32 -04001174 // Indexed integer queries all refer to current state, so this function is a
Shannon Woods53a94a82014-06-24 15:20:36 -04001175 // mere passthrough.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001176 return mGLState.getIndexedInteger64v(target, index, data);
Shannon Woods1b2fb852013-08-19 14:28:48 -04001177}
1178
Geoff Langf6db0982015-08-25 13:04:00 -04001179Error Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001180{
Jamie Madill1b94d432015-08-07 13:23:23 -04001181 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001182 ANGLE_TRY(mImplementation->drawArrays(mode, first, count));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001183 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
Geoff Lang520c4ae2015-05-05 13:12:36 -04001184
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001185 return NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001186}
1187
Geoff Langf6db0982015-08-25 13:04:00 -04001188Error Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
1189{
1190 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001191 ANGLE_TRY(mImplementation->drawArraysInstanced(mode, first, count, instanceCount));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001192 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
Geoff Langf6db0982015-08-25 13:04:00 -04001193
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001194 return NoError();
Geoff Langf6db0982015-08-25 13:04:00 -04001195}
1196
1197Error Context::drawElements(GLenum mode,
1198 GLsizei count,
1199 GLenum type,
1200 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -04001201 const IndexRange &indexRange)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001202{
Jamie Madill1b94d432015-08-07 13:23:23 -04001203 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001204 return mImplementation->drawElements(mode, count, type, indices, indexRange);
Geoff Langf6db0982015-08-25 13:04:00 -04001205}
1206
1207Error Context::drawElementsInstanced(GLenum mode,
1208 GLsizei count,
1209 GLenum type,
1210 const GLvoid *indices,
1211 GLsizei instances,
Geoff Lang3edfe032015-09-04 16:38:24 -04001212 const IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -04001213{
1214 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001215 return mImplementation->drawElementsInstanced(mode, count, type, indices, instances,
1216 indexRange);
Geoff Langf6db0982015-08-25 13:04:00 -04001217}
1218
1219Error Context::drawRangeElements(GLenum mode,
1220 GLuint start,
1221 GLuint end,
1222 GLsizei count,
1223 GLenum type,
1224 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -04001225 const IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -04001226{
1227 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001228 return mImplementation->drawRangeElements(mode, start, end, count, type, indices, indexRange);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001229}
1230
Geoff Lang129753a2015-01-09 16:52:09 -05001231Error Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001232{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001233 return mImplementation->flush();
Geoff Lang129753a2015-01-09 16:52:09 -05001234}
1235
1236Error Context::finish()
1237{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001238 return mImplementation->finish();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001239}
1240
Austin Kinross6ee1e782015-05-29 17:05:37 -07001241void Context::insertEventMarker(GLsizei length, const char *marker)
1242{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001243 ASSERT(mImplementation);
1244 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001245}
1246
1247void Context::pushGroupMarker(GLsizei length, const char *marker)
1248{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001249 ASSERT(mImplementation);
1250 mImplementation->pushGroupMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001251}
1252
1253void Context::popGroupMarker()
1254{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001255 ASSERT(mImplementation);
1256 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07001257}
1258
Geoff Langd8605522016-04-13 10:19:12 -04001259void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
1260{
1261 Program *programObject = getProgram(program);
1262 ASSERT(programObject);
1263
1264 programObject->bindUniformLocation(location, name);
1265}
1266
Sami Väisänena797e062016-05-12 15:23:40 +03001267void Context::setCoverageModulation(GLenum components)
1268{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001269 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03001270}
1271
Jamie Madill437fa652016-05-03 15:13:24 -04001272void Context::handleError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001273{
Geoff Langda5777c2014-07-11 09:52:58 -04001274 if (error.isError())
1275 {
1276 mErrors.insert(error.getCode());
Geoff Lang70d0f492015-12-10 17:45:46 -05001277
1278 if (!error.getMessage().empty())
1279 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001280 auto *debug = &mGLState.getDebug();
1281 debug->insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
1282 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
Geoff Lang70d0f492015-12-10 17:45:46 -05001283 }
Geoff Langda5777c2014-07-11 09:52:58 -04001284 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001285}
1286
1287// Get one of the recorded errors and clear its flag, if any.
1288// [OpenGL ES 2.0.24] section 2.5 page 13.
1289GLenum Context::getError()
1290{
Geoff Langda5777c2014-07-11 09:52:58 -04001291 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001292 {
Geoff Langda5777c2014-07-11 09:52:58 -04001293 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001294 }
Geoff Langda5777c2014-07-11 09:52:58 -04001295 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001296 {
Geoff Langda5777c2014-07-11 09:52:58 -04001297 GLenum error = *mErrors.begin();
1298 mErrors.erase(mErrors.begin());
1299 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001300 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001301}
1302
1303GLenum Context::getResetStatus()
1304{
Jamie Madill93e13fb2014-11-06 15:27:25 -05001305 //TODO(jmadill): needs MANGLE reworking
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00001306 if (mResetStatus == GL_NO_ERROR && !mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001307 {
daniel@transgaming.comf688c0d2012-10-31 17:52:57 +00001308 // mResetStatus will be set by the markContextLost callback
1309 // in the case a notification is sent
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001310 if (mImplementation->testDeviceLost())
Jamie Madill9dd0cf02014-11-24 11:38:51 -05001311 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001312 mImplementation->notifyDeviceLost();
Jamie Madill9dd0cf02014-11-24 11:38:51 -05001313 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001314 }
1315
1316 GLenum status = mResetStatus;
1317
1318 if (mResetStatus != GL_NO_ERROR)
1319 {
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00001320 ASSERT(mContextLost);
1321
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001322 if (mImplementation->testDeviceResettable())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001323 {
1324 mResetStatus = GL_NO_ERROR;
1325 }
1326 }
Jamie Madill893ab082014-05-16 16:56:10 -04001327
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001328 return status;
1329}
1330
1331bool Context::isResetNotificationEnabled()
1332{
1333 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
1334}
1335
Corentin Walleze3b10e82015-05-20 11:06:25 -04001336const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01001337{
Corentin Walleze3b10e82015-05-20 11:06:25 -04001338 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01001339}
1340
1341EGLenum Context::getClientType() const
1342{
1343 return mClientType;
1344}
1345
1346EGLenum Context::getRenderBuffer() const
1347{
Corentin Wallez37c39792015-08-20 14:19:46 -04001348 auto framebufferIt = mFramebufferMap.find(0);
1349 if (framebufferIt != mFramebufferMap.end())
1350 {
1351 const Framebuffer *framebuffer = framebufferIt->second;
1352 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(GL_BACK);
1353
1354 ASSERT(backAttachment != nullptr);
1355 return backAttachment->getSurface()->getRenderBuffer();
1356 }
1357 else
1358 {
1359 return EGL_NONE;
1360 }
Régis Fénéon83107972015-02-05 12:57:44 +01001361}
1362
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001363VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05001364{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001365 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001366 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
1367 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05001368 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001369 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle, MAX_VERTEX_ATTRIBS);
1370
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001371 mVertexArrayMap[vertexArrayHandle] = vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05001372 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001373
1374 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05001375}
1376
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001377TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05001378{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001379 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001380 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
1381 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05001382 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001383 transformFeedback =
1384 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001385 transformFeedback->addRef();
1386 mTransformFeedbackMap[transformFeedbackHandle] = transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05001387 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001388
1389 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05001390}
1391
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001392Framebuffer *Context::checkFramebufferAllocation(GLuint framebuffer)
1393{
1394 // Can be called from Bind without a prior call to Gen.
1395 auto framebufferIt = mFramebufferMap.find(framebuffer);
1396 bool neverCreated = framebufferIt == mFramebufferMap.end();
1397 if (neverCreated || framebufferIt->second == nullptr)
1398 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001399 Framebuffer *newFBO = new Framebuffer(mCaps, mImplementation.get(), framebuffer);
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001400 if (neverCreated)
1401 {
1402 mFramebufferHandleAllocator.reserve(framebuffer);
1403 mFramebufferMap[framebuffer] = newFBO;
1404 return newFBO;
1405 }
1406
1407 framebufferIt->second = newFBO;
1408 }
1409
1410 return framebufferIt->second;
1411}
1412
Geoff Lang36167ab2015-12-07 10:27:14 -05001413bool Context::isVertexArrayGenerated(GLuint vertexArray)
1414{
1415 return mVertexArrayMap.find(vertexArray) != mVertexArrayMap.end();
1416}
1417
1418bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
1419{
1420 return mTransformFeedbackMap.find(transformFeedback) != mTransformFeedbackMap.end();
1421}
1422
Shannon Woods53a94a82014-06-24 15:20:36 -04001423void Context::detachTexture(GLuint texture)
1424{
1425 // Simple pass-through to State's detachTexture method, as textures do not require
1426 // allocation map management either here or in the resource manager at detach time.
1427 // Zero textures are held by the Context, and we don't attempt to request them from
1428 // the State.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001429 mGLState.detachTexture(mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04001430}
1431
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001432void Context::detachBuffer(GLuint buffer)
1433{
Yuly Novikov5807a532015-12-03 13:01:22 -05001434 // Simple pass-through to State's detachBuffer method, since
1435 // only buffer attachments to container objects that are bound to the current context
1436 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04001437
Yuly Novikov5807a532015-12-03 13:01:22 -05001438 // [OpenGL ES 3.2] section 5.1.2 page 45:
1439 // Attachments to unbound container objects, such as
1440 // deletion of a buffer attached to a vertex array object which is not bound to the context,
1441 // are not affected and continue to act as references on the deleted object
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001442 mGLState.detachBuffer(buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001443}
1444
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001445void Context::detachFramebuffer(GLuint framebuffer)
1446{
Shannon Woods53a94a82014-06-24 15:20:36 -04001447 // Framebuffer detachment is handled by Context, because 0 is a valid
1448 // Framebuffer object, and a pointer to it must be passed from Context
1449 // to State at binding time.
1450
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001451 // [OpenGL ES 2.0.24] section 4.4 page 107:
1452 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though
1453 // BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero.
1454
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001455 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001456 {
1457 bindReadFramebuffer(0);
1458 }
1459
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001460 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001461 {
1462 bindDrawFramebuffer(0);
1463 }
1464}
1465
1466void Context::detachRenderbuffer(GLuint renderbuffer)
1467{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001468 mGLState.detachRenderbuffer(renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001469}
1470
Jamie Madill57a89722013-07-02 11:57:03 -04001471void Context::detachVertexArray(GLuint vertexArray)
1472{
Jamie Madill77a72f62015-04-14 11:18:32 -04001473 // Vertex array detachment is handled by Context, because 0 is a valid
1474 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04001475 // binding time.
1476
Jamie Madill57a89722013-07-02 11:57:03 -04001477 // [OpenGL ES 3.0.2] section 2.10 page 43:
1478 // If a vertex array object that is currently bound is deleted, the binding
1479 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001480 if (mGLState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04001481 {
1482 bindVertexArray(0);
1483 }
1484}
1485
Geoff Langc8058452014-02-03 12:04:11 -05001486void Context::detachTransformFeedback(GLuint transformFeedback)
1487{
Corentin Walleza2257da2016-04-19 16:43:12 -04001488 // Transform feedback detachment is handled by Context, because 0 is a valid
1489 // transform feedback, and a pointer to it must be passed from Context to State at
1490 // binding time.
1491
1492 // The OpenGL specification doesn't mention what should happen when the currently bound
1493 // transform feedback object is deleted. Since it is a container object, we treat it like
1494 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001495 if (mGLState.removeTransformFeedbackBinding(transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04001496 {
1497 bindTransformFeedback(0);
1498 }
Geoff Langc8058452014-02-03 12:04:11 -05001499}
1500
Jamie Madilldc356042013-07-19 16:36:57 -04001501void Context::detachSampler(GLuint sampler)
1502{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001503 mGLState.detachSampler(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001504}
1505
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001506void Context::setVertexAttribDivisor(GLuint index, GLuint divisor)
1507{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001508 mGLState.setVertexAttribDivisor(index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001509}
1510
Jamie Madille29d1672013-07-19 16:36:57 -04001511void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
1512{
Jamie Madill901b3792016-05-26 09:20:40 -04001513 mResourceManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille29d1672013-07-19 16:36:57 -04001514
1515 Sampler *samplerObject = getSampler(sampler);
1516 ASSERT(samplerObject);
1517
Geoff Lang69cce582015-09-17 13:20:36 -04001518 // clang-format off
Jamie Madille29d1672013-07-19 16:36:57 -04001519 switch (pname)
1520 {
Geoff Lang69cce582015-09-17 13:20:36 -04001521 case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(static_cast<GLenum>(param)); break;
1522 case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(static_cast<GLenum>(param)); break;
1523 case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(static_cast<GLenum>(param)); break;
1524 case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(static_cast<GLenum>(param)); break;
1525 case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(static_cast<GLenum>(param)); break;
1526 case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject->setMaxAnisotropy(std::min(static_cast<GLfloat>(param), getExtensions().maxTextureAnisotropy)); break;
1527 case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(static_cast<GLfloat>(param)); break;
1528 case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(static_cast<GLfloat>(param)); break;
1529 case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(static_cast<GLenum>(param)); break;
1530 case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(static_cast<GLenum>(param)); break;
1531 default: UNREACHABLE(); break;
Jamie Madille29d1672013-07-19 16:36:57 -04001532 }
Geoff Lang69cce582015-09-17 13:20:36 -04001533 // clang-format on
Jamie Madille29d1672013-07-19 16:36:57 -04001534}
1535
1536void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
1537{
Jamie Madill901b3792016-05-26 09:20:40 -04001538 mResourceManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille29d1672013-07-19 16:36:57 -04001539
1540 Sampler *samplerObject = getSampler(sampler);
1541 ASSERT(samplerObject);
1542
Geoff Lang69cce582015-09-17 13:20:36 -04001543 // clang-format off
Jamie Madille29d1672013-07-19 16:36:57 -04001544 switch (pname)
1545 {
Geoff Lang69cce582015-09-17 13:20:36 -04001546 case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(uiround<GLenum>(param)); break;
1547 case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(uiround<GLenum>(param)); break;
1548 case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(uiround<GLenum>(param)); break;
1549 case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(uiround<GLenum>(param)); break;
1550 case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(uiround<GLenum>(param)); break;
1551 case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject->setMaxAnisotropy(std::min(param, getExtensions().maxTextureAnisotropy)); break;
1552 case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(param); break;
1553 case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(param); break;
1554 case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(uiround<GLenum>(param)); break;
1555 case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(uiround<GLenum>(param)); break;
1556 default: UNREACHABLE(); break;
Jamie Madille29d1672013-07-19 16:36:57 -04001557 }
Geoff Lang69cce582015-09-17 13:20:36 -04001558 // clang-format on
Jamie Madille29d1672013-07-19 16:36:57 -04001559}
1560
Jamie Madill9675b802013-07-19 16:36:59 -04001561GLint Context::getSamplerParameteri(GLuint sampler, GLenum pname)
1562{
Jamie Madill901b3792016-05-26 09:20:40 -04001563 mResourceManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madill9675b802013-07-19 16:36:59 -04001564
1565 Sampler *samplerObject = getSampler(sampler);
1566 ASSERT(samplerObject);
1567
Geoff Lang69cce582015-09-17 13:20:36 -04001568 // clang-format off
Jamie Madill9675b802013-07-19 16:36:59 -04001569 switch (pname)
1570 {
Geoff Lang69cce582015-09-17 13:20:36 -04001571 case GL_TEXTURE_MIN_FILTER: return static_cast<GLint>(samplerObject->getMinFilter());
1572 case GL_TEXTURE_MAG_FILTER: return static_cast<GLint>(samplerObject->getMagFilter());
1573 case GL_TEXTURE_WRAP_S: return static_cast<GLint>(samplerObject->getWrapS());
1574 case GL_TEXTURE_WRAP_T: return static_cast<GLint>(samplerObject->getWrapT());
1575 case GL_TEXTURE_WRAP_R: return static_cast<GLint>(samplerObject->getWrapR());
1576 case GL_TEXTURE_MAX_ANISOTROPY_EXT: return static_cast<GLint>(samplerObject->getMaxAnisotropy());
Olli Etuaho6ad07232016-03-03 17:15:49 +02001577 case GL_TEXTURE_MIN_LOD: return iround<GLint>(samplerObject->getMinLod());
1578 case GL_TEXTURE_MAX_LOD: return iround<GLint>(samplerObject->getMaxLod());
Geoff Lang69cce582015-09-17 13:20:36 -04001579 case GL_TEXTURE_COMPARE_MODE: return static_cast<GLint>(samplerObject->getCompareMode());
1580 case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLint>(samplerObject->getCompareFunc());
1581 default: UNREACHABLE(); return 0;
Jamie Madill9675b802013-07-19 16:36:59 -04001582 }
Geoff Lang69cce582015-09-17 13:20:36 -04001583 // clang-format on
Jamie Madill9675b802013-07-19 16:36:59 -04001584}
1585
1586GLfloat Context::getSamplerParameterf(GLuint sampler, GLenum pname)
1587{
Jamie Madill901b3792016-05-26 09:20:40 -04001588 mResourceManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madill9675b802013-07-19 16:36:59 -04001589
1590 Sampler *samplerObject = getSampler(sampler);
1591 ASSERT(samplerObject);
1592
Geoff Lang69cce582015-09-17 13:20:36 -04001593 // clang-format off
Jamie Madill9675b802013-07-19 16:36:59 -04001594 switch (pname)
1595 {
Geoff Lang69cce582015-09-17 13:20:36 -04001596 case GL_TEXTURE_MIN_FILTER: return static_cast<GLfloat>(samplerObject->getMinFilter());
1597 case GL_TEXTURE_MAG_FILTER: return static_cast<GLfloat>(samplerObject->getMagFilter());
1598 case GL_TEXTURE_WRAP_S: return static_cast<GLfloat>(samplerObject->getWrapS());
1599 case GL_TEXTURE_WRAP_T: return static_cast<GLfloat>(samplerObject->getWrapT());
1600 case GL_TEXTURE_WRAP_R: return static_cast<GLfloat>(samplerObject->getWrapR());
1601 case GL_TEXTURE_MAX_ANISOTROPY_EXT: return samplerObject->getMaxAnisotropy();
1602 case GL_TEXTURE_MIN_LOD: return samplerObject->getMinLod();
1603 case GL_TEXTURE_MAX_LOD: return samplerObject->getMaxLod();
1604 case GL_TEXTURE_COMPARE_MODE: return static_cast<GLfloat>(samplerObject->getCompareMode());
1605 case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLfloat>(samplerObject->getCompareFunc());
1606 default: UNREACHABLE(); return 0;
Jamie Madill9675b802013-07-19 16:36:59 -04001607 }
Geoff Lang69cce582015-09-17 13:20:36 -04001608 // clang-format on
Jamie Madill9675b802013-07-19 16:36:59 -04001609}
1610
Olli Etuahof0fee072016-03-30 15:11:58 +03001611void Context::programParameteri(GLuint program, GLenum pname, GLint value)
1612{
1613 gl::Program *programObject = getProgram(program);
1614 ASSERT(programObject != nullptr);
1615
1616 ASSERT(pname == GL_PROGRAM_BINARY_RETRIEVABLE_HINT);
1617 programObject->setBinaryRetrievableHint(value != GL_FALSE);
1618}
1619
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001620void Context::initRendererString()
1621{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00001622 std::ostringstream rendererString;
1623 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001624 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00001625 rendererString << ")";
1626
Geoff Langcec35902014-04-16 10:52:36 -04001627 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001628}
1629
Geoff Langc0b9ef42014-07-02 10:02:37 -04001630const std::string &Context::getRendererString() const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001631{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00001632 return mRendererString;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001633}
1634
Geoff Langcec35902014-04-16 10:52:36 -04001635void Context::initExtensionStrings()
1636{
Geoff Lang493daf52014-07-03 13:38:44 -04001637 mExtensionStrings = mExtensions.getStrings();
Geoff Langcec35902014-04-16 10:52:36 -04001638
Geoff Langc0b9ef42014-07-02 10:02:37 -04001639 std::ostringstream combinedStringStream;
1640 std::copy(mExtensionStrings.begin(), mExtensionStrings.end(), std::ostream_iterator<std::string>(combinedStringStream, " "));
1641 mExtensionString = combinedStringStream.str();
Geoff Langcec35902014-04-16 10:52:36 -04001642}
1643
Geoff Langc0b9ef42014-07-02 10:02:37 -04001644const std::string &Context::getExtensionString() const
Geoff Langcec35902014-04-16 10:52:36 -04001645{
1646 return mExtensionString;
1647}
1648
Geoff Langc0b9ef42014-07-02 10:02:37 -04001649const std::string &Context::getExtensionString(size_t idx) const
Geoff Langcec35902014-04-16 10:52:36 -04001650{
1651 return mExtensionStrings[idx];
1652}
1653
1654size_t Context::getExtensionStringCount() const
1655{
1656 return mExtensionStrings.size();
1657}
1658
Olli Etuahoc3e55a42016-03-09 16:29:18 +02001659void Context::beginTransformFeedback(GLenum primitiveMode)
1660{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001661 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02001662 ASSERT(transformFeedback != nullptr);
1663 ASSERT(!transformFeedback->isPaused());
1664
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001665 transformFeedback->begin(primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02001666}
1667
1668bool Context::hasActiveTransformFeedback(GLuint program) const
1669{
1670 for (auto pair : mTransformFeedbackMap)
1671 {
1672 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
1673 {
1674 return true;
1675 }
1676 }
1677 return false;
1678}
1679
Jamie Madill00ed7a12016-05-19 13:13:38 -04001680void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04001681{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001682 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04001683
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001684 mExtensions = mImplementation->getNativeExtensions();
Geoff Lang493daf52014-07-03 13:38:44 -04001685
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001686 mLimitations = mImplementation->getNativeLimitations();
Austin Kinross02df7962015-07-01 10:03:42 -07001687
Jamie Madill00ed7a12016-05-19 13:13:38 -04001688 if (mClientVersion < 3)
Geoff Lang493daf52014-07-03 13:38:44 -04001689 {
1690 // Disable ES3+ extensions
1691 mExtensions.colorBufferFloat = false;
Geoff Langb66a9092016-05-16 15:59:14 -04001692 mExtensions.eglImageExternalEssl3 = false;
Vincent Lang25ab4512016-05-13 18:13:59 +02001693 mExtensions.textureNorm16 = false;
Geoff Lang493daf52014-07-03 13:38:44 -04001694 }
1695
Jamie Madill00ed7a12016-05-19 13:13:38 -04001696 if (mClientVersion > 2)
Geoff Lang493daf52014-07-03 13:38:44 -04001697 {
1698 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
1699 //mExtensions.sRGB = false;
1700 }
1701
Jamie Madill00ed7a12016-05-19 13:13:38 -04001702 // Some extensions are always available because they are implemented in the GL layer.
1703 mExtensions.bindUniformLocation = true;
1704 mExtensions.vertexArrayObject = true;
1705
1706 // Enable the no error extension if the context was created with the flag.
1707 mExtensions.noError = mSkipValidation;
1708
Geoff Lang70d0f492015-12-10 17:45:46 -05001709 // Explicitly enable GL_KHR_debug
1710 mExtensions.debug = true;
1711 mExtensions.maxDebugMessageLength = 1024;
1712 mExtensions.maxDebugLoggedMessages = 1024;
1713 mExtensions.maxDebugGroupStackDepth = 1024;
1714 mExtensions.maxLabelLength = 1024;
1715
Geoff Lang301d1612014-07-09 10:34:37 -04001716 // Apply implementation limits
1717 mCaps.maxVertexAttributes = std::min<GLuint>(mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Geoff Lang301d1612014-07-09 10:34:37 -04001718 mCaps.maxVertexUniformBlocks = std::min<GLuint>(mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
1719 mCaps.maxVertexOutputComponents = std::min<GLuint>(mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
1720
1721 mCaps.maxFragmentInputComponents = std::min<GLuint>(mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
Geoff Lang3a61c322014-07-10 13:01:54 -04001722
Geoff Lang900013c2014-07-07 11:32:19 -04001723 mCaps.compressedTextureFormats.clear();
1724
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001725 const TextureCapsMap &rendererFormats = mImplementation->getNativeTextureCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04001726 for (TextureCapsMap::const_iterator i = rendererFormats.begin(); i != rendererFormats.end(); i++)
1727 {
1728 GLenum format = i->first;
1729 TextureCaps formatCaps = i->second;
1730
Geoff Lang5d601382014-07-22 15:14:06 -04001731 const InternalFormat &formatInfo = GetInternalFormatInfo(format);
Geoff Langd87878e2014-09-19 15:42:59 -04001732
Geoff Lang0d8b7242015-09-09 14:56:53 -04001733 // Update the format caps based on the client version and extensions.
1734 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
1735 // ES3.
1736 formatCaps.texturable =
Jamie Madill00ed7a12016-05-19 13:13:38 -04001737 formatCaps.texturable && formatInfo.textureSupport(mClientVersion, mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04001738 formatCaps.renderable =
Jamie Madill00ed7a12016-05-19 13:13:38 -04001739 formatCaps.renderable && formatInfo.renderSupport(mClientVersion, mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04001740 formatCaps.filterable =
Jamie Madill00ed7a12016-05-19 13:13:38 -04001741 formatCaps.filterable && formatInfo.filterSupport(mClientVersion, mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04001742
1743 // OpenGL ES does not support multisampling with integer formats
1744 if (!formatInfo.renderSupport || formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)
Geoff Lang493daf52014-07-03 13:38:44 -04001745 {
Geoff Langd87878e2014-09-19 15:42:59 -04001746 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04001747 }
Geoff Langd87878e2014-09-19 15:42:59 -04001748
1749 if (formatCaps.texturable && formatInfo.compressed)
1750 {
1751 mCaps.compressedTextureFormats.push_back(format);
1752 }
1753
1754 mTextureCaps.insert(format, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04001755 }
1756}
1757
Jamie Madill1b94d432015-08-07 13:23:23 -04001758void Context::syncRendererState()
1759{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001760 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
1761 mImplementation->syncState(mGLState, dirtyBits);
1762 mGLState.clearDirtyBits();
1763 mGLState.syncDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -04001764}
1765
Jamie Madillad9f24e2016-02-12 09:27:24 -05001766void Context::syncRendererState(const State::DirtyBits &bitMask,
1767 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04001768{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001769 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
1770 mImplementation->syncState(mGLState, dirtyBits);
1771 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001772
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001773 mGLState.syncDirtyObjects(objectMask);
Jamie Madill1b94d432015-08-07 13:23:23 -04001774}
Jamie Madillc29968b2016-01-20 11:17:23 -05001775
1776void Context::blitFramebuffer(GLint srcX0,
1777 GLint srcY0,
1778 GLint srcX1,
1779 GLint srcY1,
1780 GLint dstX0,
1781 GLint dstY0,
1782 GLint dstX1,
1783 GLint dstY1,
1784 GLbitfield mask,
1785 GLenum filter)
1786{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001787 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05001788 ASSERT(drawFramebuffer);
1789
1790 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
1791 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
1792
Jamie Madillad9f24e2016-02-12 09:27:24 -05001793 syncStateForBlit();
Jamie Madillc29968b2016-01-20 11:17:23 -05001794
Jamie Madill8415b5f2016-04-26 13:41:39 -04001795 handleError(drawFramebuffer->blit(mImplementation.get(), srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001796}
Jamie Madillc29968b2016-01-20 11:17:23 -05001797
1798void Context::clear(GLbitfield mask)
1799{
Jamie Madillad9f24e2016-02-12 09:27:24 -05001800 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001801 handleError(mGLState.getDrawFramebuffer()->clear(mImplementation.get(), mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05001802}
1803
1804void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
1805{
Jamie Madillad9f24e2016-02-12 09:27:24 -05001806 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001807 handleError(mGLState.getDrawFramebuffer()->clearBufferfv(mImplementation.get(), buffer,
1808 drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05001809}
1810
1811void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
1812{
Jamie Madillad9f24e2016-02-12 09:27:24 -05001813 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001814 handleError(mGLState.getDrawFramebuffer()->clearBufferuiv(mImplementation.get(), buffer,
1815 drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05001816}
1817
1818void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
1819{
Jamie Madillad9f24e2016-02-12 09:27:24 -05001820 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001821 handleError(mGLState.getDrawFramebuffer()->clearBufferiv(mImplementation.get(), buffer,
1822 drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05001823}
1824
1825void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
1826{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001827 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05001828 ASSERT(framebufferObject);
1829
1830 // If a buffer is not present, the clear has no effect
1831 if (framebufferObject->getDepthbuffer() == nullptr &&
1832 framebufferObject->getStencilbuffer() == nullptr)
1833 {
1834 return;
1835 }
1836
Jamie Madillad9f24e2016-02-12 09:27:24 -05001837 syncStateForClear();
Jamie Madill8415b5f2016-04-26 13:41:39 -04001838 handleError(framebufferObject->clearBufferfi(mImplementation.get(), buffer, drawbuffer, depth,
1839 stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05001840}
1841
1842void Context::readPixels(GLint x,
1843 GLint y,
1844 GLsizei width,
1845 GLsizei height,
1846 GLenum format,
1847 GLenum type,
1848 GLvoid *pixels)
1849{
Jamie Madillad9f24e2016-02-12 09:27:24 -05001850 syncStateForReadPixels();
Jamie Madillc29968b2016-01-20 11:17:23 -05001851
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001852 Framebuffer *framebufferObject = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05001853 ASSERT(framebufferObject);
1854
1855 Rectangle area(x, y, width, height);
Jamie Madill8415b5f2016-04-26 13:41:39 -04001856 handleError(framebufferObject->readPixels(mImplementation.get(), area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05001857}
1858
1859void Context::copyTexImage2D(GLenum target,
1860 GLint level,
1861 GLenum internalformat,
1862 GLint x,
1863 GLint y,
1864 GLsizei width,
1865 GLsizei height,
1866 GLint border)
1867{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001868 // Only sync the read FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001869 mGLState.syncDirtyObject(GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001870
Jamie Madillc29968b2016-01-20 11:17:23 -05001871 Rectangle sourceArea(x, y, width, height);
1872
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001873 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05001874 Texture *texture =
1875 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill437fa652016-05-03 15:13:24 -04001876 handleError(texture->copyImage(target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05001877}
1878
1879void Context::copyTexSubImage2D(GLenum target,
1880 GLint level,
1881 GLint xoffset,
1882 GLint yoffset,
1883 GLint x,
1884 GLint y,
1885 GLsizei width,
1886 GLsizei height)
1887{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001888 // Only sync the read FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001889 mGLState.syncDirtyObject(GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001890
Jamie Madillc29968b2016-01-20 11:17:23 -05001891 Offset destOffset(xoffset, yoffset, 0);
1892 Rectangle sourceArea(x, y, width, height);
1893
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001894 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05001895 Texture *texture =
1896 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill437fa652016-05-03 15:13:24 -04001897 handleError(texture->copySubImage(target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05001898}
1899
1900void Context::copyTexSubImage3D(GLenum target,
1901 GLint level,
1902 GLint xoffset,
1903 GLint yoffset,
1904 GLint zoffset,
1905 GLint x,
1906 GLint y,
1907 GLsizei width,
1908 GLsizei height)
1909{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001910 // Only sync the read FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001911 mGLState.syncDirtyObject(GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001912
Jamie Madillc29968b2016-01-20 11:17:23 -05001913 Offset destOffset(xoffset, yoffset, zoffset);
1914 Rectangle sourceArea(x, y, width, height);
1915
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001916 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05001917 Texture *texture = getTargetTexture(target);
Jamie Madill437fa652016-05-03 15:13:24 -04001918 handleError(texture->copySubImage(target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05001919}
1920
1921void Context::framebufferTexture2D(GLenum target,
1922 GLenum attachment,
1923 GLenum textarget,
1924 GLuint texture,
1925 GLint level)
1926{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001927 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05001928 ASSERT(framebuffer);
1929
1930 if (texture != 0)
1931 {
1932 Texture *textureObj = getTexture(texture);
1933
1934 ImageIndex index = ImageIndex::MakeInvalid();
1935
1936 if (textarget == GL_TEXTURE_2D)
1937 {
1938 index = ImageIndex::Make2D(level);
1939 }
1940 else
1941 {
1942 ASSERT(IsCubeMapTextureTarget(textarget));
1943 index = ImageIndex::MakeCube(textarget, level);
1944 }
1945
1946 framebuffer->setAttachment(GL_TEXTURE, attachment, index, textureObj);
1947 }
1948 else
1949 {
1950 framebuffer->resetAttachment(attachment);
1951 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001952
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001953 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05001954}
1955
1956void Context::framebufferRenderbuffer(GLenum target,
1957 GLenum attachment,
1958 GLenum renderbuffertarget,
1959 GLuint renderbuffer)
1960{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001961 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05001962 ASSERT(framebuffer);
1963
1964 if (renderbuffer != 0)
1965 {
1966 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
1967 framebuffer->setAttachment(GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
1968 renderbufferObject);
1969 }
1970 else
1971 {
1972 framebuffer->resetAttachment(attachment);
1973 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001974
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001975 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05001976}
1977
1978void Context::framebufferTextureLayer(GLenum target,
1979 GLenum attachment,
1980 GLuint texture,
1981 GLint level,
1982 GLint layer)
1983{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001984 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05001985 ASSERT(framebuffer);
1986
1987 if (texture != 0)
1988 {
1989 Texture *textureObject = getTexture(texture);
1990
1991 ImageIndex index = ImageIndex::MakeInvalid();
1992
1993 if (textureObject->getTarget() == GL_TEXTURE_3D)
1994 {
1995 index = ImageIndex::Make3D(level, layer);
1996 }
1997 else
1998 {
1999 ASSERT(textureObject->getTarget() == GL_TEXTURE_2D_ARRAY);
2000 index = ImageIndex::Make2DArray(level, layer);
2001 }
2002
2003 framebuffer->setAttachment(GL_TEXTURE, attachment, index, textureObject);
2004 }
2005 else
2006 {
2007 framebuffer->resetAttachment(attachment);
2008 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002009
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002010 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002011}
2012
2013void Context::drawBuffers(GLsizei n, const GLenum *bufs)
2014{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002015 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002016 ASSERT(framebuffer);
2017 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002018 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05002019}
2020
2021void Context::readBuffer(GLenum mode)
2022{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002023 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002024 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002025 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05002026}
2027
2028void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
2029{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002030 // Only sync the FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002031 mGLState.syncDirtyObject(target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002032
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002033 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002034 ASSERT(framebuffer);
2035
2036 // The specification isn't clear what should be done when the framebuffer isn't complete.
2037 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill437fa652016-05-03 15:13:24 -04002038 handleError(framebuffer->discard(numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05002039}
2040
2041void Context::invalidateFramebuffer(GLenum target,
2042 GLsizei numAttachments,
2043 const GLenum *attachments)
2044{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002045 // Only sync the FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002046 mGLState.syncDirtyObject(target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002047
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002048 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002049 ASSERT(framebuffer);
2050
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002051 if (framebuffer->checkStatus(mState) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05002052 {
Jamie Madill437fa652016-05-03 15:13:24 -04002053 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05002054 }
Jamie Madill437fa652016-05-03 15:13:24 -04002055
2056 handleError(framebuffer->invalidate(numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05002057}
2058
2059void Context::invalidateSubFramebuffer(GLenum target,
2060 GLsizei numAttachments,
2061 const GLenum *attachments,
2062 GLint x,
2063 GLint y,
2064 GLsizei width,
2065 GLsizei height)
2066{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002067 // Only sync the FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002068 mGLState.syncDirtyObject(target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002069
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002070 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002071 ASSERT(framebuffer);
2072
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002073 if (framebuffer->checkStatus(mState) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05002074 {
Jamie Madill437fa652016-05-03 15:13:24 -04002075 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05002076 }
Jamie Madill437fa652016-05-03 15:13:24 -04002077
2078 Rectangle area(x, y, width, height);
2079 handleError(framebuffer->invalidateSub(numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05002080}
2081
Jamie Madill73a84962016-02-12 09:27:23 -05002082void Context::texImage2D(GLenum target,
2083 GLint level,
2084 GLint internalformat,
2085 GLsizei width,
2086 GLsizei height,
2087 GLint border,
2088 GLenum format,
2089 GLenum type,
2090 const GLvoid *pixels)
2091{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002092 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002093
2094 Extents size(width, height, 1);
2095 Texture *texture =
2096 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002097 handleError(texture->setImage(mGLState.getUnpackState(), target, level, internalformat, size,
Jamie Madill437fa652016-05-03 15:13:24 -04002098 format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05002099}
2100
2101void Context::texImage3D(GLenum target,
2102 GLint level,
2103 GLint internalformat,
2104 GLsizei width,
2105 GLsizei height,
2106 GLsizei depth,
2107 GLint border,
2108 GLenum format,
2109 GLenum type,
2110 const GLvoid *pixels)
2111{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002112 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002113
2114 Extents size(width, height, depth);
2115 Texture *texture = getTargetTexture(target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002116 handleError(texture->setImage(mGLState.getUnpackState(), target, level, internalformat, size,
Jamie Madill437fa652016-05-03 15:13:24 -04002117 format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05002118}
2119
2120void Context::texSubImage2D(GLenum target,
2121 GLint level,
2122 GLint xoffset,
2123 GLint yoffset,
2124 GLsizei width,
2125 GLsizei height,
2126 GLenum format,
2127 GLenum type,
2128 const GLvoid *pixels)
2129{
2130 // Zero sized uploads are valid but no-ops
2131 if (width == 0 || height == 0)
2132 {
2133 return;
2134 }
2135
Jamie Madillad9f24e2016-02-12 09:27:24 -05002136 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002137
2138 Box area(xoffset, yoffset, 0, width, height, 1);
2139 Texture *texture =
2140 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002141 handleError(texture->setSubImage(mGLState.getUnpackState(), target, level, area, format, type,
Jamie Madill437fa652016-05-03 15:13:24 -04002142 reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05002143}
2144
2145void Context::texSubImage3D(GLenum target,
2146 GLint level,
2147 GLint xoffset,
2148 GLint yoffset,
2149 GLint zoffset,
2150 GLsizei width,
2151 GLsizei height,
2152 GLsizei depth,
2153 GLenum format,
2154 GLenum type,
2155 const GLvoid *pixels)
2156{
2157 // Zero sized uploads are valid but no-ops
2158 if (width == 0 || height == 0 || depth == 0)
2159 {
2160 return;
2161 }
2162
Jamie Madillad9f24e2016-02-12 09:27:24 -05002163 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002164
2165 Box area(xoffset, yoffset, zoffset, width, height, depth);
2166 Texture *texture = getTargetTexture(target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002167 handleError(texture->setSubImage(mGLState.getUnpackState(), target, level, area, format, type,
Jamie Madill437fa652016-05-03 15:13:24 -04002168 reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05002169}
2170
2171void Context::compressedTexImage2D(GLenum target,
2172 GLint level,
2173 GLenum internalformat,
2174 GLsizei width,
2175 GLsizei height,
2176 GLint border,
2177 GLsizei imageSize,
2178 const GLvoid *data)
2179{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002180 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002181
2182 Extents size(width, height, 1);
2183 Texture *texture =
2184 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002185 handleError(texture->setCompressedImage(mGLState.getUnpackState(), target, level,
2186 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04002187 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05002188}
2189
2190void Context::compressedTexImage3D(GLenum target,
2191 GLint level,
2192 GLenum internalformat,
2193 GLsizei width,
2194 GLsizei height,
2195 GLsizei depth,
2196 GLint border,
2197 GLsizei imageSize,
2198 const GLvoid *data)
2199{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002200 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002201
2202 Extents size(width, height, depth);
2203 Texture *texture = getTargetTexture(target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002204 handleError(texture->setCompressedImage(mGLState.getUnpackState(), target, level,
2205 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04002206 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05002207}
2208
2209void Context::compressedTexSubImage2D(GLenum target,
2210 GLint level,
2211 GLint xoffset,
2212 GLint yoffset,
2213 GLsizei width,
2214 GLsizei height,
2215 GLenum format,
2216 GLsizei imageSize,
2217 const GLvoid *data)
2218{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002219 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002220
2221 Box area(xoffset, yoffset, 0, width, height, 1);
2222 Texture *texture =
2223 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002224 handleError(texture->setCompressedSubImage(mGLState.getUnpackState(), target, level, area,
2225 format, imageSize,
2226 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05002227}
2228
2229void Context::compressedTexSubImage3D(GLenum target,
2230 GLint level,
2231 GLint xoffset,
2232 GLint yoffset,
2233 GLint zoffset,
2234 GLsizei width,
2235 GLsizei height,
2236 GLsizei depth,
2237 GLenum format,
2238 GLsizei imageSize,
2239 const GLvoid *data)
2240{
2241 // Zero sized uploads are valid but no-ops
2242 if (width == 0 || height == 0)
2243 {
2244 return;
2245 }
2246
Jamie Madillad9f24e2016-02-12 09:27:24 -05002247 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002248
2249 Box area(xoffset, yoffset, zoffset, width, height, depth);
2250 Texture *texture = getTargetTexture(target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002251 handleError(texture->setCompressedSubImage(mGLState.getUnpackState(), target, level, area,
2252 format, imageSize,
2253 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05002254}
2255
Olli Etuaho0f2b1562016-05-13 16:15:35 +03002256void Context::generateMipmap(GLenum target)
2257{
2258 Texture *texture = getTargetTexture(target);
2259 handleError(texture->generateMipmap());
2260}
2261
Olli Etuaho4f667482016-03-30 15:56:35 +03002262void Context::getBufferPointerv(GLenum target, GLenum /*pname*/, void **params)
2263{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002264 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03002265 ASSERT(buffer);
2266
2267 if (!buffer->isMapped())
2268 {
2269 *params = nullptr;
2270 }
2271 else
2272 {
2273 *params = buffer->getMapPointer();
2274 }
2275}
2276
2277GLvoid *Context::mapBuffer(GLenum target, GLenum access)
2278{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002279 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03002280 ASSERT(buffer);
2281
2282 Error error = buffer->map(access);
2283 if (error.isError())
2284 {
Jamie Madill437fa652016-05-03 15:13:24 -04002285 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03002286 return nullptr;
2287 }
2288
2289 return buffer->getMapPointer();
2290}
2291
2292GLboolean Context::unmapBuffer(GLenum target)
2293{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002294 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03002295 ASSERT(buffer);
2296
2297 GLboolean result;
2298 Error error = buffer->unmap(&result);
2299 if (error.isError())
2300 {
Jamie Madill437fa652016-05-03 15:13:24 -04002301 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03002302 return GL_FALSE;
2303 }
2304
2305 return result;
2306}
2307
2308GLvoid *Context::mapBufferRange(GLenum target,
2309 GLintptr offset,
2310 GLsizeiptr length,
2311 GLbitfield access)
2312{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002313 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03002314 ASSERT(buffer);
2315
2316 Error error = buffer->mapRange(offset, length, access);
2317 if (error.isError())
2318 {
Jamie Madill437fa652016-05-03 15:13:24 -04002319 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03002320 return nullptr;
2321 }
2322
2323 return buffer->getMapPointer();
2324}
2325
2326void Context::flushMappedBufferRange(GLenum /*target*/, GLintptr /*offset*/, GLsizeiptr /*length*/)
2327{
2328 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
2329}
2330
Jamie Madillad9f24e2016-02-12 09:27:24 -05002331void Context::syncStateForReadPixels()
2332{
2333 syncRendererState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
2334}
2335
2336void Context::syncStateForTexImage()
2337{
2338 syncRendererState(mTexImageDirtyBits, mTexImageDirtyObjects);
2339}
2340
2341void Context::syncStateForClear()
2342{
2343 syncRendererState(mClearDirtyBits, mClearDirtyObjects);
2344}
2345
2346void Context::syncStateForBlit()
2347{
2348 syncRendererState(mBlitDirtyBits, mBlitDirtyObjects);
2349}
2350
Jamie Madillc20ab272016-06-09 07:20:46 -07002351void Context::activeTexture(GLenum texture)
2352{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002353 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07002354}
2355
2356void Context::blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
2357{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002358 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07002359}
2360
2361void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
2362{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002363 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07002364}
2365
2366void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
2367{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002368 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07002369}
2370
2371void Context::clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
2372{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002373 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07002374}
2375
2376void Context::clearDepthf(GLclampf depth)
2377{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002378 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07002379}
2380
2381void Context::clearStencil(GLint s)
2382{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002383 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07002384}
2385
2386void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
2387{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002388 mGLState.setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
Jamie Madillc20ab272016-06-09 07:20:46 -07002389}
2390
2391void Context::cullFace(GLenum mode)
2392{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002393 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07002394}
2395
2396void Context::depthFunc(GLenum func)
2397{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002398 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07002399}
2400
2401void Context::depthMask(GLboolean flag)
2402{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002403 mGLState.setDepthMask(flag != GL_FALSE);
Jamie Madillc20ab272016-06-09 07:20:46 -07002404}
2405
2406void Context::depthRangef(GLclampf zNear, GLclampf zFar)
2407{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002408 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07002409}
2410
2411void Context::disable(GLenum cap)
2412{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002413 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07002414}
2415
2416void Context::disableVertexAttribArray(GLuint index)
2417{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002418 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07002419}
2420
2421void Context::enable(GLenum cap)
2422{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002423 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07002424}
2425
2426void Context::enableVertexAttribArray(GLuint index)
2427{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002428 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07002429}
2430
2431void Context::frontFace(GLenum mode)
2432{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002433 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07002434}
2435
2436void Context::hint(GLenum target, GLenum mode)
2437{
2438 switch (target)
2439 {
2440 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002441 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07002442 break;
2443
2444 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002445 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07002446 break;
2447
2448 default:
2449 UNREACHABLE();
2450 return;
2451 }
2452}
2453
2454void Context::lineWidth(GLfloat width)
2455{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002456 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07002457}
2458
2459void Context::pixelStorei(GLenum pname, GLint param)
2460{
2461 switch (pname)
2462 {
2463 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002464 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07002465 break;
2466
2467 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002468 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07002469 break;
2470
2471 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002472 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07002473 break;
2474
2475 case GL_UNPACK_ROW_LENGTH:
2476 ASSERT((getClientVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002477 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07002478 break;
2479
2480 case GL_UNPACK_IMAGE_HEIGHT:
2481 ASSERT(getClientVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002482 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07002483 break;
2484
2485 case GL_UNPACK_SKIP_IMAGES:
2486 ASSERT(getClientVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002487 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07002488 break;
2489
2490 case GL_UNPACK_SKIP_ROWS:
2491 ASSERT((getClientVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002492 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07002493 break;
2494
2495 case GL_UNPACK_SKIP_PIXELS:
2496 ASSERT((getClientVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002497 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07002498 break;
2499
2500 case GL_PACK_ROW_LENGTH:
2501 ASSERT((getClientVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002502 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07002503 break;
2504
2505 case GL_PACK_SKIP_ROWS:
2506 ASSERT((getClientVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002507 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07002508 break;
2509
2510 case GL_PACK_SKIP_PIXELS:
2511 ASSERT((getClientVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002512 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07002513 break;
2514
2515 default:
2516 UNREACHABLE();
2517 return;
2518 }
2519}
2520
2521void Context::polygonOffset(GLfloat factor, GLfloat units)
2522{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002523 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07002524}
2525
2526void Context::sampleCoverage(GLclampf value, GLboolean invert)
2527{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002528 mGLState.setSampleCoverageParams(clamp01(value), invert == GL_TRUE);
Jamie Madillc20ab272016-06-09 07:20:46 -07002529}
2530
2531void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
2532{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002533 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07002534}
2535
2536void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
2537{
2538 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
2539 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002540 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07002541 }
2542
2543 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
2544 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002545 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07002546 }
2547}
2548
2549void Context::stencilMaskSeparate(GLenum face, GLuint mask)
2550{
2551 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
2552 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002553 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07002554 }
2555
2556 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
2557 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002558 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07002559 }
2560}
2561
2562void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
2563{
2564 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
2565 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002566 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07002567 }
2568
2569 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
2570 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002571 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07002572 }
2573}
2574
2575void Context::vertexAttrib1f(GLuint index, GLfloat x)
2576{
2577 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002578 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07002579}
2580
2581void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
2582{
2583 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002584 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07002585}
2586
2587void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
2588{
2589 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002590 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07002591}
2592
2593void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
2594{
2595 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002596 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07002597}
2598
2599void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
2600{
2601 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002602 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07002603}
2604
2605void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
2606{
2607 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002608 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07002609}
2610
2611void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
2612{
2613 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002614 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07002615}
2616
2617void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
2618{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002619 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07002620}
2621
2622void Context::vertexAttribPointer(GLuint index,
2623 GLint size,
2624 GLenum type,
2625 GLboolean normalized,
2626 GLsizei stride,
2627 const GLvoid *ptr)
2628{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002629 mGLState.setVertexAttribState(index, mGLState.getTargetBuffer(GL_ARRAY_BUFFER), size, type,
2630 normalized == GL_TRUE, false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07002631}
2632
2633void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
2634{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002635 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07002636}
2637
2638void Context::vertexAttribIPointer(GLuint index,
2639 GLint size,
2640 GLenum type,
2641 GLsizei stride,
2642 const GLvoid *pointer)
2643{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002644 mGLState.setVertexAttribState(index, mGLState.getTargetBuffer(GL_ARRAY_BUFFER), size, type,
2645 false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07002646}
2647
2648void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
2649{
2650 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002651 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07002652}
2653
2654void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
2655{
2656 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002657 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07002658}
2659
2660void Context::vertexAttribI4iv(GLuint index, const GLint *v)
2661{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002662 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07002663}
2664
2665void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
2666{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002667 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07002668}
2669
2670void Context::debugMessageControl(GLenum source,
2671 GLenum type,
2672 GLenum severity,
2673 GLsizei count,
2674 const GLuint *ids,
2675 GLboolean enabled)
2676{
2677 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002678 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
2679 (enabled != GL_FALSE));
Jamie Madillc20ab272016-06-09 07:20:46 -07002680}
2681
2682void Context::debugMessageInsert(GLenum source,
2683 GLenum type,
2684 GLuint id,
2685 GLenum severity,
2686 GLsizei length,
2687 const GLchar *buf)
2688{
2689 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002690 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07002691}
2692
2693void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
2694{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002695 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07002696}
2697
2698GLuint Context::getDebugMessageLog(GLuint count,
2699 GLsizei bufSize,
2700 GLenum *sources,
2701 GLenum *types,
2702 GLuint *ids,
2703 GLenum *severities,
2704 GLsizei *lengths,
2705 GLchar *messageLog)
2706{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002707 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
2708 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07002709}
2710
2711void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
2712{
2713 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002714 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07002715}
2716
2717void Context::popDebugGroup()
2718{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002719 mGLState.getDebug().popGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07002720}
2721
Jamie Madillc29968b2016-01-20 11:17:23 -05002722} // namespace gl