blob: 4a6b4e32550dd0a79aba48a66d8a651161e8398c [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>
Sami Väisänene45e53b2016-05-25 10:36:04 +030014#include <string.h>
Sami Väisänend59ca052016-06-21 16:10:00 +030015#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050016
Sami Väisänene45e53b2016-05-25 10:36:04 +030017#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040018#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050019#include "common/utilities.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050020#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050021#include "libANGLE/Compiler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050022#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050023#include "libANGLE/Fence.h"
24#include "libANGLE/Framebuffer.h"
25#include "libANGLE/FramebufferAttachment.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030026#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050027#include "libANGLE/Program.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050028#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050029#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/ResourceManager.h"
31#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050032#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050033#include "libANGLE/Texture.h"
34#include "libANGLE/TransformFeedback.h"
35#include "libANGLE/VertexArray.h"
36#include "libANGLE/formatutils.h"
37#include "libANGLE/validationES.h"
Jamie Madill437fa652016-05-03 15:13:24 -040038#include "libANGLE/renderer/ContextImpl.h"
Jamie Madill53ea9cc2016-05-17 10:12:52 -040039#include "libANGLE/renderer/EGLImplFactory.h"
Martin Radev66fb8202016-07-28 11:45:20 +030040#include "libANGLE/queryconversions.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000041
Geoff Langf6db0982015-08-25 13:04:00 -040042namespace
43{
44
Ian Ewell3ffd78b2016-01-22 16:09:42 -050045template <typename T>
Sami Väisänend59ca052016-06-21 16:10:00 +030046std::vector<gl::Path *> GatherPaths(gl::ResourceManager &resourceManager,
47 GLsizei numPaths,
48 const void *paths,
49 GLuint pathBase)
50{
51 std::vector<gl::Path *> ret;
52 ret.reserve(numPaths);
53
54 const auto *nameArray = static_cast<const T *>(paths);
55
56 for (GLsizei i = 0; i < numPaths; ++i)
57 {
58 const GLuint pathName = nameArray[i] + pathBase;
59
60 ret.push_back(resourceManager.getPath(pathName));
61 }
62
63 return ret;
64}
65
66std::vector<gl::Path *> GatherPaths(gl::ResourceManager &resourceManager,
67 GLsizei numPaths,
68 GLenum pathNameType,
69 const void *paths,
70 GLuint pathBase)
71{
72 switch (pathNameType)
73 {
74 case GL_UNSIGNED_BYTE:
75 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
76
77 case GL_BYTE:
78 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
79
80 case GL_UNSIGNED_SHORT:
81 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
82
83 case GL_SHORT:
84 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
85
86 case GL_UNSIGNED_INT:
87 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
88
89 case GL_INT:
90 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
91 }
92
93 UNREACHABLE();
94 return std::vector<gl::Path *>();
95}
96
97template <typename T>
Ian Ewell3ffd78b2016-01-22 16:09:42 -050098gl::Error GetQueryObjectParameter(gl::Context *context, GLuint id, GLenum pname, T *params)
99{
100 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
101 ASSERT(queryObject != nullptr);
102
103 switch (pname)
104 {
105 case GL_QUERY_RESULT_EXT:
106 return queryObject->getResult(params);
107 case GL_QUERY_RESULT_AVAILABLE_EXT:
108 {
109 bool available;
110 gl::Error error = queryObject->isResultAvailable(&available);
111 if (!error.isError())
112 {
113 *params = static_cast<T>(available ? GL_TRUE : GL_FALSE);
114 }
115 return error;
116 }
117 default:
118 UNREACHABLE();
119 return gl::Error(GL_INVALID_OPERATION, "Unreachable Error");
120 }
121}
122
Geoff Langf6db0982015-08-25 13:04:00 -0400123void MarkTransformFeedbackBufferUsage(gl::TransformFeedback *transformFeedback)
124{
Geoff Lang1a683462015-09-29 15:09:59 -0400125 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400126 {
127 for (size_t tfBufferIndex = 0; tfBufferIndex < transformFeedback->getIndexedBufferCount();
128 tfBufferIndex++)
129 {
130 const OffsetBindingPointer<gl::Buffer> &buffer =
131 transformFeedback->getIndexedBuffer(tfBufferIndex);
132 if (buffer.get() != nullptr)
133 {
134 buffer->onTransformFeedback();
135 }
136 }
137 }
138}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500139
140// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300141EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500142{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400143 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500144}
145
Martin Radev1be913c2016-07-11 17:59:16 +0300146EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
147{
148 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
149}
150
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500151GLenum GetResetStrategy(const egl::AttributeMap &attribs)
152{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400153 EGLAttrib attrib = attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
154 EGL_NO_RESET_NOTIFICATION_EXT);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500155 switch (attrib)
156 {
157 case EGL_NO_RESET_NOTIFICATION:
158 return GL_NO_RESET_NOTIFICATION_EXT;
159 case EGL_LOSE_CONTEXT_ON_RESET:
160 return GL_LOSE_CONTEXT_ON_RESET_EXT;
161 default:
162 UNREACHABLE();
163 return GL_NONE;
164 }
165}
166
167bool GetRobustAccess(const egl::AttributeMap &attribs)
168{
169 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE);
170}
171
172bool GetDebug(const egl::AttributeMap &attribs)
173{
174 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE);
175}
176
177bool GetNoError(const egl::AttributeMap &attribs)
178{
179 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
180}
181
Martin Radev9d901792016-07-15 15:58:58 +0300182std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
183{
184 std::string labelName;
185 if (label != nullptr)
186 {
187 size_t labelLength = length < 0 ? strlen(label) : length;
188 labelName = std::string(label, labelLength);
189 }
190 return labelName;
191}
192
193void GetObjectLabelBase(const std::string &objectLabel,
194 GLsizei bufSize,
195 GLsizei *length,
196 GLchar *label)
197{
198 size_t writeLength = objectLabel.length();
199 if (label != nullptr && bufSize > 0)
200 {
201 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
202 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
203 label[writeLength] = '\0';
204 }
205
206 if (length != nullptr)
207 {
208 *length = static_cast<GLsizei>(writeLength);
209 }
210}
211
Geoff Langf6db0982015-08-25 13:04:00 -0400212} // anonymous namespace
213
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000214namespace gl
215{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000216
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400217Context::Context(rx::EGLImplFactory *implFactory,
218 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400219 const Context *shareContext,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500220 const egl::AttributeMap &attribs)
Martin Radev1be913c2016-07-11 17:59:16 +0300221
222 : ValidationContext(GetClientMajorVersion(attribs),
223 GetClientMinorVersion(attribs),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700224 &mGLState,
Jamie Madillf25855c2015-11-03 11:06:18 -0500225 mCaps,
226 mTextureCaps,
227 mExtensions,
228 nullptr,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500229 mLimitations,
230 GetNoError(attribs)),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700231 mImplementation(implFactory->createContext(mState)),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500232 mCompiler(nullptr),
Martin Radev1be913c2016-07-11 17:59:16 +0300233 mClientMajorVersion(GetClientMajorVersion(attribs)),
234 mClientMinorVersion(GetClientMinorVersion(attribs)),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400235 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500236 mClientType(EGL_OPENGL_ES_API),
237 mHasBeenCurrent(false),
238 mContextLost(false),
239 mResetStatus(GL_NO_ERROR),
240 mResetStrategy(GetResetStrategy(attribs)),
241 mRobustAccess(GetRobustAccess(attribs)),
242 mCurrentSurface(nullptr),
243 mResourceManager(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000244{
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500245 ASSERT(!mRobustAccess); // Unimplemented
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000246
Jamie Madill00ed7a12016-05-19 13:13:38 -0400247 initCaps();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400248
Martin Radev1be913c2016-07-11 17:59:16 +0300249 mGLState.initialize(mCaps, mExtensions, mClientMajorVersion, GetDebug(attribs));
Régis Fénéon83107972015-02-05 12:57:44 +0100250
Shannon Woods53a94a82014-06-24 15:20:36 -0400251 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400252
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400253 if (shareContext != nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000254 {
255 mResourceManager = shareContext->mResourceManager;
256 mResourceManager->addRef();
257 }
258 else
259 {
Jamie Madill901b3792016-05-26 09:20:40 -0400260 mResourceManager = new ResourceManager();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000261 }
262
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700263 mState.mResourceManager = mResourceManager;
Jamie Madillc185cb82015-04-28 12:39:08 -0400264
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000265 // [OpenGL ES 2.0.24] section 3.7 page 83:
266 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have twodimensional
267 // and cube map texture state vectors respectively associated with them.
268 // In order that access to these initial textures not be lost, they are treated as texture
269 // objects all of whose names are 0.
270
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400271 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500272 mZeroTextures[GL_TEXTURE_2D].set(zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500273
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400274 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, GL_TEXTURE_CUBE_MAP);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500275 mZeroTextures[GL_TEXTURE_CUBE_MAP].set(zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400276
Martin Radev1be913c2016-07-11 17:59:16 +0300277 if (mClientMajorVersion >= 3)
Geoff Lang76b10c92014-09-05 16:28:14 -0400278 {
279 // TODO: These could also be enabled via extension
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400280 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, GL_TEXTURE_3D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500281 mZeroTextures[GL_TEXTURE_3D].set(zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400282
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400283 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_ARRAY);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500284 mZeroTextures[GL_TEXTURE_2D_ARRAY].set(zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400285 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000286
Ian Ewellbda75592016-04-18 17:25:54 -0400287 if (mExtensions.eglImageExternal || mExtensions.eglStreamConsumerExternal)
288 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400289 Texture *zeroTextureExternal =
290 new Texture(mImplementation.get(), 0, GL_TEXTURE_EXTERNAL_OES);
Ian Ewellbda75592016-04-18 17:25:54 -0400291 mZeroTextures[GL_TEXTURE_EXTERNAL_OES].set(zeroTextureExternal);
292 }
293
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700294 mGLState.initializeZeroTextures(mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500295
Jamie Madill57a89722013-07-02 11:57:03 -0400296 bindVertexArray(0);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000297 bindArrayBuffer(0);
298 bindElementArrayBuffer(0);
Geoff Lang76b10c92014-09-05 16:28:14 -0400299
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000300 bindRenderbuffer(0);
301
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000302 bindGenericUniformBuffer(0);
Shannon Woodsf3acaf92014-09-23 18:07:11 -0400303 for (unsigned int i = 0; i < mCaps.maxCombinedUniformBlocks; i++)
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000304 {
305 bindIndexedUniformBuffer(0, i, 0, -1);
306 }
307
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000308 bindCopyReadBuffer(0);
309 bindCopyWriteBuffer(0);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000310 bindPixelPackBuffer(0);
311 bindPixelUnpackBuffer(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000312
Martin Radev1be913c2016-07-11 17:59:16 +0300313 if (mClientMajorVersion >= 3)
Geoff Lang1a683462015-09-29 15:09:59 -0400314 {
315 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
316 // In the initial state, a default transform feedback object is bound and treated as
317 // a transform feedback object with a name of zero. That object is bound any time
318 // BindTransformFeedback is called with id of zero
Geoff Lang1a683462015-09-29 15:09:59 -0400319 bindTransformFeedback(0);
320 }
Geoff Langc8058452014-02-03 12:04:11 -0500321
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700322 mCompiler = new Compiler(mImplementation.get(), mState);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500323
324 // Initialize dirty bit masks
325 // TODO(jmadill): additional ES3 state
326 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ALIGNMENT);
327 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ROW_LENGTH);
328 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_IMAGE_HEIGHT);
329 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_IMAGES);
330 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_ROWS);
331 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_PIXELS);
Corentin Wallezbbd663a2016-04-20 17:49:17 -0400332 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500333 // No dirty objects.
334
335 // Readpixels uses the pack state and read FBO
336 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ALIGNMENT);
337 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
338 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ROW_LENGTH);
339 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_ROWS);
340 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_PIXELS);
Corentin Wallezbbd663a2016-04-20 17:49:17 -0400341 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500342 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
343
344 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
345 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
346 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
347 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
348 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
349 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
350 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
351 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
352 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
353 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
354 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
355 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
356
357 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
358 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
359 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
360 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400361
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400362 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000363}
364
365Context::~Context()
366{
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700367 mGLState.reset();
Geoff Lang21329412014-12-02 20:50:30 +0000368
Corentin Wallez37c39792015-08-20 14:19:46 -0400369 for (auto framebuffer : mFramebufferMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000370 {
Corentin Wallez37c39792015-08-20 14:19:46 -0400371 // Default framebuffer are owned by their respective Surface
Geoff Langf6227922015-09-04 11:05:47 -0400372 if (framebuffer.second != nullptr && framebuffer.second->id() != 0)
Corentin Wallez37c39792015-08-20 14:19:46 -0400373 {
374 SafeDelete(framebuffer.second);
375 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000376 }
377
Corentin Wallez80b24112015-08-25 16:41:57 -0400378 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000379 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400380 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000381 }
382
Corentin Wallez80b24112015-08-25 16:41:57 -0400383 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000384 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400385 if (query.second != nullptr)
386 {
387 query.second->release();
388 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000389 }
390
Corentin Wallez80b24112015-08-25 16:41:57 -0400391 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400392 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400393 SafeDelete(vertexArray.second);
Jamie Madill57a89722013-07-02 11:57:03 -0400394 }
395
Corentin Wallez80b24112015-08-25 16:41:57 -0400396 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500397 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500398 if (transformFeedback.second != nullptr)
399 {
400 transformFeedback.second->release();
401 }
Geoff Langc8058452014-02-03 12:04:11 -0500402 }
403
Jamie Madilldedd7b92014-11-05 16:30:36 -0500404 for (auto &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400405 {
Jamie Madilldedd7b92014-11-05 16:30:36 -0500406 zeroTexture.second.set(NULL);
Geoff Lang76b10c92014-09-05 16:28:14 -0400407 }
408 mZeroTextures.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000409
Corentin Wallez51706ea2015-08-07 14:39:22 -0400410 if (mCurrentSurface != nullptr)
411 {
412 releaseSurface();
413 }
414
Jamie Madill1e9ae072014-11-06 15:27:21 -0500415 if (mResourceManager)
416 {
417 mResourceManager->release();
418 }
Geoff Lang492a7e42014-11-05 13:27:06 -0500419
420 SafeDelete(mCompiler);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000421}
422
daniel@transgaming.comad629872012-11-28 19:32:06 +0000423void Context::makeCurrent(egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000424{
Jamie Madill77a72f62015-04-14 11:18:32 -0400425 ASSERT(surface != nullptr);
426
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000427 if (!mHasBeenCurrent)
428 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000429 initRendererString();
Geoff Langcec35902014-04-16 10:52:36 -0400430 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000431
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700432 mGLState.setViewportParams(0, 0, surface->getWidth(), surface->getHeight());
433 mGLState.setScissorParams(0, 0, surface->getWidth(), surface->getHeight());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000434
435 mHasBeenCurrent = true;
436 }
437
Jamie Madill1b94d432015-08-07 13:23:23 -0400438 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700439 mGLState.setAllDirtyBits();
Jamie Madill1b94d432015-08-07 13:23:23 -0400440
Corentin Wallez51706ea2015-08-07 14:39:22 -0400441 if (mCurrentSurface)
442 {
443 releaseSurface();
444 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000445 surface->setIsCurrent(true);
Corentin Wallez37c39792015-08-20 14:19:46 -0400446 mCurrentSurface = surface;
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000447
Corentin Wallez37c39792015-08-20 14:19:46 -0400448 // Update default framebuffer, the binding of the previous default
449 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400450 {
Corentin Wallez37c39792015-08-20 14:19:46 -0400451 Framebuffer *newDefault = surface->getDefaultFramebuffer();
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700452 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400453 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700454 mGLState.setReadFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400455 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700456 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400457 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700458 mGLState.setDrawFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400459 }
460 mFramebufferMap[0] = newDefault;
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400461 }
Ian Ewell292f0052016-02-04 10:37:32 -0500462
463 // Notify the renderer of a context switch
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700464 mImplementation->onMakeCurrent(mState);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000465}
466
Jamie Madill77a72f62015-04-14 11:18:32 -0400467void Context::releaseSurface()
468{
Corentin Wallez37c39792015-08-20 14:19:46 -0400469 ASSERT(mCurrentSurface != nullptr);
470
471 // Remove the default framebuffer
Corentin Wallez51706ea2015-08-07 14:39:22 -0400472 {
Corentin Wallez37c39792015-08-20 14:19:46 -0400473 Framebuffer *currentDefault = mCurrentSurface->getDefaultFramebuffer();
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700474 if (mGLState.getReadFramebuffer() == currentDefault)
Corentin Wallez37c39792015-08-20 14:19:46 -0400475 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700476 mGLState.setReadFramebufferBinding(nullptr);
Corentin Wallez37c39792015-08-20 14:19:46 -0400477 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700478 if (mGLState.getDrawFramebuffer() == currentDefault)
Corentin Wallez37c39792015-08-20 14:19:46 -0400479 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700480 mGLState.setDrawFramebufferBinding(nullptr);
Corentin Wallez37c39792015-08-20 14:19:46 -0400481 }
482 mFramebufferMap.erase(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400483 }
484
Corentin Wallez51706ea2015-08-07 14:39:22 -0400485 mCurrentSurface->setIsCurrent(false);
486 mCurrentSurface = nullptr;
Jamie Madill77a72f62015-04-14 11:18:32 -0400487}
488
daniel@transgaming.comf688c0d2012-10-31 17:52:57 +0000489// NOTE: this function should not assume that this context is current!
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000490void Context::markContextLost()
491{
492 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
493 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
494 mContextLost = true;
495}
496
497bool Context::isContextLost()
498{
499 return mContextLost;
500}
501
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000502GLuint Context::createBuffer()
503{
504 return mResourceManager->createBuffer();
505}
506
507GLuint Context::createProgram()
508{
Jamie Madill901b3792016-05-26 09:20:40 -0400509 return mResourceManager->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000510}
511
512GLuint Context::createShader(GLenum type)
513{
Jamie Madill901b3792016-05-26 09:20:40 -0400514 return mResourceManager->createShader(mImplementation.get(),
515 mImplementation->getNativeLimitations(), type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000516}
517
518GLuint Context::createTexture()
519{
520 return mResourceManager->createTexture();
521}
522
523GLuint Context::createRenderbuffer()
524{
525 return mResourceManager->createRenderbuffer();
526}
527
Geoff Lang882033e2014-09-30 11:26:07 -0400528GLsync Context::createFenceSync()
Jamie Madillcd055f82013-07-26 11:55:15 -0400529{
Jamie Madill901b3792016-05-26 09:20:40 -0400530 GLuint handle = mResourceManager->createFenceSync(mImplementation.get());
Jamie Madillcd055f82013-07-26 11:55:15 -0400531
Cooper Partind8e62a32015-01-29 15:21:25 -0800532 return reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madillcd055f82013-07-26 11:55:15 -0400533}
534
Sami Väisänene45e53b2016-05-25 10:36:04 +0300535GLuint Context::createPaths(GLsizei range)
536{
537 auto resultOrError = mResourceManager->createPaths(mImplementation.get(), range);
538 if (resultOrError.isError())
539 {
540 handleError(resultOrError.getError());
541 return 0;
542 }
543 return resultOrError.getResult();
544}
545
Jamie Madill57a89722013-07-02 11:57:03 -0400546GLuint Context::createVertexArray()
547{
Geoff Lang36167ab2015-12-07 10:27:14 -0500548 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
549 mVertexArrayMap[vertexArray] = nullptr;
550 return vertexArray;
Jamie Madill57a89722013-07-02 11:57:03 -0400551}
552
Jamie Madilldc356042013-07-19 16:36:57 -0400553GLuint Context::createSampler()
554{
555 return mResourceManager->createSampler();
556}
557
Geoff Langc8058452014-02-03 12:04:11 -0500558GLuint Context::createTransformFeedback()
559{
Geoff Lang36167ab2015-12-07 10:27:14 -0500560 GLuint transformFeedback = mTransformFeedbackAllocator.allocate();
561 mTransformFeedbackMap[transformFeedback] = nullptr;
562 return transformFeedback;
Geoff Langc8058452014-02-03 12:04:11 -0500563}
564
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000565// Returns an unused framebuffer name
566GLuint Context::createFramebuffer()
567{
568 GLuint handle = mFramebufferHandleAllocator.allocate();
569
570 mFramebufferMap[handle] = NULL;
571
572 return handle;
573}
574
Jamie Madill33dc8432013-07-26 11:55:05 -0400575GLuint Context::createFenceNV()
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000576{
Jamie Madill33dc8432013-07-26 11:55:05 -0400577 GLuint handle = mFenceNVHandleAllocator.allocate();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000578
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400579 mFenceNVMap[handle] = new FenceNV(mImplementation->createFenceNV());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000580
581 return handle;
582}
583
584// Returns an unused query name
585GLuint Context::createQuery()
586{
587 GLuint handle = mQueryHandleAllocator.allocate();
588
589 mQueryMap[handle] = NULL;
590
591 return handle;
592}
593
594void Context::deleteBuffer(GLuint buffer)
595{
596 if (mResourceManager->getBuffer(buffer))
597 {
598 detachBuffer(buffer);
599 }
Jamie Madill893ab082014-05-16 16:56:10 -0400600
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000601 mResourceManager->deleteBuffer(buffer);
602}
603
604void Context::deleteShader(GLuint shader)
605{
606 mResourceManager->deleteShader(shader);
607}
608
609void Context::deleteProgram(GLuint program)
610{
611 mResourceManager->deleteProgram(program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000612}
613
614void Context::deleteTexture(GLuint texture)
615{
616 if (mResourceManager->getTexture(texture))
617 {
618 detachTexture(texture);
619 }
620
621 mResourceManager->deleteTexture(texture);
622}
623
624void Context::deleteRenderbuffer(GLuint renderbuffer)
625{
626 if (mResourceManager->getRenderbuffer(renderbuffer))
627 {
628 detachRenderbuffer(renderbuffer);
629 }
Jamie Madill893ab082014-05-16 16:56:10 -0400630
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000631 mResourceManager->deleteRenderbuffer(renderbuffer);
632}
633
Jamie Madillcd055f82013-07-26 11:55:15 -0400634void Context::deleteFenceSync(GLsync fenceSync)
635{
636 // The spec specifies the underlying Fence object is not deleted until all current
637 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
638 // and since our API is currently designed for being called from a single thread, we can delete
639 // the fence immediately.
Minmin Gong794e0002015-04-07 18:31:54 -0700640 mResourceManager->deleteFenceSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(fenceSync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400641}
642
Sami Väisänene45e53b2016-05-25 10:36:04 +0300643void Context::deletePaths(GLuint first, GLsizei range)
644{
645 mResourceManager->deletePaths(first, range);
646}
647
648bool Context::hasPathData(GLuint path) const
649{
650 const auto *pathObj = mResourceManager->getPath(path);
651 if (pathObj == nullptr)
652 return false;
653
654 return pathObj->hasPathData();
655}
656
657bool Context::hasPath(GLuint path) const
658{
659 return mResourceManager->hasPath(path);
660}
661
662void Context::setPathCommands(GLuint path,
663 GLsizei numCommands,
664 const GLubyte *commands,
665 GLsizei numCoords,
666 GLenum coordType,
667 const void *coords)
668{
669 auto *pathObject = mResourceManager->getPath(path);
670
671 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
672}
673
674void Context::setPathParameterf(GLuint path, GLenum pname, GLfloat value)
675{
676 auto *pathObj = mResourceManager->getPath(path);
677
678 switch (pname)
679 {
680 case GL_PATH_STROKE_WIDTH_CHROMIUM:
681 pathObj->setStrokeWidth(value);
682 break;
683 case GL_PATH_END_CAPS_CHROMIUM:
684 pathObj->setEndCaps(static_cast<GLenum>(value));
685 break;
686 case GL_PATH_JOIN_STYLE_CHROMIUM:
687 pathObj->setJoinStyle(static_cast<GLenum>(value));
688 break;
689 case GL_PATH_MITER_LIMIT_CHROMIUM:
690 pathObj->setMiterLimit(value);
691 break;
692 case GL_PATH_STROKE_BOUND_CHROMIUM:
693 pathObj->setStrokeBound(value);
694 break;
695 default:
696 UNREACHABLE();
697 break;
698 }
699}
700
701void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value) const
702{
703 const auto *pathObj = mResourceManager->getPath(path);
704
705 switch (pname)
706 {
707 case GL_PATH_STROKE_WIDTH_CHROMIUM:
708 *value = pathObj->getStrokeWidth();
709 break;
710 case GL_PATH_END_CAPS_CHROMIUM:
711 *value = static_cast<GLfloat>(pathObj->getEndCaps());
712 break;
713 case GL_PATH_JOIN_STYLE_CHROMIUM:
714 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
715 break;
716 case GL_PATH_MITER_LIMIT_CHROMIUM:
717 *value = pathObj->getMiterLimit();
718 break;
719 case GL_PATH_STROKE_BOUND_CHROMIUM:
720 *value = pathObj->getStrokeBound();
721 break;
722 default:
723 UNREACHABLE();
724 break;
725 }
726}
727
728void Context::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
729{
730 mGLState.setPathStencilFunc(func, ref, mask);
731}
732
Jamie Madill57a89722013-07-02 11:57:03 -0400733void Context::deleteVertexArray(GLuint vertexArray)
734{
Geoff Lang36167ab2015-12-07 10:27:14 -0500735 auto iter = mVertexArrayMap.find(vertexArray);
736 if (iter != mVertexArrayMap.end())
Geoff Lang50b3fe82015-12-08 14:49:12 +0000737 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500738 VertexArray *vertexArrayObject = iter->second;
739 if (vertexArrayObject != nullptr)
740 {
741 detachVertexArray(vertexArray);
742 delete vertexArrayObject;
743 }
Geoff Lang50b3fe82015-12-08 14:49:12 +0000744
Geoff Lang36167ab2015-12-07 10:27:14 -0500745 mVertexArrayMap.erase(iter);
746 mVertexArrayHandleAllocator.release(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -0400747 }
748}
749
Jamie Madilldc356042013-07-19 16:36:57 -0400750void Context::deleteSampler(GLuint sampler)
751{
752 if (mResourceManager->getSampler(sampler))
753 {
754 detachSampler(sampler);
755 }
756
757 mResourceManager->deleteSampler(sampler);
758}
759
Geoff Langc8058452014-02-03 12:04:11 -0500760void Context::deleteTransformFeedback(GLuint transformFeedback)
761{
Jamie Madill5fd0b2d2015-01-05 13:38:44 -0500762 auto iter = mTransformFeedbackMap.find(transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -0500763 if (iter != mTransformFeedbackMap.end())
764 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500765 TransformFeedback *transformFeedbackObject = iter->second;
766 if (transformFeedbackObject != nullptr)
767 {
768 detachTransformFeedback(transformFeedback);
769 transformFeedbackObject->release();
770 }
771
Geoff Lang50b3fe82015-12-08 14:49:12 +0000772 mTransformFeedbackMap.erase(iter);
Geoff Lang36167ab2015-12-07 10:27:14 -0500773 mTransformFeedbackAllocator.release(transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -0500774 }
775}
776
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000777void Context::deleteFramebuffer(GLuint framebuffer)
778{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500779 auto framebufferObject = mFramebufferMap.find(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000780
781 if (framebufferObject != mFramebufferMap.end())
782 {
783 detachFramebuffer(framebuffer);
784
785 mFramebufferHandleAllocator.release(framebufferObject->first);
786 delete framebufferObject->second;
787 mFramebufferMap.erase(framebufferObject);
788 }
789}
790
Jamie Madill33dc8432013-07-26 11:55:05 -0400791void Context::deleteFenceNV(GLuint fence)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000792{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500793 auto fenceObject = mFenceNVMap.find(fence);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000794
Jamie Madill33dc8432013-07-26 11:55:05 -0400795 if (fenceObject != mFenceNVMap.end())
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000796 {
Jamie Madill33dc8432013-07-26 11:55:05 -0400797 mFenceNVHandleAllocator.release(fenceObject->first);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000798 delete fenceObject->second;
Jamie Madill33dc8432013-07-26 11:55:05 -0400799 mFenceNVMap.erase(fenceObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000800 }
801}
802
803void Context::deleteQuery(GLuint query)
804{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500805 auto queryObject = mQueryMap.find(query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000806 if (queryObject != mQueryMap.end())
807 {
808 mQueryHandleAllocator.release(queryObject->first);
809 if (queryObject->second)
810 {
811 queryObject->second->release();
812 }
813 mQueryMap.erase(queryObject);
814 }
815}
816
Geoff Lang70d0f492015-12-10 17:45:46 -0500817Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000818{
819 return mResourceManager->getBuffer(handle);
820}
821
Geoff Lang48dcae72014-02-05 16:28:24 -0500822Shader *Context::getShader(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000823{
824 return mResourceManager->getShader(handle);
825}
826
Geoff Lang48dcae72014-02-05 16:28:24 -0500827Program *Context::getProgram(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000828{
829 return mResourceManager->getProgram(handle);
830}
831
Jamie Madill570f7c82014-07-03 10:38:54 -0400832Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000833{
834 return mResourceManager->getTexture(handle);
835}
836
Geoff Lang70d0f492015-12-10 17:45:46 -0500837Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000838{
839 return mResourceManager->getRenderbuffer(handle);
840}
841
Jamie Madillcd055f82013-07-26 11:55:15 -0400842FenceSync *Context::getFenceSync(GLsync handle) const
843{
Minmin Gong794e0002015-04-07 18:31:54 -0700844 return mResourceManager->getFenceSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400845}
846
Jamie Madill57a89722013-07-02 11:57:03 -0400847VertexArray *Context::getVertexArray(GLuint handle) const
848{
849 auto vertexArray = mVertexArrayMap.find(handle);
Geoff Lang36167ab2015-12-07 10:27:14 -0500850 return (vertexArray != mVertexArrayMap.end()) ? vertexArray->second : nullptr;
Jamie Madill57a89722013-07-02 11:57:03 -0400851}
852
Jamie Madilldc356042013-07-19 16:36:57 -0400853Sampler *Context::getSampler(GLuint handle) const
854{
855 return mResourceManager->getSampler(handle);
856}
857
Geoff Langc8058452014-02-03 12:04:11 -0500858TransformFeedback *Context::getTransformFeedback(GLuint handle) const
859{
Geoff Lang36167ab2015-12-07 10:27:14 -0500860 auto iter = mTransformFeedbackMap.find(handle);
861 return (iter != mTransformFeedbackMap.end()) ? iter->second : nullptr;
Geoff Langc8058452014-02-03 12:04:11 -0500862}
863
Geoff Lang70d0f492015-12-10 17:45:46 -0500864LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
865{
866 switch (identifier)
867 {
868 case GL_BUFFER:
869 return getBuffer(name);
870 case GL_SHADER:
871 return getShader(name);
872 case GL_PROGRAM:
873 return getProgram(name);
874 case GL_VERTEX_ARRAY:
875 return getVertexArray(name);
876 case GL_QUERY:
877 return getQuery(name);
878 case GL_TRANSFORM_FEEDBACK:
879 return getTransformFeedback(name);
880 case GL_SAMPLER:
881 return getSampler(name);
882 case GL_TEXTURE:
883 return getTexture(name);
884 case GL_RENDERBUFFER:
885 return getRenderbuffer(name);
886 case GL_FRAMEBUFFER:
887 return getFramebuffer(name);
888 default:
889 UNREACHABLE();
890 return nullptr;
891 }
892}
893
894LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
895{
896 return getFenceSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
897}
898
Martin Radev9d901792016-07-15 15:58:58 +0300899void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
900{
901 LabeledObject *object = getLabeledObject(identifier, name);
902 ASSERT(object != nullptr);
903
904 std::string labelName = GetObjectLabelFromPointer(length, label);
905 object->setLabel(labelName);
906}
907
908void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
909{
910 LabeledObject *object = getLabeledObjectFromPtr(ptr);
911 ASSERT(object != nullptr);
912
913 std::string labelName = GetObjectLabelFromPointer(length, label);
914 object->setLabel(labelName);
915}
916
917void Context::getObjectLabel(GLenum identifier,
918 GLuint name,
919 GLsizei bufSize,
920 GLsizei *length,
921 GLchar *label) const
922{
923 LabeledObject *object = getLabeledObject(identifier, name);
924 ASSERT(object != nullptr);
925
926 const std::string &objectLabel = object->getLabel();
927 GetObjectLabelBase(objectLabel, bufSize, length, label);
928}
929
930void Context::getObjectPtrLabel(const void *ptr,
931 GLsizei bufSize,
932 GLsizei *length,
933 GLchar *label) const
934{
935 LabeledObject *object = getLabeledObjectFromPtr(ptr);
936 ASSERT(object != nullptr);
937
938 const std::string &objectLabel = object->getLabel();
939 GetObjectLabelBase(objectLabel, bufSize, length, label);
940}
941
Jamie Madilldc356042013-07-19 16:36:57 -0400942bool Context::isSampler(GLuint samplerName) const
943{
944 return mResourceManager->isSampler(samplerName);
945}
946
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500947void Context::bindArrayBuffer(GLuint bufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000948{
Jamie Madill901b3792016-05-26 09:20:40 -0400949 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700950 mGLState.setArrayBufferBinding(buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000951}
952
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500953void Context::bindElementArrayBuffer(GLuint bufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000954{
Jamie Madill901b3792016-05-26 09:20:40 -0400955 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700956 mGLState.getVertexArray()->setElementArrayBuffer(buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000957}
958
Jamie Madilldedd7b92014-11-05 16:30:36 -0500959void Context::bindTexture(GLenum target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000960{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500961 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000962
Jamie Madilldedd7b92014-11-05 16:30:36 -0500963 if (handle == 0)
964 {
965 texture = mZeroTextures[target].get();
966 }
967 else
968 {
Jamie Madill901b3792016-05-26 09:20:40 -0400969 texture = mResourceManager->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500970 }
971
972 ASSERT(texture);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700973 mGLState.setSamplerTexture(target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000974}
975
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500976void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000977{
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500978 Framebuffer *framebuffer = checkFramebufferAllocation(framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700979 mGLState.setReadFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000980}
981
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500982void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000983{
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500984 Framebuffer *framebuffer = checkFramebufferAllocation(framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700985 mGLState.setDrawFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000986}
987
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500988void Context::bindRenderbuffer(GLuint renderbufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000989{
Jamie Madill901b3792016-05-26 09:20:40 -0400990 Renderbuffer *renderbuffer =
991 mResourceManager->checkRenderbufferAllocation(mImplementation.get(), renderbufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700992 mGLState.setRenderbufferBinding(renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000993}
994
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500995void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -0400996{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500997 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700998 mGLState.setVertexArrayBinding(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -0400999}
1000
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001001void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001002{
Geoff Lang76b10c92014-09-05 16:28:14 -04001003 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001004 Sampler *sampler =
1005 mResourceManager->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001006 mGLState.setSamplerBinding(textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001007}
1008
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001009void Context::bindGenericUniformBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001010{
Jamie Madill901b3792016-05-26 09:20:40 -04001011 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001012 mGLState.setGenericUniformBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001013}
1014
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001015void Context::bindIndexedUniformBuffer(GLuint bufferHandle,
1016 GLuint index,
1017 GLintptr offset,
1018 GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +00001019{
Jamie Madill901b3792016-05-26 09:20:40 -04001020 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001021 mGLState.setIndexedUniformBufferBinding(index, buffer, offset, size);
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +00001022}
1023
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001024void Context::bindGenericTransformFeedbackBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001025{
Jamie Madill901b3792016-05-26 09:20:40 -04001026 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001027 mGLState.getCurrentTransformFeedback()->bindGenericBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001028}
1029
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001030void Context::bindIndexedTransformFeedbackBuffer(GLuint bufferHandle,
1031 GLuint index,
1032 GLintptr offset,
1033 GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +00001034{
Jamie Madill901b3792016-05-26 09:20:40 -04001035 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001036 mGLState.getCurrentTransformFeedback()->bindIndexedBuffer(index, buffer, offset, size);
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +00001037}
1038
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001039void Context::bindCopyReadBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001040{
Jamie Madill901b3792016-05-26 09:20:40 -04001041 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001042 mGLState.setCopyReadBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001043}
1044
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001045void Context::bindCopyWriteBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001046{
Jamie Madill901b3792016-05-26 09:20:40 -04001047 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001048 mGLState.setCopyWriteBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001049}
1050
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001051void Context::bindPixelPackBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001052{
Jamie Madill901b3792016-05-26 09:20:40 -04001053 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001054 mGLState.setPixelPackBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001055}
1056
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001057void Context::bindPixelUnpackBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001058{
Jamie Madill901b3792016-05-26 09:20:40 -04001059 Buffer *buffer = mResourceManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001060 mGLState.setPixelUnpackBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001061}
1062
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001063void Context::useProgram(GLuint program)
1064{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001065 mGLState.setProgram(getProgram(program));
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001066}
1067
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001068void Context::bindTransformFeedback(GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001069{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001070 TransformFeedback *transformFeedback =
1071 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001072 mGLState.setTransformFeedbackBinding(transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001073}
1074
Geoff Lang5aad9672014-09-08 11:10:42 -04001075Error Context::beginQuery(GLenum target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001076{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001077 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001078 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001079
Geoff Lang5aad9672014-09-08 11:10:42 -04001080 // begin query
1081 Error error = queryObject->begin();
1082 if (error.isError())
1083 {
1084 return error;
1085 }
1086
1087 // set query as active for specified target only if begin succeeded
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001088 mGLState.setActiveQuery(target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001089
Geoff Lang5aad9672014-09-08 11:10:42 -04001090 return Error(GL_NO_ERROR);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001091}
1092
Geoff Lang5aad9672014-09-08 11:10:42 -04001093Error Context::endQuery(GLenum target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001094{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001095 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001096 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001097
Geoff Lang5aad9672014-09-08 11:10:42 -04001098 gl::Error error = queryObject->end();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001099
Geoff Lang5aad9672014-09-08 11:10:42 -04001100 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001101 mGLState.setActiveQuery(target, NULL);
Geoff Lang5aad9672014-09-08 11:10:42 -04001102
1103 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001104}
1105
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001106Error Context::queryCounter(GLuint id, GLenum target)
1107{
1108 ASSERT(target == GL_TIMESTAMP_EXT);
1109
1110 Query *queryObject = getQuery(id, true, target);
1111 ASSERT(queryObject);
1112
1113 return queryObject->queryCounter();
1114}
1115
1116void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
1117{
1118 switch (pname)
1119 {
1120 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001121 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001122 break;
1123 case GL_QUERY_COUNTER_BITS_EXT:
1124 switch (target)
1125 {
1126 case GL_TIME_ELAPSED_EXT:
1127 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1128 break;
1129 case GL_TIMESTAMP_EXT:
1130 params[0] = getExtensions().queryCounterBitsTimestamp;
1131 break;
1132 default:
1133 UNREACHABLE();
1134 params[0] = 0;
1135 break;
1136 }
1137 break;
1138 default:
1139 UNREACHABLE();
1140 return;
1141 }
1142}
1143
1144Error Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
1145{
1146 return GetQueryObjectParameter(this, id, pname, params);
1147}
1148
1149Error Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
1150{
1151 return GetQueryObjectParameter(this, id, pname, params);
1152}
1153
1154Error Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
1155{
1156 return GetQueryObjectParameter(this, id, pname, params);
1157}
1158
1159Error Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
1160{
1161 return GetQueryObjectParameter(this, id, pname, params);
1162}
1163
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001164Framebuffer *Context::getFramebuffer(unsigned int handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001165{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001166 auto framebufferIt = mFramebufferMap.find(handle);
1167 return ((framebufferIt == mFramebufferMap.end()) ? nullptr : framebufferIt->second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001168}
1169
Jamie Madill33dc8432013-07-26 11:55:05 -04001170FenceNV *Context::getFenceNV(unsigned int handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001171{
Jamie Madill4e25a0d2016-03-08 13:53:03 -05001172 auto fence = mFenceNVMap.find(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001173
Jamie Madill33dc8432013-07-26 11:55:05 -04001174 if (fence == mFenceNVMap.end())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001175 {
1176 return NULL;
1177 }
1178 else
1179 {
1180 return fence->second;
1181 }
1182}
1183
1184Query *Context::getQuery(unsigned int handle, bool create, GLenum type)
1185{
Jamie Madill4e25a0d2016-03-08 13:53:03 -05001186 auto query = mQueryMap.find(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001187
1188 if (query == mQueryMap.end())
1189 {
1190 return NULL;
1191 }
1192 else
1193 {
1194 if (!query->second && create)
1195 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001196 query->second = new Query(mImplementation->createQuery(type), handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001197 query->second->addRef();
1198 }
1199 return query->second;
1200 }
1201}
1202
Geoff Lang70d0f492015-12-10 17:45:46 -05001203Query *Context::getQuery(GLuint handle) const
1204{
1205 auto iter = mQueryMap.find(handle);
1206 return (iter != mQueryMap.end()) ? iter->second : nullptr;
1207}
1208
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001209Texture *Context::getTargetTexture(GLenum target) const
1210{
Ian Ewellbda75592016-04-18 17:25:54 -04001211 ASSERT(ValidTextureTarget(this, target) || ValidTextureExternalTarget(this, target));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001212 return mGLState.getTargetTexture(target);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001213}
1214
Geoff Lang76b10c92014-09-05 16:28:14 -04001215Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001216{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001217 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001218}
1219
Geoff Lang492a7e42014-11-05 13:27:06 -05001220Compiler *Context::getCompiler() const
1221{
1222 return mCompiler;
1223}
1224
Jamie Madill893ab082014-05-16 16:56:10 -04001225void Context::getBooleanv(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001226{
1227 switch (pname)
1228 {
daniel@transgaming.comf39967e2012-11-28 19:35:56 +00001229 case GL_SHADER_COMPILER: *params = GL_TRUE; break;
daniel@transgaming.comf39967e2012-11-28 19:35:56 +00001230 case GL_CONTEXT_ROBUST_ACCESS_EXT: *params = mRobustAccess ? GL_TRUE : GL_FALSE; break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001231 default:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001232 mGLState.getBooleanv(pname, params);
1233 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001234 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001235}
1236
Jamie Madill893ab082014-05-16 16:56:10 -04001237void Context::getFloatv(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001238{
Shannon Woods53a94a82014-06-24 15:20:36 -04001239 // Queries about context capabilities and maximums are answered by Context.
1240 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001241 switch (pname)
1242 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001243 case GL_ALIASED_LINE_WIDTH_RANGE:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001244 params[0] = mCaps.minAliasedLineWidth;
1245 params[1] = mCaps.maxAliasedLineWidth;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001246 break;
1247 case GL_ALIASED_POINT_SIZE_RANGE:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001248 params[0] = mCaps.minAliasedPointSize;
1249 params[1] = mCaps.maxAliasedPointSize;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001250 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00001251 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001252 ASSERT(mExtensions.textureFilterAnisotropic);
1253 *params = mExtensions.maxTextureAnisotropy;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00001254 break;
Geoff Lange6d4e122015-06-29 13:33:55 -04001255 case GL_MAX_TEXTURE_LOD_BIAS:
1256 *params = mCaps.maxLODBias;
1257 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001258
1259 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1260 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1261 {
1262 ASSERT(mExtensions.pathRendering);
1263 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1264 memcpy(params, m, 16 * sizeof(GLfloat));
1265 }
1266 break;
1267
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001268 default:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001269 mGLState.getFloatv(pname, params);
1270 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001271 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001272}
1273
Jamie Madill893ab082014-05-16 16:56:10 -04001274void Context::getIntegerv(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001275{
Shannon Woods53a94a82014-06-24 15:20:36 -04001276 // Queries about context capabilities and maximums are answered by Context.
1277 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001278
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001279 switch (pname)
1280 {
Geoff Lang301d1612014-07-09 10:34:37 -04001281 case GL_MAX_VERTEX_ATTRIBS: *params = mCaps.maxVertexAttributes; break;
1282 case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = mCaps.maxVertexUniformVectors; break;
1283 case GL_MAX_VERTEX_UNIFORM_COMPONENTS: *params = mCaps.maxVertexUniformComponents; break;
Geoff Lang3a61c322014-07-10 13:01:54 -04001284 case GL_MAX_VARYING_VECTORS: *params = mCaps.maxVaryingVectors; break;
1285 case GL_MAX_VARYING_COMPONENTS: *params = mCaps.maxVertexOutputComponents; break;
1286 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = mCaps.maxCombinedTextureImageUnits; break;
Geoff Lang301d1612014-07-09 10:34:37 -04001287 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxVertexTextureImageUnits; break;
1288 case GL_MAX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxTextureImageUnits; break;
1289 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = mCaps.maxFragmentUniformVectors; break;
Geoff Lange7468902015-10-02 10:46:24 -04001290 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: *params = mCaps.maxFragmentUniformComponents; break;
Geoff Langc0b9ef42014-07-02 10:02:37 -04001291 case GL_MAX_RENDERBUFFER_SIZE: *params = mCaps.maxRenderbufferSize; break;
1292 case GL_MAX_COLOR_ATTACHMENTS_EXT: *params = mCaps.maxColorAttachments; break;
1293 case GL_MAX_DRAW_BUFFERS_EXT: *params = mCaps.maxDrawBuffers; break;
Jamie Madill1caff072013-07-19 16:36:56 -04001294 //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
Jamie Madill1caff072013-07-19 16:36:56 -04001295 case GL_SUBPIXEL_BITS: *params = 4; break;
Geoff Langc0b9ef42014-07-02 10:02:37 -04001296 case GL_MAX_TEXTURE_SIZE: *params = mCaps.max2DTextureSize; break;
1297 case GL_MAX_CUBE_MAP_TEXTURE_SIZE: *params = mCaps.maxCubeMapTextureSize; break;
1298 case GL_MAX_3D_TEXTURE_SIZE: *params = mCaps.max3DTextureSize; break;
1299 case GL_MAX_ARRAY_TEXTURE_LAYERS: *params = mCaps.maxArrayTextureLayers; break;
Geoff Lang3a61c322014-07-10 13:01:54 -04001300 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: *params = mCaps.uniformBufferOffsetAlignment; break;
1301 case GL_MAX_UNIFORM_BUFFER_BINDINGS: *params = mCaps.maxUniformBufferBindings; break;
Geoff Lang301d1612014-07-09 10:34:37 -04001302 case GL_MAX_VERTEX_UNIFORM_BLOCKS: *params = mCaps.maxVertexUniformBlocks; break;
1303 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS: *params = mCaps.maxFragmentUniformBlocks; break;
Geoff Lang3a61c322014-07-10 13:01:54 -04001304 case GL_MAX_COMBINED_UNIFORM_BLOCKS: *params = mCaps.maxCombinedTextureImageUnits; break;
Geoff Lange6d4e122015-06-29 13:33:55 -04001305 case GL_MAX_VERTEX_OUTPUT_COMPONENTS: *params = mCaps.maxVertexOutputComponents; break;
1306 case GL_MAX_FRAGMENT_INPUT_COMPONENTS: *params = mCaps.maxFragmentInputComponents; break;
1307 case GL_MIN_PROGRAM_TEXEL_OFFSET: *params = mCaps.minProgramTexelOffset; break;
1308 case GL_MAX_PROGRAM_TEXEL_OFFSET: *params = mCaps.maxProgramTexelOffset; break;
Martin Radev1be913c2016-07-11 17:59:16 +03001309 case GL_MAJOR_VERSION:
1310 *params = mClientMajorVersion;
1311 break;
1312 case GL_MINOR_VERSION:
1313 *params = mClientMinorVersion;
1314 break;
Geoff Lang900013c2014-07-07 11:32:19 -04001315 case GL_MAX_ELEMENTS_INDICES: *params = mCaps.maxElementsIndices; break;
1316 case GL_MAX_ELEMENTS_VERTICES: *params = mCaps.maxElementsVertices; break;
Geoff Lang05881a02014-07-10 14:05:30 -04001317 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: *params = mCaps.maxTransformFeedbackInterleavedComponents; break;
1318 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: *params = mCaps.maxTransformFeedbackSeparateAttributes; break;
1319 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: *params = mCaps.maxTransformFeedbackSeparateComponents; break;
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001320 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1321 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1322 break;
Geoff Langdef624b2015-04-13 10:46:56 -04001323 case GL_MAX_SAMPLES_ANGLE: *params = mCaps.maxSamples; break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001324 case GL_MAX_VIEWPORT_DIMS:
1325 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001326 params[0] = mCaps.maxViewportWidth;
1327 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001328 }
1329 break;
1330 case GL_COMPRESSED_TEXTURE_FORMATS:
Geoff Lang900013c2014-07-07 11:32:19 -04001331 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(), params);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001332 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001333 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1334 *params = mResetStrategy;
1335 break;
Geoff Lang900013c2014-07-07 11:32:19 -04001336 case GL_NUM_SHADER_BINARY_FORMATS:
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001337 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001338 break;
Geoff Lang900013c2014-07-07 11:32:19 -04001339 case GL_SHADER_BINARY_FORMATS:
1340 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1341 break;
1342 case GL_NUM_PROGRAM_BINARY_FORMATS:
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001343 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
Geoff Lang900013c2014-07-07 11:32:19 -04001344 break;
1345 case GL_PROGRAM_BINARY_FORMATS:
1346 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001347 break;
Geoff Lang23c81692013-08-12 10:46:58 -04001348 case GL_NUM_EXTENSIONS:
Geoff Langcec35902014-04-16 10:52:36 -04001349 *params = static_cast<GLint>(mExtensionStrings.size());
Geoff Lang23c81692013-08-12 10:46:58 -04001350 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001351
1352 // GL_KHR_debug
1353 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1354 *params = mExtensions.maxDebugMessageLength;
1355 break;
1356 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1357 *params = mExtensions.maxDebugLoggedMessages;
1358 break;
1359 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1360 *params = mExtensions.maxDebugGroupStackDepth;
1361 break;
1362 case GL_MAX_LABEL_LENGTH:
1363 *params = mExtensions.maxLabelLength;
1364 break;
1365
Ian Ewell53f59f42016-01-28 17:36:55 -05001366 // GL_EXT_disjoint_timer_query
1367 case GL_GPU_DISJOINT_EXT:
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001368 *params = mImplementation->getGPUDisjoint();
Ian Ewell53f59f42016-01-28 17:36:55 -05001369 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001370 case GL_MAX_FRAMEBUFFER_WIDTH:
1371 *params = mCaps.maxFramebufferWidth;
1372 break;
1373 case GL_MAX_FRAMEBUFFER_HEIGHT:
1374 *params = mCaps.maxFramebufferHeight;
1375 break;
1376 case GL_MAX_FRAMEBUFFER_SAMPLES:
1377 *params = mCaps.maxFramebufferSamples;
1378 break;
1379 case GL_MAX_SAMPLE_MASK_WORDS:
1380 *params = mCaps.maxSampleMaskWords;
1381 break;
1382 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1383 *params = mCaps.maxColorTextureSamples;
1384 break;
1385 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1386 *params = mCaps.maxDepthTextureSamples;
1387 break;
1388 case GL_MAX_INTEGER_SAMPLES:
1389 *params = mCaps.maxIntegerSamples;
1390 break;
1391 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1392 *params = mCaps.maxVertexAttribRelativeOffset;
1393 break;
1394 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1395 *params = mCaps.maxVertexAttribBindings;
1396 break;
1397 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1398 *params = mCaps.maxVertexAttribStride;
1399 break;
1400 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
1401 *params = mCaps.maxVertexAtomicCounterBuffers;
1402 break;
1403 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
1404 *params = mCaps.maxVertexAtomicCounters;
1405 break;
1406 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
1407 *params = mCaps.maxVertexImageUniforms;
1408 break;
1409 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
1410 *params = mCaps.maxVertexShaderStorageBlocks;
1411 break;
1412 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
1413 *params = mCaps.maxFragmentAtomicCounterBuffers;
1414 break;
1415 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
1416 *params = mCaps.maxFragmentAtomicCounters;
1417 break;
1418 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
1419 *params = mCaps.maxFragmentImageUniforms;
1420 break;
1421 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
1422 *params = mCaps.maxFragmentShaderStorageBlocks;
1423 break;
1424 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1425 *params = mCaps.minProgramTextureGatherOffset;
1426 break;
1427 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1428 *params = mCaps.maxProgramTextureGatherOffset;
1429 break;
1430 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1431 *params = mCaps.maxComputeWorkGroupInvocations;
1432 break;
1433 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
1434 *params = mCaps.maxComputeUniformBlocks;
1435 break;
1436 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
1437 *params = mCaps.maxComputeTextureImageUnits;
1438 break;
1439 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1440 *params = mCaps.maxComputeSharedMemorySize;
1441 break;
1442 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
1443 *params = mCaps.maxComputeUniformComponents;
1444 break;
1445 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
1446 *params = mCaps.maxComputeAtomicCounterBuffers;
1447 break;
1448 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
1449 *params = mCaps.maxComputeAtomicCounters;
1450 break;
1451 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
1452 *params = mCaps.maxComputeImageUniforms;
1453 break;
1454 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
1455 *params = mCaps.maxCombinedComputeUniformComponents;
1456 break;
1457 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
1458 *params = mCaps.maxComputeShaderStorageBlocks;
1459 break;
1460 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1461 *params = mCaps.maxCombinedShaderOutputResources;
1462 break;
1463 case GL_MAX_UNIFORM_LOCATIONS:
1464 *params = mCaps.maxUniformLocations;
1465 break;
1466 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1467 *params = mCaps.maxAtomicCounterBufferBindings;
1468 break;
1469 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1470 *params = mCaps.maxAtomicCounterBufferSize;
1471 break;
1472 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1473 *params = mCaps.maxCombinedAtomicCounterBuffers;
1474 break;
1475 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1476 *params = mCaps.maxCombinedAtomicCounters;
1477 break;
1478 case GL_MAX_IMAGE_UNITS:
1479 *params = mCaps.maxImageUnits;
1480 break;
1481 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1482 *params = mCaps.maxCombinedImageUniforms;
1483 break;
1484 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1485 *params = mCaps.maxShaderStorageBufferBindings;
1486 break;
1487 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1488 *params = mCaps.maxCombinedShaderStorageBlocks;
1489 break;
1490 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1491 *params = mCaps.shaderStorageBufferOffsetAlignment;
1492 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001493 default:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001494 mGLState.getIntegerv(mState, pname, params);
1495 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001496 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001497}
1498
Jamie Madill893ab082014-05-16 16:56:10 -04001499void Context::getInteger64v(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001500{
Shannon Woods53a94a82014-06-24 15:20:36 -04001501 // Queries about context capabilities and maximums are answered by Context.
1502 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001503 switch (pname)
1504 {
1505 case GL_MAX_ELEMENT_INDEX:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001506 *params = mCaps.maxElementIndex;
Jamie Madill0fda9862013-07-19 16:36:55 -04001507 break;
1508 case GL_MAX_UNIFORM_BLOCK_SIZE:
Geoff Lang3a61c322014-07-10 13:01:54 -04001509 *params = mCaps.maxUniformBlockSize;
Jamie Madill0fda9862013-07-19 16:36:55 -04001510 break;
1511 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Geoff Lang3a61c322014-07-10 13:01:54 -04001512 *params = mCaps.maxCombinedVertexUniformComponents;
Jamie Madill0fda9862013-07-19 16:36:55 -04001513 break;
1514 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Geoff Lang3a61c322014-07-10 13:01:54 -04001515 *params = mCaps.maxCombinedFragmentUniformComponents;
Jamie Madill0fda9862013-07-19 16:36:55 -04001516 break;
1517 case GL_MAX_SERVER_WAIT_TIMEOUT:
Geoff Lang900013c2014-07-07 11:32:19 -04001518 *params = mCaps.maxServerWaitTimeout;
Jamie Madill0fda9862013-07-19 16:36:55 -04001519 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001520
1521 // GL_EXT_disjoint_timer_query
1522 case GL_TIMESTAMP_EXT:
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001523 *params = mImplementation->getTimestamp();
Ian Ewell53f59f42016-01-28 17:36:55 -05001524 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001525
1526 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1527 *params = mCaps.maxShaderStorageBlockSize;
1528 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001529 default:
Jamie Madill893ab082014-05-16 16:56:10 -04001530 UNREACHABLE();
1531 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001532 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001533}
1534
Geoff Lang70d0f492015-12-10 17:45:46 -05001535void Context::getPointerv(GLenum pname, void **params) const
1536{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001537 mGLState.getPointerv(pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001538}
1539
Martin Radev66fb8202016-07-28 11:45:20 +03001540void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001541{
Shannon Woods53a94a82014-06-24 15:20:36 -04001542 // Queries about context capabilities and maximums are answered by Context.
1543 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001544
1545 GLenum nativeType;
1546 unsigned int numParams;
1547 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1548 ASSERT(queryStatus);
1549
1550 if (nativeType == GL_INT)
1551 {
1552 switch (target)
1553 {
1554 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1555 ASSERT(index < 3u);
1556 *data = mCaps.maxComputeWorkGroupCount[index];
1557 break;
1558 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1559 ASSERT(index < 3u);
1560 *data = mCaps.maxComputeWorkGroupSize[index];
1561 break;
1562 default:
1563 mGLState.getIntegeri_v(target, index, data);
1564 }
1565 }
1566 else
1567 {
1568 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1569 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001570}
1571
Martin Radev66fb8202016-07-28 11:45:20 +03001572void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001573{
Shannon Woods53a94a82014-06-24 15:20:36 -04001574 // Queries about context capabilities and maximums are answered by Context.
1575 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001576
1577 GLenum nativeType;
1578 unsigned int numParams;
1579 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1580 ASSERT(queryStatus);
1581
1582 if (nativeType == GL_INT_64_ANGLEX)
1583 {
1584 mGLState.getInteger64i_v(target, index, data);
1585 }
1586 else
1587 {
1588 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1589 }
1590}
1591
1592void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1593{
1594 // Queries about context capabilities and maximums are answered by Context.
1595 // Queries about current GL state values are answered by State.
1596
1597 GLenum nativeType;
1598 unsigned int numParams;
1599 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1600 ASSERT(queryStatus);
1601
1602 if (nativeType == GL_BOOL)
1603 {
1604 mGLState.getBooleani_v(target, index, data);
1605 }
1606 else
1607 {
1608 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1609 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001610}
1611
Geoff Langf6db0982015-08-25 13:04:00 -04001612Error Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001613{
Jamie Madill1b94d432015-08-07 13:23:23 -04001614 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001615 ANGLE_TRY(mImplementation->drawArrays(mode, first, count));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001616 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
Geoff Lang520c4ae2015-05-05 13:12:36 -04001617
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001618 return NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001619}
1620
Geoff Langf6db0982015-08-25 13:04:00 -04001621Error Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
1622{
1623 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001624 ANGLE_TRY(mImplementation->drawArraysInstanced(mode, first, count, instanceCount));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001625 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
Geoff Langf6db0982015-08-25 13:04:00 -04001626
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001627 return NoError();
Geoff Langf6db0982015-08-25 13:04:00 -04001628}
1629
1630Error Context::drawElements(GLenum mode,
1631 GLsizei count,
1632 GLenum type,
1633 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -04001634 const IndexRange &indexRange)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001635{
Jamie Madill1b94d432015-08-07 13:23:23 -04001636 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001637 return mImplementation->drawElements(mode, count, type, indices, indexRange);
Geoff Langf6db0982015-08-25 13:04:00 -04001638}
1639
1640Error Context::drawElementsInstanced(GLenum mode,
1641 GLsizei count,
1642 GLenum type,
1643 const GLvoid *indices,
1644 GLsizei instances,
Geoff Lang3edfe032015-09-04 16:38:24 -04001645 const IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -04001646{
1647 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001648 return mImplementation->drawElementsInstanced(mode, count, type, indices, instances,
1649 indexRange);
Geoff Langf6db0982015-08-25 13:04:00 -04001650}
1651
1652Error Context::drawRangeElements(GLenum mode,
1653 GLuint start,
1654 GLuint end,
1655 GLsizei count,
1656 GLenum type,
1657 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -04001658 const IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -04001659{
1660 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001661 return mImplementation->drawRangeElements(mode, start, end, count, type, indices, indexRange);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001662}
1663
Geoff Lang129753a2015-01-09 16:52:09 -05001664Error Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001665{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001666 return mImplementation->flush();
Geoff Lang129753a2015-01-09 16:52:09 -05001667}
1668
1669Error Context::finish()
1670{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001671 return mImplementation->finish();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001672}
1673
Austin Kinross6ee1e782015-05-29 17:05:37 -07001674void Context::insertEventMarker(GLsizei length, const char *marker)
1675{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001676 ASSERT(mImplementation);
1677 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001678}
1679
1680void Context::pushGroupMarker(GLsizei length, const char *marker)
1681{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001682 ASSERT(mImplementation);
1683 mImplementation->pushGroupMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001684}
1685
1686void Context::popGroupMarker()
1687{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001688 ASSERT(mImplementation);
1689 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07001690}
1691
Geoff Langd8605522016-04-13 10:19:12 -04001692void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
1693{
1694 Program *programObject = getProgram(program);
1695 ASSERT(programObject);
1696
1697 programObject->bindUniformLocation(location, name);
1698}
1699
Sami Väisänena797e062016-05-12 15:23:40 +03001700void Context::setCoverageModulation(GLenum components)
1701{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001702 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03001703}
1704
Sami Väisänene45e53b2016-05-25 10:36:04 +03001705void Context::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1706{
1707 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
1708}
1709
1710void Context::loadPathRenderingIdentityMatrix(GLenum matrixMode)
1711{
1712 GLfloat I[16];
1713 angle::Matrix<GLfloat>::setToIdentity(I);
1714
1715 mGLState.loadPathRenderingMatrix(matrixMode, I);
1716}
1717
1718void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
1719{
1720 const auto *pathObj = mResourceManager->getPath(path);
1721 if (!pathObj)
1722 return;
1723
1724 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1725 syncRendererState();
1726
1727 mImplementation->stencilFillPath(pathObj, fillMode, mask);
1728}
1729
1730void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
1731{
1732 const auto *pathObj = mResourceManager->getPath(path);
1733 if (!pathObj)
1734 return;
1735
1736 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1737 syncRendererState();
1738
1739 mImplementation->stencilStrokePath(pathObj, reference, mask);
1740}
1741
1742void Context::coverFillPath(GLuint path, GLenum coverMode)
1743{
1744 const auto *pathObj = mResourceManager->getPath(path);
1745 if (!pathObj)
1746 return;
1747
1748 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1749 syncRendererState();
1750
1751 mImplementation->coverFillPath(pathObj, coverMode);
1752}
1753
1754void Context::coverStrokePath(GLuint path, GLenum coverMode)
1755{
1756 const auto *pathObj = mResourceManager->getPath(path);
1757 if (!pathObj)
1758 return;
1759
1760 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1761 syncRendererState();
1762
1763 mImplementation->coverStrokePath(pathObj, coverMode);
1764}
1765
1766void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
1767{
1768 const auto *pathObj = mResourceManager->getPath(path);
1769 if (!pathObj)
1770 return;
1771
1772 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1773 syncRendererState();
1774
1775 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
1776}
1777
1778void Context::stencilThenCoverStrokePath(GLuint path,
1779 GLint reference,
1780 GLuint mask,
1781 GLenum coverMode)
1782{
1783 const auto *pathObj = mResourceManager->getPath(path);
1784 if (!pathObj)
1785 return;
1786
1787 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1788 syncRendererState();
1789
1790 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
1791}
1792
Sami Väisänend59ca052016-06-21 16:10:00 +03001793void Context::coverFillPathInstanced(GLsizei numPaths,
1794 GLenum pathNameType,
1795 const void *paths,
1796 GLuint pathBase,
1797 GLenum coverMode,
1798 GLenum transformType,
1799 const GLfloat *transformValues)
1800{
1801 const auto &pathObjects =
1802 GatherPaths(*mResourceManager, numPaths, pathNameType, paths, pathBase);
1803
1804 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1805 syncRendererState();
1806
1807 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
1808}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001809
Sami Väisänend59ca052016-06-21 16:10:00 +03001810void Context::coverStrokePathInstanced(GLsizei numPaths,
1811 GLenum pathNameType,
1812 const void *paths,
1813 GLuint pathBase,
1814 GLenum coverMode,
1815 GLenum transformType,
1816 const GLfloat *transformValues)
1817{
1818 const auto &pathObjects =
1819 GatherPaths(*mResourceManager, numPaths, pathNameType, paths, pathBase);
1820
1821 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1822 syncRendererState();
1823
1824 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
1825 transformValues);
1826}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001827
Sami Väisänend59ca052016-06-21 16:10:00 +03001828void Context::stencilFillPathInstanced(GLsizei numPaths,
1829 GLenum pathNameType,
1830 const void *paths,
1831 GLuint pathBase,
1832 GLenum fillMode,
1833 GLuint mask,
1834 GLenum transformType,
1835 const GLfloat *transformValues)
1836{
1837 const auto &pathObjects =
1838 GatherPaths(*mResourceManager, numPaths, pathNameType, paths, pathBase);
1839
1840 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1841 syncRendererState();
1842
1843 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
1844 transformValues);
1845}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001846
Sami Väisänend59ca052016-06-21 16:10:00 +03001847void Context::stencilStrokePathInstanced(GLsizei numPaths,
1848 GLenum pathNameType,
1849 const void *paths,
1850 GLuint pathBase,
1851 GLint reference,
1852 GLuint mask,
1853 GLenum transformType,
1854 const GLfloat *transformValues)
1855{
1856 const auto &pathObjects =
1857 GatherPaths(*mResourceManager, numPaths, pathNameType, paths, pathBase);
1858
1859 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1860 syncRendererState();
1861
1862 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
1863 transformValues);
1864}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001865
Sami Väisänend59ca052016-06-21 16:10:00 +03001866void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
1867 GLenum pathNameType,
1868 const void *paths,
1869 GLuint pathBase,
1870 GLenum fillMode,
1871 GLuint mask,
1872 GLenum coverMode,
1873 GLenum transformType,
1874 const GLfloat *transformValues)
1875{
1876 const auto &pathObjects =
1877 GatherPaths(*mResourceManager, numPaths, pathNameType, paths, pathBase);
1878
1879 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1880 syncRendererState();
1881
1882 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
1883 transformType, transformValues);
1884}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001885
Sami Väisänend59ca052016-06-21 16:10:00 +03001886void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
1887 GLenum pathNameType,
1888 const void *paths,
1889 GLuint pathBase,
1890 GLint reference,
1891 GLuint mask,
1892 GLenum coverMode,
1893 GLenum transformType,
1894 const GLfloat *transformValues)
1895{
1896 const auto &pathObjects =
1897 GatherPaths(*mResourceManager, numPaths, pathNameType, paths, pathBase);
1898
1899 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1900 syncRendererState();
1901
1902 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
1903 transformType, transformValues);
1904}
1905
Sami Väisänen46eaa942016-06-29 10:26:37 +03001906void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
1907{
1908 auto *programObject = getProgram(program);
1909
1910 programObject->bindFragmentInputLocation(location, name);
1911}
1912
1913void Context::programPathFragmentInputGen(GLuint program,
1914 GLint location,
1915 GLenum genMode,
1916 GLint components,
1917 const GLfloat *coeffs)
1918{
1919 auto *programObject = getProgram(program);
1920
1921 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
1922}
1923
Jamie Madill437fa652016-05-03 15:13:24 -04001924void Context::handleError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001925{
Geoff Langda5777c2014-07-11 09:52:58 -04001926 if (error.isError())
1927 {
1928 mErrors.insert(error.getCode());
Geoff Lang70d0f492015-12-10 17:45:46 -05001929
1930 if (!error.getMessage().empty())
1931 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001932 auto *debug = &mGLState.getDebug();
1933 debug->insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
1934 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
Geoff Lang70d0f492015-12-10 17:45:46 -05001935 }
Geoff Langda5777c2014-07-11 09:52:58 -04001936 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001937}
1938
1939// Get one of the recorded errors and clear its flag, if any.
1940// [OpenGL ES 2.0.24] section 2.5 page 13.
1941GLenum Context::getError()
1942{
Geoff Langda5777c2014-07-11 09:52:58 -04001943 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001944 {
Geoff Langda5777c2014-07-11 09:52:58 -04001945 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001946 }
Geoff Langda5777c2014-07-11 09:52:58 -04001947 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001948 {
Geoff Langda5777c2014-07-11 09:52:58 -04001949 GLenum error = *mErrors.begin();
1950 mErrors.erase(mErrors.begin());
1951 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001952 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001953}
1954
1955GLenum Context::getResetStatus()
1956{
Jamie Madill93e13fb2014-11-06 15:27:25 -05001957 //TODO(jmadill): needs MANGLE reworking
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00001958 if (mResetStatus == GL_NO_ERROR && !mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001959 {
daniel@transgaming.comf688c0d2012-10-31 17:52:57 +00001960 // mResetStatus will be set by the markContextLost callback
1961 // in the case a notification is sent
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001962 if (mImplementation->testDeviceLost())
Jamie Madill9dd0cf02014-11-24 11:38:51 -05001963 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001964 mImplementation->notifyDeviceLost();
Jamie Madill9dd0cf02014-11-24 11:38:51 -05001965 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001966 }
1967
1968 GLenum status = mResetStatus;
1969
1970 if (mResetStatus != GL_NO_ERROR)
1971 {
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00001972 ASSERT(mContextLost);
1973
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001974 if (mImplementation->testDeviceResettable())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001975 {
1976 mResetStatus = GL_NO_ERROR;
1977 }
1978 }
Jamie Madill893ab082014-05-16 16:56:10 -04001979
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001980 return status;
1981}
1982
1983bool Context::isResetNotificationEnabled()
1984{
1985 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
1986}
1987
Corentin Walleze3b10e82015-05-20 11:06:25 -04001988const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01001989{
Corentin Walleze3b10e82015-05-20 11:06:25 -04001990 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01001991}
1992
1993EGLenum Context::getClientType() const
1994{
1995 return mClientType;
1996}
1997
1998EGLenum Context::getRenderBuffer() const
1999{
Corentin Wallez37c39792015-08-20 14:19:46 -04002000 auto framebufferIt = mFramebufferMap.find(0);
2001 if (framebufferIt != mFramebufferMap.end())
2002 {
2003 const Framebuffer *framebuffer = framebufferIt->second;
2004 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(GL_BACK);
2005
2006 ASSERT(backAttachment != nullptr);
2007 return backAttachment->getSurface()->getRenderBuffer();
2008 }
2009 else
2010 {
2011 return EGL_NONE;
2012 }
Régis Fénéon83107972015-02-05 12:57:44 +01002013}
2014
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002015VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002016{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002017 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002018 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2019 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002020 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002021 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle, MAX_VERTEX_ATTRIBS);
2022
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002023 mVertexArrayMap[vertexArrayHandle] = vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002024 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002025
2026 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002027}
2028
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002029TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002030{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002031 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002032 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2033 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002034 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002035 transformFeedback =
2036 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002037 transformFeedback->addRef();
2038 mTransformFeedbackMap[transformFeedbackHandle] = transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002039 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002040
2041 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002042}
2043
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002044Framebuffer *Context::checkFramebufferAllocation(GLuint framebuffer)
2045{
2046 // Can be called from Bind without a prior call to Gen.
2047 auto framebufferIt = mFramebufferMap.find(framebuffer);
2048 bool neverCreated = framebufferIt == mFramebufferMap.end();
2049 if (neverCreated || framebufferIt->second == nullptr)
2050 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002051 Framebuffer *newFBO = new Framebuffer(mCaps, mImplementation.get(), framebuffer);
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002052 if (neverCreated)
2053 {
2054 mFramebufferHandleAllocator.reserve(framebuffer);
2055 mFramebufferMap[framebuffer] = newFBO;
2056 return newFBO;
2057 }
2058
2059 framebufferIt->second = newFBO;
2060 }
2061
2062 return framebufferIt->second;
2063}
2064
Geoff Lang36167ab2015-12-07 10:27:14 -05002065bool Context::isVertexArrayGenerated(GLuint vertexArray)
2066{
2067 return mVertexArrayMap.find(vertexArray) != mVertexArrayMap.end();
2068}
2069
2070bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2071{
2072 return mTransformFeedbackMap.find(transformFeedback) != mTransformFeedbackMap.end();
2073}
2074
Shannon Woods53a94a82014-06-24 15:20:36 -04002075void Context::detachTexture(GLuint texture)
2076{
2077 // Simple pass-through to State's detachTexture method, as textures do not require
2078 // allocation map management either here or in the resource manager at detach time.
2079 // Zero textures are held by the Context, and we don't attempt to request them from
2080 // the State.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002081 mGLState.detachTexture(mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002082}
2083
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002084void Context::detachBuffer(GLuint buffer)
2085{
Yuly Novikov5807a532015-12-03 13:01:22 -05002086 // Simple pass-through to State's detachBuffer method, since
2087 // only buffer attachments to container objects that are bound to the current context
2088 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002089
Yuly Novikov5807a532015-12-03 13:01:22 -05002090 // [OpenGL ES 3.2] section 5.1.2 page 45:
2091 // Attachments to unbound container objects, such as
2092 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2093 // are not affected and continue to act as references on the deleted object
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002094 mGLState.detachBuffer(buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002095}
2096
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002097void Context::detachFramebuffer(GLuint framebuffer)
2098{
Shannon Woods53a94a82014-06-24 15:20:36 -04002099 // Framebuffer detachment is handled by Context, because 0 is a valid
2100 // Framebuffer object, and a pointer to it must be passed from Context
2101 // to State at binding time.
2102
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002103 // [OpenGL ES 2.0.24] section 4.4 page 107:
2104 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though
2105 // BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero.
2106
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002107 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002108 {
2109 bindReadFramebuffer(0);
2110 }
2111
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002112 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002113 {
2114 bindDrawFramebuffer(0);
2115 }
2116}
2117
2118void Context::detachRenderbuffer(GLuint renderbuffer)
2119{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002120 mGLState.detachRenderbuffer(renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002121}
2122
Jamie Madill57a89722013-07-02 11:57:03 -04002123void Context::detachVertexArray(GLuint vertexArray)
2124{
Jamie Madill77a72f62015-04-14 11:18:32 -04002125 // Vertex array detachment is handled by Context, because 0 is a valid
2126 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002127 // binding time.
2128
Jamie Madill57a89722013-07-02 11:57:03 -04002129 // [OpenGL ES 3.0.2] section 2.10 page 43:
2130 // If a vertex array object that is currently bound is deleted, the binding
2131 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002132 if (mGLState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002133 {
2134 bindVertexArray(0);
2135 }
2136}
2137
Geoff Langc8058452014-02-03 12:04:11 -05002138void Context::detachTransformFeedback(GLuint transformFeedback)
2139{
Corentin Walleza2257da2016-04-19 16:43:12 -04002140 // Transform feedback detachment is handled by Context, because 0 is a valid
2141 // transform feedback, and a pointer to it must be passed from Context to State at
2142 // binding time.
2143
2144 // The OpenGL specification doesn't mention what should happen when the currently bound
2145 // transform feedback object is deleted. Since it is a container object, we treat it like
2146 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002147 if (mGLState.removeTransformFeedbackBinding(transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002148 {
2149 bindTransformFeedback(0);
2150 }
Geoff Langc8058452014-02-03 12:04:11 -05002151}
2152
Jamie Madilldc356042013-07-19 16:36:57 -04002153void Context::detachSampler(GLuint sampler)
2154{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002155 mGLState.detachSampler(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002156}
2157
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002158void Context::setVertexAttribDivisor(GLuint index, GLuint divisor)
2159{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002160 mGLState.setVertexAttribDivisor(index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002161}
2162
Jamie Madille29d1672013-07-19 16:36:57 -04002163void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2164{
Jamie Madill901b3792016-05-26 09:20:40 -04002165 mResourceManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille29d1672013-07-19 16:36:57 -04002166
2167 Sampler *samplerObject = getSampler(sampler);
2168 ASSERT(samplerObject);
2169
Geoff Lang69cce582015-09-17 13:20:36 -04002170 // clang-format off
Jamie Madille29d1672013-07-19 16:36:57 -04002171 switch (pname)
2172 {
Geoff Lang69cce582015-09-17 13:20:36 -04002173 case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(static_cast<GLenum>(param)); break;
2174 case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(static_cast<GLenum>(param)); break;
2175 case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(static_cast<GLenum>(param)); break;
2176 case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(static_cast<GLenum>(param)); break;
2177 case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(static_cast<GLenum>(param)); break;
2178 case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject->setMaxAnisotropy(std::min(static_cast<GLfloat>(param), getExtensions().maxTextureAnisotropy)); break;
2179 case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(static_cast<GLfloat>(param)); break;
2180 case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(static_cast<GLfloat>(param)); break;
2181 case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(static_cast<GLenum>(param)); break;
2182 case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(static_cast<GLenum>(param)); break;
2183 default: UNREACHABLE(); break;
Jamie Madille29d1672013-07-19 16:36:57 -04002184 }
Geoff Lang69cce582015-09-17 13:20:36 -04002185 // clang-format on
Jamie Madille29d1672013-07-19 16:36:57 -04002186}
2187
2188void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2189{
Jamie Madill901b3792016-05-26 09:20:40 -04002190 mResourceManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille29d1672013-07-19 16:36:57 -04002191
2192 Sampler *samplerObject = getSampler(sampler);
2193 ASSERT(samplerObject);
2194
Geoff Lang69cce582015-09-17 13:20:36 -04002195 // clang-format off
Jamie Madille29d1672013-07-19 16:36:57 -04002196 switch (pname)
2197 {
Geoff Lang69cce582015-09-17 13:20:36 -04002198 case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(uiround<GLenum>(param)); break;
2199 case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(uiround<GLenum>(param)); break;
2200 case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(uiround<GLenum>(param)); break;
2201 case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(uiround<GLenum>(param)); break;
2202 case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(uiround<GLenum>(param)); break;
2203 case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject->setMaxAnisotropy(std::min(param, getExtensions().maxTextureAnisotropy)); break;
2204 case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(param); break;
2205 case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(param); break;
2206 case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(uiround<GLenum>(param)); break;
2207 case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(uiround<GLenum>(param)); break;
2208 default: UNREACHABLE(); break;
Jamie Madille29d1672013-07-19 16:36:57 -04002209 }
Geoff Lang69cce582015-09-17 13:20:36 -04002210 // clang-format on
Jamie Madille29d1672013-07-19 16:36:57 -04002211}
2212
Jamie Madill9675b802013-07-19 16:36:59 -04002213GLint Context::getSamplerParameteri(GLuint sampler, GLenum pname)
2214{
Jamie Madill901b3792016-05-26 09:20:40 -04002215 mResourceManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madill9675b802013-07-19 16:36:59 -04002216
2217 Sampler *samplerObject = getSampler(sampler);
2218 ASSERT(samplerObject);
2219
Geoff Lang69cce582015-09-17 13:20:36 -04002220 // clang-format off
Jamie Madill9675b802013-07-19 16:36:59 -04002221 switch (pname)
2222 {
Geoff Lang69cce582015-09-17 13:20:36 -04002223 case GL_TEXTURE_MIN_FILTER: return static_cast<GLint>(samplerObject->getMinFilter());
2224 case GL_TEXTURE_MAG_FILTER: return static_cast<GLint>(samplerObject->getMagFilter());
2225 case GL_TEXTURE_WRAP_S: return static_cast<GLint>(samplerObject->getWrapS());
2226 case GL_TEXTURE_WRAP_T: return static_cast<GLint>(samplerObject->getWrapT());
2227 case GL_TEXTURE_WRAP_R: return static_cast<GLint>(samplerObject->getWrapR());
2228 case GL_TEXTURE_MAX_ANISOTROPY_EXT: return static_cast<GLint>(samplerObject->getMaxAnisotropy());
Olli Etuaho6ad07232016-03-03 17:15:49 +02002229 case GL_TEXTURE_MIN_LOD: return iround<GLint>(samplerObject->getMinLod());
2230 case GL_TEXTURE_MAX_LOD: return iround<GLint>(samplerObject->getMaxLod());
Geoff Lang69cce582015-09-17 13:20:36 -04002231 case GL_TEXTURE_COMPARE_MODE: return static_cast<GLint>(samplerObject->getCompareMode());
2232 case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLint>(samplerObject->getCompareFunc());
2233 default: UNREACHABLE(); return 0;
Jamie Madill9675b802013-07-19 16:36:59 -04002234 }
Geoff Lang69cce582015-09-17 13:20:36 -04002235 // clang-format on
Jamie Madill9675b802013-07-19 16:36:59 -04002236}
2237
2238GLfloat Context::getSamplerParameterf(GLuint sampler, GLenum pname)
2239{
Jamie Madill901b3792016-05-26 09:20:40 -04002240 mResourceManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madill9675b802013-07-19 16:36:59 -04002241
2242 Sampler *samplerObject = getSampler(sampler);
2243 ASSERT(samplerObject);
2244
Geoff Lang69cce582015-09-17 13:20:36 -04002245 // clang-format off
Jamie Madill9675b802013-07-19 16:36:59 -04002246 switch (pname)
2247 {
Geoff Lang69cce582015-09-17 13:20:36 -04002248 case GL_TEXTURE_MIN_FILTER: return static_cast<GLfloat>(samplerObject->getMinFilter());
2249 case GL_TEXTURE_MAG_FILTER: return static_cast<GLfloat>(samplerObject->getMagFilter());
2250 case GL_TEXTURE_WRAP_S: return static_cast<GLfloat>(samplerObject->getWrapS());
2251 case GL_TEXTURE_WRAP_T: return static_cast<GLfloat>(samplerObject->getWrapT());
2252 case GL_TEXTURE_WRAP_R: return static_cast<GLfloat>(samplerObject->getWrapR());
2253 case GL_TEXTURE_MAX_ANISOTROPY_EXT: return samplerObject->getMaxAnisotropy();
2254 case GL_TEXTURE_MIN_LOD: return samplerObject->getMinLod();
2255 case GL_TEXTURE_MAX_LOD: return samplerObject->getMaxLod();
2256 case GL_TEXTURE_COMPARE_MODE: return static_cast<GLfloat>(samplerObject->getCompareMode());
2257 case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLfloat>(samplerObject->getCompareFunc());
2258 default: UNREACHABLE(); return 0;
Jamie Madill9675b802013-07-19 16:36:59 -04002259 }
Geoff Lang69cce582015-09-17 13:20:36 -04002260 // clang-format on
Jamie Madill9675b802013-07-19 16:36:59 -04002261}
2262
Olli Etuahof0fee072016-03-30 15:11:58 +03002263void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2264{
2265 gl::Program *programObject = getProgram(program);
2266 ASSERT(programObject != nullptr);
2267
2268 ASSERT(pname == GL_PROGRAM_BINARY_RETRIEVABLE_HINT);
2269 programObject->setBinaryRetrievableHint(value != GL_FALSE);
2270}
2271
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002272void Context::initRendererString()
2273{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002274 std::ostringstream rendererString;
2275 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002276 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002277 rendererString << ")";
2278
Geoff Langcec35902014-04-16 10:52:36 -04002279 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002280}
2281
Geoff Langc0b9ef42014-07-02 10:02:37 -04002282const std::string &Context::getRendererString() const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002283{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002284 return mRendererString;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002285}
2286
Geoff Langcec35902014-04-16 10:52:36 -04002287void Context::initExtensionStrings()
2288{
Geoff Lang493daf52014-07-03 13:38:44 -04002289 mExtensionStrings = mExtensions.getStrings();
Geoff Langcec35902014-04-16 10:52:36 -04002290
Geoff Langc0b9ef42014-07-02 10:02:37 -04002291 std::ostringstream combinedStringStream;
2292 std::copy(mExtensionStrings.begin(), mExtensionStrings.end(), std::ostream_iterator<std::string>(combinedStringStream, " "));
2293 mExtensionString = combinedStringStream.str();
Geoff Langcec35902014-04-16 10:52:36 -04002294}
2295
Geoff Langc0b9ef42014-07-02 10:02:37 -04002296const std::string &Context::getExtensionString() const
Geoff Langcec35902014-04-16 10:52:36 -04002297{
2298 return mExtensionString;
2299}
2300
Geoff Langc0b9ef42014-07-02 10:02:37 -04002301const std::string &Context::getExtensionString(size_t idx) const
Geoff Langcec35902014-04-16 10:52:36 -04002302{
2303 return mExtensionStrings[idx];
2304}
2305
2306size_t Context::getExtensionStringCount() const
2307{
2308 return mExtensionStrings.size();
2309}
2310
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002311void Context::beginTransformFeedback(GLenum primitiveMode)
2312{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002313 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002314 ASSERT(transformFeedback != nullptr);
2315 ASSERT(!transformFeedback->isPaused());
2316
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002317 transformFeedback->begin(primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002318}
2319
2320bool Context::hasActiveTransformFeedback(GLuint program) const
2321{
2322 for (auto pair : mTransformFeedbackMap)
2323 {
2324 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
2325 {
2326 return true;
2327 }
2328 }
2329 return false;
2330}
2331
Jamie Madill00ed7a12016-05-19 13:13:38 -04002332void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04002333{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002334 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04002335
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002336 mExtensions = mImplementation->getNativeExtensions();
Geoff Lang493daf52014-07-03 13:38:44 -04002337
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002338 mLimitations = mImplementation->getNativeLimitations();
Austin Kinross02df7962015-07-01 10:03:42 -07002339
Martin Radev1be913c2016-07-11 17:59:16 +03002340 if (mClientMajorVersion < 3)
Geoff Lang493daf52014-07-03 13:38:44 -04002341 {
2342 // Disable ES3+ extensions
2343 mExtensions.colorBufferFloat = false;
Geoff Langb66a9092016-05-16 15:59:14 -04002344 mExtensions.eglImageExternalEssl3 = false;
Vincent Lang25ab4512016-05-13 18:13:59 +02002345 mExtensions.textureNorm16 = false;
Geoff Lang493daf52014-07-03 13:38:44 -04002346 }
2347
Martin Radev1be913c2016-07-11 17:59:16 +03002348 if (mClientMajorVersion > 2)
Geoff Lang493daf52014-07-03 13:38:44 -04002349 {
2350 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
2351 //mExtensions.sRGB = false;
2352 }
2353
Jamie Madill00ed7a12016-05-19 13:13:38 -04002354 // Some extensions are always available because they are implemented in the GL layer.
2355 mExtensions.bindUniformLocation = true;
2356 mExtensions.vertexArrayObject = true;
2357
2358 // Enable the no error extension if the context was created with the flag.
2359 mExtensions.noError = mSkipValidation;
2360
Geoff Lang70d0f492015-12-10 17:45:46 -05002361 // Explicitly enable GL_KHR_debug
2362 mExtensions.debug = true;
2363 mExtensions.maxDebugMessageLength = 1024;
2364 mExtensions.maxDebugLoggedMessages = 1024;
2365 mExtensions.maxDebugGroupStackDepth = 1024;
2366 mExtensions.maxLabelLength = 1024;
2367
Geoff Lang301d1612014-07-09 10:34:37 -04002368 // Apply implementation limits
2369 mCaps.maxVertexAttributes = std::min<GLuint>(mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Geoff Lang301d1612014-07-09 10:34:37 -04002370 mCaps.maxVertexUniformBlocks = std::min<GLuint>(mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
2371 mCaps.maxVertexOutputComponents = std::min<GLuint>(mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2372
2373 mCaps.maxFragmentInputComponents = std::min<GLuint>(mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
Geoff Lang3a61c322014-07-10 13:01:54 -04002374
Geoff Lang900013c2014-07-07 11:32:19 -04002375 mCaps.compressedTextureFormats.clear();
2376
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002377 const TextureCapsMap &rendererFormats = mImplementation->getNativeTextureCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04002378 for (TextureCapsMap::const_iterator i = rendererFormats.begin(); i != rendererFormats.end(); i++)
2379 {
2380 GLenum format = i->first;
2381 TextureCaps formatCaps = i->second;
2382
Geoff Lang5d601382014-07-22 15:14:06 -04002383 const InternalFormat &formatInfo = GetInternalFormatInfo(format);
Geoff Langd87878e2014-09-19 15:42:59 -04002384
Geoff Lang0d8b7242015-09-09 14:56:53 -04002385 // Update the format caps based on the client version and extensions.
2386 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
2387 // ES3.
2388 formatCaps.texturable =
Martin Radev1be913c2016-07-11 17:59:16 +03002389 formatCaps.texturable && formatInfo.textureSupport(mClientMajorVersion, mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002390 formatCaps.renderable =
Martin Radev1be913c2016-07-11 17:59:16 +03002391 formatCaps.renderable && formatInfo.renderSupport(mClientMajorVersion, mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002392 formatCaps.filterable =
Martin Radev1be913c2016-07-11 17:59:16 +03002393 formatCaps.filterable && formatInfo.filterSupport(mClientMajorVersion, mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04002394
2395 // OpenGL ES does not support multisampling with integer formats
2396 if (!formatInfo.renderSupport || formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)
Geoff Lang493daf52014-07-03 13:38:44 -04002397 {
Geoff Langd87878e2014-09-19 15:42:59 -04002398 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04002399 }
Geoff Langd87878e2014-09-19 15:42:59 -04002400
2401 if (formatCaps.texturable && formatInfo.compressed)
2402 {
2403 mCaps.compressedTextureFormats.push_back(format);
2404 }
2405
2406 mTextureCaps.insert(format, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04002407 }
2408}
2409
Jamie Madill1b94d432015-08-07 13:23:23 -04002410void Context::syncRendererState()
2411{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002412 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
2413 mImplementation->syncState(mGLState, dirtyBits);
2414 mGLState.clearDirtyBits();
2415 mGLState.syncDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -04002416}
2417
Jamie Madillad9f24e2016-02-12 09:27:24 -05002418void Context::syncRendererState(const State::DirtyBits &bitMask,
2419 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04002420{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002421 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
2422 mImplementation->syncState(mGLState, dirtyBits);
2423 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002424
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002425 mGLState.syncDirtyObjects(objectMask);
Jamie Madill1b94d432015-08-07 13:23:23 -04002426}
Jamie Madillc29968b2016-01-20 11:17:23 -05002427
2428void Context::blitFramebuffer(GLint srcX0,
2429 GLint srcY0,
2430 GLint srcX1,
2431 GLint srcY1,
2432 GLint dstX0,
2433 GLint dstY0,
2434 GLint dstX1,
2435 GLint dstY1,
2436 GLbitfield mask,
2437 GLenum filter)
2438{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002439 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002440 ASSERT(drawFramebuffer);
2441
2442 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
2443 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
2444
Jamie Madillad9f24e2016-02-12 09:27:24 -05002445 syncStateForBlit();
Jamie Madillc29968b2016-01-20 11:17:23 -05002446
Jamie Madill8415b5f2016-04-26 13:41:39 -04002447 handleError(drawFramebuffer->blit(mImplementation.get(), srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002448}
Jamie Madillc29968b2016-01-20 11:17:23 -05002449
2450void Context::clear(GLbitfield mask)
2451{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002452 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002453 handleError(mGLState.getDrawFramebuffer()->clear(mImplementation.get(), mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05002454}
2455
2456void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
2457{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002458 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002459 handleError(mGLState.getDrawFramebuffer()->clearBufferfv(mImplementation.get(), buffer,
2460 drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002461}
2462
2463void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
2464{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002465 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002466 handleError(mGLState.getDrawFramebuffer()->clearBufferuiv(mImplementation.get(), buffer,
2467 drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002468}
2469
2470void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
2471{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002472 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002473 handleError(mGLState.getDrawFramebuffer()->clearBufferiv(mImplementation.get(), buffer,
2474 drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002475}
2476
2477void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
2478{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002479 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002480 ASSERT(framebufferObject);
2481
2482 // If a buffer is not present, the clear has no effect
2483 if (framebufferObject->getDepthbuffer() == nullptr &&
2484 framebufferObject->getStencilbuffer() == nullptr)
2485 {
2486 return;
2487 }
2488
Jamie Madillad9f24e2016-02-12 09:27:24 -05002489 syncStateForClear();
Jamie Madill8415b5f2016-04-26 13:41:39 -04002490 handleError(framebufferObject->clearBufferfi(mImplementation.get(), buffer, drawbuffer, depth,
2491 stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05002492}
2493
2494void Context::readPixels(GLint x,
2495 GLint y,
2496 GLsizei width,
2497 GLsizei height,
2498 GLenum format,
2499 GLenum type,
2500 GLvoid *pixels)
2501{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002502 syncStateForReadPixels();
Jamie Madillc29968b2016-01-20 11:17:23 -05002503
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002504 Framebuffer *framebufferObject = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002505 ASSERT(framebufferObject);
2506
2507 Rectangle area(x, y, width, height);
Jamie Madill8415b5f2016-04-26 13:41:39 -04002508 handleError(framebufferObject->readPixels(mImplementation.get(), area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05002509}
2510
2511void Context::copyTexImage2D(GLenum target,
2512 GLint level,
2513 GLenum internalformat,
2514 GLint x,
2515 GLint y,
2516 GLsizei width,
2517 GLsizei height,
2518 GLint border)
2519{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002520 // Only sync the read FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002521 mGLState.syncDirtyObject(GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002522
Jamie Madillc29968b2016-01-20 11:17:23 -05002523 Rectangle sourceArea(x, y, width, height);
2524
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002525 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002526 Texture *texture =
2527 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill437fa652016-05-03 15:13:24 -04002528 handleError(texture->copyImage(target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002529}
2530
2531void Context::copyTexSubImage2D(GLenum target,
2532 GLint level,
2533 GLint xoffset,
2534 GLint yoffset,
2535 GLint x,
2536 GLint y,
2537 GLsizei width,
2538 GLsizei height)
2539{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002540 // Only sync the read FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002541 mGLState.syncDirtyObject(GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002542
Jamie Madillc29968b2016-01-20 11:17:23 -05002543 Offset destOffset(xoffset, yoffset, 0);
2544 Rectangle sourceArea(x, y, width, height);
2545
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002546 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002547 Texture *texture =
2548 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill437fa652016-05-03 15:13:24 -04002549 handleError(texture->copySubImage(target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002550}
2551
2552void Context::copyTexSubImage3D(GLenum target,
2553 GLint level,
2554 GLint xoffset,
2555 GLint yoffset,
2556 GLint zoffset,
2557 GLint x,
2558 GLint y,
2559 GLsizei width,
2560 GLsizei height)
2561{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002562 // Only sync the read FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002563 mGLState.syncDirtyObject(GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002564
Jamie Madillc29968b2016-01-20 11:17:23 -05002565 Offset destOffset(xoffset, yoffset, zoffset);
2566 Rectangle sourceArea(x, y, width, height);
2567
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002568 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002569 Texture *texture = getTargetTexture(target);
Jamie Madill437fa652016-05-03 15:13:24 -04002570 handleError(texture->copySubImage(target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002571}
2572
2573void Context::framebufferTexture2D(GLenum target,
2574 GLenum attachment,
2575 GLenum textarget,
2576 GLuint texture,
2577 GLint level)
2578{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002579 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002580 ASSERT(framebuffer);
2581
2582 if (texture != 0)
2583 {
2584 Texture *textureObj = getTexture(texture);
2585
2586 ImageIndex index = ImageIndex::MakeInvalid();
2587
2588 if (textarget == GL_TEXTURE_2D)
2589 {
2590 index = ImageIndex::Make2D(level);
2591 }
2592 else
2593 {
2594 ASSERT(IsCubeMapTextureTarget(textarget));
2595 index = ImageIndex::MakeCube(textarget, level);
2596 }
2597
2598 framebuffer->setAttachment(GL_TEXTURE, attachment, index, textureObj);
2599 }
2600 else
2601 {
2602 framebuffer->resetAttachment(attachment);
2603 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002604
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002605 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002606}
2607
2608void Context::framebufferRenderbuffer(GLenum target,
2609 GLenum attachment,
2610 GLenum renderbuffertarget,
2611 GLuint renderbuffer)
2612{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002613 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002614 ASSERT(framebuffer);
2615
2616 if (renderbuffer != 0)
2617 {
2618 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
2619 framebuffer->setAttachment(GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
2620 renderbufferObject);
2621 }
2622 else
2623 {
2624 framebuffer->resetAttachment(attachment);
2625 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002626
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002627 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002628}
2629
2630void Context::framebufferTextureLayer(GLenum target,
2631 GLenum attachment,
2632 GLuint texture,
2633 GLint level,
2634 GLint layer)
2635{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002636 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002637 ASSERT(framebuffer);
2638
2639 if (texture != 0)
2640 {
2641 Texture *textureObject = getTexture(texture);
2642
2643 ImageIndex index = ImageIndex::MakeInvalid();
2644
2645 if (textureObject->getTarget() == GL_TEXTURE_3D)
2646 {
2647 index = ImageIndex::Make3D(level, layer);
2648 }
2649 else
2650 {
2651 ASSERT(textureObject->getTarget() == GL_TEXTURE_2D_ARRAY);
2652 index = ImageIndex::Make2DArray(level, layer);
2653 }
2654
2655 framebuffer->setAttachment(GL_TEXTURE, attachment, index, textureObject);
2656 }
2657 else
2658 {
2659 framebuffer->resetAttachment(attachment);
2660 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002661
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002662 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002663}
2664
2665void Context::drawBuffers(GLsizei n, const GLenum *bufs)
2666{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002667 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002668 ASSERT(framebuffer);
2669 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002670 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05002671}
2672
2673void Context::readBuffer(GLenum mode)
2674{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002675 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002676 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002677 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05002678}
2679
2680void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
2681{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002682 // Only sync the FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002683 mGLState.syncDirtyObject(target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002684
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002685 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002686 ASSERT(framebuffer);
2687
2688 // The specification isn't clear what should be done when the framebuffer isn't complete.
2689 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill437fa652016-05-03 15:13:24 -04002690 handleError(framebuffer->discard(numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05002691}
2692
2693void Context::invalidateFramebuffer(GLenum target,
2694 GLsizei numAttachments,
2695 const GLenum *attachments)
2696{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002697 // Only sync the FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002698 mGLState.syncDirtyObject(target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002699
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002700 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002701 ASSERT(framebuffer);
2702
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002703 if (framebuffer->checkStatus(mState) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05002704 {
Jamie Madill437fa652016-05-03 15:13:24 -04002705 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05002706 }
Jamie Madill437fa652016-05-03 15:13:24 -04002707
2708 handleError(framebuffer->invalidate(numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05002709}
2710
2711void Context::invalidateSubFramebuffer(GLenum target,
2712 GLsizei numAttachments,
2713 const GLenum *attachments,
2714 GLint x,
2715 GLint y,
2716 GLsizei width,
2717 GLsizei height)
2718{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002719 // Only sync the FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002720 mGLState.syncDirtyObject(target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002721
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002722 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002723 ASSERT(framebuffer);
2724
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002725 if (framebuffer->checkStatus(mState) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05002726 {
Jamie Madill437fa652016-05-03 15:13:24 -04002727 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05002728 }
Jamie Madill437fa652016-05-03 15:13:24 -04002729
2730 Rectangle area(x, y, width, height);
2731 handleError(framebuffer->invalidateSub(numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05002732}
2733
Jamie Madill73a84962016-02-12 09:27:23 -05002734void Context::texImage2D(GLenum target,
2735 GLint level,
2736 GLint internalformat,
2737 GLsizei width,
2738 GLsizei height,
2739 GLint border,
2740 GLenum format,
2741 GLenum type,
2742 const GLvoid *pixels)
2743{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002744 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002745
2746 Extents size(width, height, 1);
2747 Texture *texture =
2748 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002749 handleError(texture->setImage(mGLState.getUnpackState(), target, level, internalformat, size,
Jamie Madill437fa652016-05-03 15:13:24 -04002750 format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05002751}
2752
2753void Context::texImage3D(GLenum target,
2754 GLint level,
2755 GLint internalformat,
2756 GLsizei width,
2757 GLsizei height,
2758 GLsizei depth,
2759 GLint border,
2760 GLenum format,
2761 GLenum type,
2762 const GLvoid *pixels)
2763{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002764 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002765
2766 Extents size(width, height, depth);
2767 Texture *texture = getTargetTexture(target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002768 handleError(texture->setImage(mGLState.getUnpackState(), target, level, internalformat, size,
Jamie Madill437fa652016-05-03 15:13:24 -04002769 format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05002770}
2771
2772void Context::texSubImage2D(GLenum target,
2773 GLint level,
2774 GLint xoffset,
2775 GLint yoffset,
2776 GLsizei width,
2777 GLsizei height,
2778 GLenum format,
2779 GLenum type,
2780 const GLvoid *pixels)
2781{
2782 // Zero sized uploads are valid but no-ops
2783 if (width == 0 || height == 0)
2784 {
2785 return;
2786 }
2787
Jamie Madillad9f24e2016-02-12 09:27:24 -05002788 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002789
2790 Box area(xoffset, yoffset, 0, width, height, 1);
2791 Texture *texture =
2792 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002793 handleError(texture->setSubImage(mGLState.getUnpackState(), target, level, area, format, type,
Jamie Madill437fa652016-05-03 15:13:24 -04002794 reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05002795}
2796
2797void Context::texSubImage3D(GLenum target,
2798 GLint level,
2799 GLint xoffset,
2800 GLint yoffset,
2801 GLint zoffset,
2802 GLsizei width,
2803 GLsizei height,
2804 GLsizei depth,
2805 GLenum format,
2806 GLenum type,
2807 const GLvoid *pixels)
2808{
2809 // Zero sized uploads are valid but no-ops
2810 if (width == 0 || height == 0 || depth == 0)
2811 {
2812 return;
2813 }
2814
Jamie Madillad9f24e2016-02-12 09:27:24 -05002815 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002816
2817 Box area(xoffset, yoffset, zoffset, width, height, depth);
2818 Texture *texture = getTargetTexture(target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002819 handleError(texture->setSubImage(mGLState.getUnpackState(), target, level, area, format, type,
Jamie Madill437fa652016-05-03 15:13:24 -04002820 reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05002821}
2822
2823void Context::compressedTexImage2D(GLenum target,
2824 GLint level,
2825 GLenum internalformat,
2826 GLsizei width,
2827 GLsizei height,
2828 GLint border,
2829 GLsizei imageSize,
2830 const GLvoid *data)
2831{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002832 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002833
2834 Extents size(width, height, 1);
2835 Texture *texture =
2836 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002837 handleError(texture->setCompressedImage(mGLState.getUnpackState(), target, level,
2838 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04002839 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05002840}
2841
2842void Context::compressedTexImage3D(GLenum target,
2843 GLint level,
2844 GLenum internalformat,
2845 GLsizei width,
2846 GLsizei height,
2847 GLsizei depth,
2848 GLint border,
2849 GLsizei imageSize,
2850 const GLvoid *data)
2851{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002852 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002853
2854 Extents size(width, height, depth);
2855 Texture *texture = getTargetTexture(target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002856 handleError(texture->setCompressedImage(mGLState.getUnpackState(), target, level,
2857 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04002858 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05002859}
2860
2861void Context::compressedTexSubImage2D(GLenum target,
2862 GLint level,
2863 GLint xoffset,
2864 GLint yoffset,
2865 GLsizei width,
2866 GLsizei height,
2867 GLenum format,
2868 GLsizei imageSize,
2869 const GLvoid *data)
2870{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002871 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002872
2873 Box area(xoffset, yoffset, 0, width, height, 1);
2874 Texture *texture =
2875 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002876 handleError(texture->setCompressedSubImage(mGLState.getUnpackState(), target, level, area,
2877 format, imageSize,
2878 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05002879}
2880
2881void Context::compressedTexSubImage3D(GLenum target,
2882 GLint level,
2883 GLint xoffset,
2884 GLint yoffset,
2885 GLint zoffset,
2886 GLsizei width,
2887 GLsizei height,
2888 GLsizei depth,
2889 GLenum format,
2890 GLsizei imageSize,
2891 const GLvoid *data)
2892{
2893 // Zero sized uploads are valid but no-ops
2894 if (width == 0 || height == 0)
2895 {
2896 return;
2897 }
2898
Jamie Madillad9f24e2016-02-12 09:27:24 -05002899 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002900
2901 Box area(xoffset, yoffset, zoffset, width, height, depth);
2902 Texture *texture = getTargetTexture(target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002903 handleError(texture->setCompressedSubImage(mGLState.getUnpackState(), target, level, area,
2904 format, imageSize,
2905 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05002906}
2907
Olli Etuaho0f2b1562016-05-13 16:15:35 +03002908void Context::generateMipmap(GLenum target)
2909{
2910 Texture *texture = getTargetTexture(target);
2911 handleError(texture->generateMipmap());
2912}
2913
Geoff Lang97073d12016-04-20 10:42:34 -07002914void Context::copyTextureCHROMIUM(GLuint sourceId,
2915 GLuint destId,
2916 GLint internalFormat,
2917 GLenum destType,
2918 GLboolean unpackFlipY,
2919 GLboolean unpackPremultiplyAlpha,
2920 GLboolean unpackUnmultiplyAlpha)
2921{
2922 syncStateForTexImage();
2923
2924 gl::Texture *sourceTexture = getTexture(sourceId);
2925 gl::Texture *destTexture = getTexture(destId);
2926 handleError(destTexture->copyTexture(internalFormat, destType, unpackFlipY == GL_TRUE,
2927 unpackPremultiplyAlpha == GL_TRUE,
2928 unpackUnmultiplyAlpha == GL_TRUE, sourceTexture));
2929}
2930
2931void Context::copySubTextureCHROMIUM(GLuint sourceId,
2932 GLuint destId,
2933 GLint xoffset,
2934 GLint yoffset,
2935 GLint x,
2936 GLint y,
2937 GLsizei width,
2938 GLsizei height,
2939 GLboolean unpackFlipY,
2940 GLboolean unpackPremultiplyAlpha,
2941 GLboolean unpackUnmultiplyAlpha)
2942{
2943 // Zero sized copies are valid but no-ops
2944 if (width == 0 || height == 0)
2945 {
2946 return;
2947 }
2948
2949 syncStateForTexImage();
2950
2951 gl::Texture *sourceTexture = getTexture(sourceId);
2952 gl::Texture *destTexture = getTexture(destId);
2953 Offset offset(xoffset, yoffset, 0);
2954 Rectangle area(x, y, width, height);
2955 handleError(destTexture->copySubTexture(offset, area, unpackFlipY == GL_TRUE,
2956 unpackPremultiplyAlpha == GL_TRUE,
2957 unpackUnmultiplyAlpha == GL_TRUE, sourceTexture));
2958}
2959
Olli Etuaho4f667482016-03-30 15:56:35 +03002960void Context::getBufferPointerv(GLenum target, GLenum /*pname*/, void **params)
2961{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002962 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03002963 ASSERT(buffer);
2964
2965 if (!buffer->isMapped())
2966 {
2967 *params = nullptr;
2968 }
2969 else
2970 {
2971 *params = buffer->getMapPointer();
2972 }
2973}
2974
2975GLvoid *Context::mapBuffer(GLenum target, GLenum access)
2976{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002977 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03002978 ASSERT(buffer);
2979
2980 Error error = buffer->map(access);
2981 if (error.isError())
2982 {
Jamie Madill437fa652016-05-03 15:13:24 -04002983 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03002984 return nullptr;
2985 }
2986
2987 return buffer->getMapPointer();
2988}
2989
2990GLboolean Context::unmapBuffer(GLenum target)
2991{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002992 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03002993 ASSERT(buffer);
2994
2995 GLboolean result;
2996 Error error = buffer->unmap(&result);
2997 if (error.isError())
2998 {
Jamie Madill437fa652016-05-03 15:13:24 -04002999 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003000 return GL_FALSE;
3001 }
3002
3003 return result;
3004}
3005
3006GLvoid *Context::mapBufferRange(GLenum target,
3007 GLintptr offset,
3008 GLsizeiptr length,
3009 GLbitfield access)
3010{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003011 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003012 ASSERT(buffer);
3013
3014 Error error = buffer->mapRange(offset, length, access);
3015 if (error.isError())
3016 {
Jamie Madill437fa652016-05-03 15:13:24 -04003017 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003018 return nullptr;
3019 }
3020
3021 return buffer->getMapPointer();
3022}
3023
3024void Context::flushMappedBufferRange(GLenum /*target*/, GLintptr /*offset*/, GLsizeiptr /*length*/)
3025{
3026 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
3027}
3028
Jamie Madillad9f24e2016-02-12 09:27:24 -05003029void Context::syncStateForReadPixels()
3030{
3031 syncRendererState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
3032}
3033
3034void Context::syncStateForTexImage()
3035{
3036 syncRendererState(mTexImageDirtyBits, mTexImageDirtyObjects);
3037}
3038
3039void Context::syncStateForClear()
3040{
3041 syncRendererState(mClearDirtyBits, mClearDirtyObjects);
3042}
3043
3044void Context::syncStateForBlit()
3045{
3046 syncRendererState(mBlitDirtyBits, mBlitDirtyObjects);
3047}
3048
Jamie Madillc20ab272016-06-09 07:20:46 -07003049void Context::activeTexture(GLenum texture)
3050{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003051 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003052}
3053
3054void Context::blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
3055{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003056 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003057}
3058
3059void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
3060{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003061 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003062}
3063
3064void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
3065{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003066 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003067}
3068
3069void Context::clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
3070{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003071 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003072}
3073
3074void Context::clearDepthf(GLclampf depth)
3075{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003076 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07003077}
3078
3079void Context::clearStencil(GLint s)
3080{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003081 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07003082}
3083
3084void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
3085{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003086 mGLState.setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
Jamie Madillc20ab272016-06-09 07:20:46 -07003087}
3088
3089void Context::cullFace(GLenum mode)
3090{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003091 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003092}
3093
3094void Context::depthFunc(GLenum func)
3095{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003096 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07003097}
3098
3099void Context::depthMask(GLboolean flag)
3100{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003101 mGLState.setDepthMask(flag != GL_FALSE);
Jamie Madillc20ab272016-06-09 07:20:46 -07003102}
3103
3104void Context::depthRangef(GLclampf zNear, GLclampf zFar)
3105{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003106 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07003107}
3108
3109void Context::disable(GLenum cap)
3110{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003111 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003112}
3113
3114void Context::disableVertexAttribArray(GLuint index)
3115{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003116 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003117}
3118
3119void Context::enable(GLenum cap)
3120{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003121 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003122}
3123
3124void Context::enableVertexAttribArray(GLuint index)
3125{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003126 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003127}
3128
3129void Context::frontFace(GLenum mode)
3130{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003131 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003132}
3133
3134void Context::hint(GLenum target, GLenum mode)
3135{
3136 switch (target)
3137 {
3138 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003139 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003140 break;
3141
3142 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003143 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003144 break;
3145
3146 default:
3147 UNREACHABLE();
3148 return;
3149 }
3150}
3151
3152void Context::lineWidth(GLfloat width)
3153{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003154 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07003155}
3156
3157void Context::pixelStorei(GLenum pname, GLint param)
3158{
3159 switch (pname)
3160 {
3161 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003162 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003163 break;
3164
3165 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003166 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003167 break;
3168
3169 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003170 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003171 break;
3172
3173 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003174 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003175 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003176 break;
3177
3178 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03003179 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003180 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003181 break;
3182
3183 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03003184 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003185 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003186 break;
3187
3188 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003189 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003190 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003191 break;
3192
3193 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003194 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003195 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003196 break;
3197
3198 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003199 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003200 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003201 break;
3202
3203 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003204 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003205 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003206 break;
3207
3208 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003209 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003210 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003211 break;
3212
3213 default:
3214 UNREACHABLE();
3215 return;
3216 }
3217}
3218
3219void Context::polygonOffset(GLfloat factor, GLfloat units)
3220{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003221 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07003222}
3223
3224void Context::sampleCoverage(GLclampf value, GLboolean invert)
3225{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003226 mGLState.setSampleCoverageParams(clamp01(value), invert == GL_TRUE);
Jamie Madillc20ab272016-06-09 07:20:46 -07003227}
3228
3229void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
3230{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003231 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003232}
3233
3234void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3235{
3236 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3237 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003238 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003239 }
3240
3241 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3242 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003243 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003244 }
3245}
3246
3247void Context::stencilMaskSeparate(GLenum face, GLuint mask)
3248{
3249 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3250 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003251 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003252 }
3253
3254 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3255 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003256 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003257 }
3258}
3259
3260void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3261{
3262 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3263 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003264 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003265 }
3266
3267 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3268 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003269 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003270 }
3271}
3272
3273void Context::vertexAttrib1f(GLuint index, GLfloat x)
3274{
3275 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003276 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003277}
3278
3279void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
3280{
3281 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003282 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003283}
3284
3285void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
3286{
3287 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003288 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003289}
3290
3291void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
3292{
3293 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003294 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003295}
3296
3297void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
3298{
3299 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003300 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003301}
3302
3303void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
3304{
3305 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003306 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003307}
3308
3309void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3310{
3311 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003312 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003313}
3314
3315void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
3316{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003317 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07003318}
3319
3320void Context::vertexAttribPointer(GLuint index,
3321 GLint size,
3322 GLenum type,
3323 GLboolean normalized,
3324 GLsizei stride,
3325 const GLvoid *ptr)
3326{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003327 mGLState.setVertexAttribState(index, mGLState.getTargetBuffer(GL_ARRAY_BUFFER), size, type,
3328 normalized == GL_TRUE, false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07003329}
3330
3331void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
3332{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003333 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003334}
3335
3336void Context::vertexAttribIPointer(GLuint index,
3337 GLint size,
3338 GLenum type,
3339 GLsizei stride,
3340 const GLvoid *pointer)
3341{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003342 mGLState.setVertexAttribState(index, mGLState.getTargetBuffer(GL_ARRAY_BUFFER), size, type,
3343 false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07003344}
3345
3346void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
3347{
3348 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003349 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003350}
3351
3352void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
3353{
3354 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003355 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003356}
3357
3358void Context::vertexAttribI4iv(GLuint index, const GLint *v)
3359{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003360 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003361}
3362
3363void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
3364{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003365 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003366}
3367
3368void Context::debugMessageControl(GLenum source,
3369 GLenum type,
3370 GLenum severity,
3371 GLsizei count,
3372 const GLuint *ids,
3373 GLboolean enabled)
3374{
3375 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003376 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
3377 (enabled != GL_FALSE));
Jamie Madillc20ab272016-06-09 07:20:46 -07003378}
3379
3380void Context::debugMessageInsert(GLenum source,
3381 GLenum type,
3382 GLuint id,
3383 GLenum severity,
3384 GLsizei length,
3385 const GLchar *buf)
3386{
3387 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003388 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07003389}
3390
3391void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
3392{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003393 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07003394}
3395
3396GLuint Context::getDebugMessageLog(GLuint count,
3397 GLsizei bufSize,
3398 GLenum *sources,
3399 GLenum *types,
3400 GLuint *ids,
3401 GLenum *severities,
3402 GLsizei *lengths,
3403 GLchar *messageLog)
3404{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003405 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
3406 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07003407}
3408
3409void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
3410{
3411 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003412 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07003413}
3414
3415void Context::popDebugGroup()
3416{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003417 mGLState.getDebug().popGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07003418}
3419
Jamie Madillc29968b2016-01-20 11:17:23 -05003420} // namespace gl