blob: 5c032bfd8279edb40524516a5c53e1107e2f6846 [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);
Geoff Lange1c4d392016-08-04 11:44:34 -04001548 UNUSED_ASSERTION_VARIABLE(queryStatus);
Martin Radev66fb8202016-07-28 11:45:20 +03001549 ASSERT(queryStatus);
1550
1551 if (nativeType == GL_INT)
1552 {
1553 switch (target)
1554 {
1555 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1556 ASSERT(index < 3u);
1557 *data = mCaps.maxComputeWorkGroupCount[index];
1558 break;
1559 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1560 ASSERT(index < 3u);
1561 *data = mCaps.maxComputeWorkGroupSize[index];
1562 break;
1563 default:
1564 mGLState.getIntegeri_v(target, index, data);
1565 }
1566 }
1567 else
1568 {
1569 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1570 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001571}
1572
Martin Radev66fb8202016-07-28 11:45:20 +03001573void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001574{
Shannon Woods53a94a82014-06-24 15:20:36 -04001575 // Queries about context capabilities and maximums are answered by Context.
1576 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001577
1578 GLenum nativeType;
1579 unsigned int numParams;
1580 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
Geoff Lange1c4d392016-08-04 11:44:34 -04001581 UNUSED_ASSERTION_VARIABLE(queryStatus);
Martin Radev66fb8202016-07-28 11:45:20 +03001582 ASSERT(queryStatus);
1583
1584 if (nativeType == GL_INT_64_ANGLEX)
1585 {
1586 mGLState.getInteger64i_v(target, index, data);
1587 }
1588 else
1589 {
1590 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1591 }
1592}
1593
1594void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1595{
1596 // Queries about context capabilities and maximums are answered by Context.
1597 // Queries about current GL state values are answered by State.
1598
1599 GLenum nativeType;
1600 unsigned int numParams;
1601 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
Geoff Lange1c4d392016-08-04 11:44:34 -04001602 UNUSED_ASSERTION_VARIABLE(queryStatus);
Martin Radev66fb8202016-07-28 11:45:20 +03001603 ASSERT(queryStatus);
1604
1605 if (nativeType == GL_BOOL)
1606 {
1607 mGLState.getBooleani_v(target, index, data);
1608 }
1609 else
1610 {
1611 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1612 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001613}
1614
Geoff Langf6db0982015-08-25 13:04:00 -04001615Error Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001616{
Jamie Madill1b94d432015-08-07 13:23:23 -04001617 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001618 ANGLE_TRY(mImplementation->drawArrays(mode, first, count));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001619 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
Geoff Lang520c4ae2015-05-05 13:12:36 -04001620
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001621 return NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001622}
1623
Geoff Langf6db0982015-08-25 13:04:00 -04001624Error Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
1625{
1626 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001627 ANGLE_TRY(mImplementation->drawArraysInstanced(mode, first, count, instanceCount));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001628 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
Geoff Langf6db0982015-08-25 13:04:00 -04001629
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001630 return NoError();
Geoff Langf6db0982015-08-25 13:04:00 -04001631}
1632
1633Error Context::drawElements(GLenum mode,
1634 GLsizei count,
1635 GLenum type,
1636 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -04001637 const IndexRange &indexRange)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001638{
Jamie Madill1b94d432015-08-07 13:23:23 -04001639 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001640 return mImplementation->drawElements(mode, count, type, indices, indexRange);
Geoff Langf6db0982015-08-25 13:04:00 -04001641}
1642
1643Error Context::drawElementsInstanced(GLenum mode,
1644 GLsizei count,
1645 GLenum type,
1646 const GLvoid *indices,
1647 GLsizei instances,
Geoff Lang3edfe032015-09-04 16:38:24 -04001648 const IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -04001649{
1650 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001651 return mImplementation->drawElementsInstanced(mode, count, type, indices, instances,
1652 indexRange);
Geoff Langf6db0982015-08-25 13:04:00 -04001653}
1654
1655Error Context::drawRangeElements(GLenum mode,
1656 GLuint start,
1657 GLuint end,
1658 GLsizei count,
1659 GLenum type,
1660 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -04001661 const IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -04001662{
1663 syncRendererState();
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001664 return mImplementation->drawRangeElements(mode, start, end, count, type, indices, indexRange);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001665}
1666
Geoff Lang129753a2015-01-09 16:52:09 -05001667Error Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001668{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001669 return mImplementation->flush();
Geoff Lang129753a2015-01-09 16:52:09 -05001670}
1671
1672Error Context::finish()
1673{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001674 return mImplementation->finish();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001675}
1676
Austin Kinross6ee1e782015-05-29 17:05:37 -07001677void Context::insertEventMarker(GLsizei length, const char *marker)
1678{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001679 ASSERT(mImplementation);
1680 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001681}
1682
1683void Context::pushGroupMarker(GLsizei length, const char *marker)
1684{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001685 ASSERT(mImplementation);
1686 mImplementation->pushGroupMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001687}
1688
1689void Context::popGroupMarker()
1690{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001691 ASSERT(mImplementation);
1692 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07001693}
1694
Geoff Langd8605522016-04-13 10:19:12 -04001695void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
1696{
1697 Program *programObject = getProgram(program);
1698 ASSERT(programObject);
1699
1700 programObject->bindUniformLocation(location, name);
1701}
1702
Sami Väisänena797e062016-05-12 15:23:40 +03001703void Context::setCoverageModulation(GLenum components)
1704{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001705 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03001706}
1707
Sami Väisänene45e53b2016-05-25 10:36:04 +03001708void Context::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1709{
1710 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
1711}
1712
1713void Context::loadPathRenderingIdentityMatrix(GLenum matrixMode)
1714{
1715 GLfloat I[16];
1716 angle::Matrix<GLfloat>::setToIdentity(I);
1717
1718 mGLState.loadPathRenderingMatrix(matrixMode, I);
1719}
1720
1721void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
1722{
1723 const auto *pathObj = mResourceManager->getPath(path);
1724 if (!pathObj)
1725 return;
1726
1727 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1728 syncRendererState();
1729
1730 mImplementation->stencilFillPath(pathObj, fillMode, mask);
1731}
1732
1733void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
1734{
1735 const auto *pathObj = mResourceManager->getPath(path);
1736 if (!pathObj)
1737 return;
1738
1739 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1740 syncRendererState();
1741
1742 mImplementation->stencilStrokePath(pathObj, reference, mask);
1743}
1744
1745void Context::coverFillPath(GLuint path, GLenum coverMode)
1746{
1747 const auto *pathObj = mResourceManager->getPath(path);
1748 if (!pathObj)
1749 return;
1750
1751 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1752 syncRendererState();
1753
1754 mImplementation->coverFillPath(pathObj, coverMode);
1755}
1756
1757void Context::coverStrokePath(GLuint path, GLenum coverMode)
1758{
1759 const auto *pathObj = mResourceManager->getPath(path);
1760 if (!pathObj)
1761 return;
1762
1763 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1764 syncRendererState();
1765
1766 mImplementation->coverStrokePath(pathObj, coverMode);
1767}
1768
1769void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
1770{
1771 const auto *pathObj = mResourceManager->getPath(path);
1772 if (!pathObj)
1773 return;
1774
1775 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1776 syncRendererState();
1777
1778 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
1779}
1780
1781void Context::stencilThenCoverStrokePath(GLuint path,
1782 GLint reference,
1783 GLuint mask,
1784 GLenum coverMode)
1785{
1786 const auto *pathObj = mResourceManager->getPath(path);
1787 if (!pathObj)
1788 return;
1789
1790 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1791 syncRendererState();
1792
1793 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
1794}
1795
Sami Väisänend59ca052016-06-21 16:10:00 +03001796void Context::coverFillPathInstanced(GLsizei numPaths,
1797 GLenum pathNameType,
1798 const void *paths,
1799 GLuint pathBase,
1800 GLenum coverMode,
1801 GLenum transformType,
1802 const GLfloat *transformValues)
1803{
1804 const auto &pathObjects =
1805 GatherPaths(*mResourceManager, numPaths, pathNameType, paths, pathBase);
1806
1807 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1808 syncRendererState();
1809
1810 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
1811}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001812
Sami Väisänend59ca052016-06-21 16:10:00 +03001813void Context::coverStrokePathInstanced(GLsizei numPaths,
1814 GLenum pathNameType,
1815 const void *paths,
1816 GLuint pathBase,
1817 GLenum coverMode,
1818 GLenum transformType,
1819 const GLfloat *transformValues)
1820{
1821 const auto &pathObjects =
1822 GatherPaths(*mResourceManager, numPaths, pathNameType, paths, pathBase);
1823
1824 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1825 syncRendererState();
1826
1827 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
1828 transformValues);
1829}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001830
Sami Väisänend59ca052016-06-21 16:10:00 +03001831void Context::stencilFillPathInstanced(GLsizei numPaths,
1832 GLenum pathNameType,
1833 const void *paths,
1834 GLuint pathBase,
1835 GLenum fillMode,
1836 GLuint mask,
1837 GLenum transformType,
1838 const GLfloat *transformValues)
1839{
1840 const auto &pathObjects =
1841 GatherPaths(*mResourceManager, numPaths, pathNameType, paths, pathBase);
1842
1843 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1844 syncRendererState();
1845
1846 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
1847 transformValues);
1848}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001849
Sami Väisänend59ca052016-06-21 16:10:00 +03001850void Context::stencilStrokePathInstanced(GLsizei numPaths,
1851 GLenum pathNameType,
1852 const void *paths,
1853 GLuint pathBase,
1854 GLint reference,
1855 GLuint mask,
1856 GLenum transformType,
1857 const GLfloat *transformValues)
1858{
1859 const auto &pathObjects =
1860 GatherPaths(*mResourceManager, numPaths, pathNameType, paths, pathBase);
1861
1862 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1863 syncRendererState();
1864
1865 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
1866 transformValues);
1867}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001868
Sami Väisänend59ca052016-06-21 16:10:00 +03001869void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
1870 GLenum pathNameType,
1871 const void *paths,
1872 GLuint pathBase,
1873 GLenum fillMode,
1874 GLuint mask,
1875 GLenum coverMode,
1876 GLenum transformType,
1877 const GLfloat *transformValues)
1878{
1879 const auto &pathObjects =
1880 GatherPaths(*mResourceManager, numPaths, pathNameType, paths, pathBase);
1881
1882 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1883 syncRendererState();
1884
1885 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
1886 transformType, transformValues);
1887}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001888
Sami Väisänend59ca052016-06-21 16:10:00 +03001889void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
1890 GLenum pathNameType,
1891 const void *paths,
1892 GLuint pathBase,
1893 GLint reference,
1894 GLuint mask,
1895 GLenum coverMode,
1896 GLenum transformType,
1897 const GLfloat *transformValues)
1898{
1899 const auto &pathObjects =
1900 GatherPaths(*mResourceManager, numPaths, pathNameType, paths, pathBase);
1901
1902 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1903 syncRendererState();
1904
1905 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
1906 transformType, transformValues);
1907}
1908
Sami Väisänen46eaa942016-06-29 10:26:37 +03001909void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
1910{
1911 auto *programObject = getProgram(program);
1912
1913 programObject->bindFragmentInputLocation(location, name);
1914}
1915
1916void Context::programPathFragmentInputGen(GLuint program,
1917 GLint location,
1918 GLenum genMode,
1919 GLint components,
1920 const GLfloat *coeffs)
1921{
1922 auto *programObject = getProgram(program);
1923
1924 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
1925}
1926
Jamie Madill437fa652016-05-03 15:13:24 -04001927void Context::handleError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001928{
Geoff Langda5777c2014-07-11 09:52:58 -04001929 if (error.isError())
1930 {
1931 mErrors.insert(error.getCode());
Geoff Lang70d0f492015-12-10 17:45:46 -05001932
1933 if (!error.getMessage().empty())
1934 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001935 auto *debug = &mGLState.getDebug();
1936 debug->insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
1937 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
Geoff Lang70d0f492015-12-10 17:45:46 -05001938 }
Geoff Langda5777c2014-07-11 09:52:58 -04001939 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001940}
1941
1942// Get one of the recorded errors and clear its flag, if any.
1943// [OpenGL ES 2.0.24] section 2.5 page 13.
1944GLenum Context::getError()
1945{
Geoff Langda5777c2014-07-11 09:52:58 -04001946 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001947 {
Geoff Langda5777c2014-07-11 09:52:58 -04001948 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001949 }
Geoff Langda5777c2014-07-11 09:52:58 -04001950 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001951 {
Geoff Langda5777c2014-07-11 09:52:58 -04001952 GLenum error = *mErrors.begin();
1953 mErrors.erase(mErrors.begin());
1954 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001955 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001956}
1957
1958GLenum Context::getResetStatus()
1959{
Jamie Madill93e13fb2014-11-06 15:27:25 -05001960 //TODO(jmadill): needs MANGLE reworking
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00001961 if (mResetStatus == GL_NO_ERROR && !mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001962 {
daniel@transgaming.comf688c0d2012-10-31 17:52:57 +00001963 // mResetStatus will be set by the markContextLost callback
1964 // in the case a notification is sent
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001965 if (mImplementation->testDeviceLost())
Jamie Madill9dd0cf02014-11-24 11:38:51 -05001966 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001967 mImplementation->notifyDeviceLost();
Jamie Madill9dd0cf02014-11-24 11:38:51 -05001968 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001969 }
1970
1971 GLenum status = mResetStatus;
1972
1973 if (mResetStatus != GL_NO_ERROR)
1974 {
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00001975 ASSERT(mContextLost);
1976
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001977 if (mImplementation->testDeviceResettable())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001978 {
1979 mResetStatus = GL_NO_ERROR;
1980 }
1981 }
Jamie Madill893ab082014-05-16 16:56:10 -04001982
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001983 return status;
1984}
1985
1986bool Context::isResetNotificationEnabled()
1987{
1988 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
1989}
1990
Corentin Walleze3b10e82015-05-20 11:06:25 -04001991const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01001992{
Corentin Walleze3b10e82015-05-20 11:06:25 -04001993 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01001994}
1995
1996EGLenum Context::getClientType() const
1997{
1998 return mClientType;
1999}
2000
2001EGLenum Context::getRenderBuffer() const
2002{
Corentin Wallez37c39792015-08-20 14:19:46 -04002003 auto framebufferIt = mFramebufferMap.find(0);
2004 if (framebufferIt != mFramebufferMap.end())
2005 {
2006 const Framebuffer *framebuffer = framebufferIt->second;
2007 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(GL_BACK);
2008
2009 ASSERT(backAttachment != nullptr);
2010 return backAttachment->getSurface()->getRenderBuffer();
2011 }
2012 else
2013 {
2014 return EGL_NONE;
2015 }
Régis Fénéon83107972015-02-05 12:57:44 +01002016}
2017
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002018VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002019{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002020 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002021 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2022 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002023 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002024 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle, MAX_VERTEX_ATTRIBS);
2025
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002026 mVertexArrayMap[vertexArrayHandle] = vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002027 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002028
2029 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002030}
2031
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002032TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002033{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002034 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002035 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2036 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002037 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002038 transformFeedback =
2039 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002040 transformFeedback->addRef();
2041 mTransformFeedbackMap[transformFeedbackHandle] = transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002042 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002043
2044 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002045}
2046
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002047Framebuffer *Context::checkFramebufferAllocation(GLuint framebuffer)
2048{
2049 // Can be called from Bind without a prior call to Gen.
2050 auto framebufferIt = mFramebufferMap.find(framebuffer);
2051 bool neverCreated = framebufferIt == mFramebufferMap.end();
2052 if (neverCreated || framebufferIt->second == nullptr)
2053 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002054 Framebuffer *newFBO = new Framebuffer(mCaps, mImplementation.get(), framebuffer);
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002055 if (neverCreated)
2056 {
2057 mFramebufferHandleAllocator.reserve(framebuffer);
2058 mFramebufferMap[framebuffer] = newFBO;
2059 return newFBO;
2060 }
2061
2062 framebufferIt->second = newFBO;
2063 }
2064
2065 return framebufferIt->second;
2066}
2067
Geoff Lang36167ab2015-12-07 10:27:14 -05002068bool Context::isVertexArrayGenerated(GLuint vertexArray)
2069{
2070 return mVertexArrayMap.find(vertexArray) != mVertexArrayMap.end();
2071}
2072
2073bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2074{
2075 return mTransformFeedbackMap.find(transformFeedback) != mTransformFeedbackMap.end();
2076}
2077
Shannon Woods53a94a82014-06-24 15:20:36 -04002078void Context::detachTexture(GLuint texture)
2079{
2080 // Simple pass-through to State's detachTexture method, as textures do not require
2081 // allocation map management either here or in the resource manager at detach time.
2082 // Zero textures are held by the Context, and we don't attempt to request them from
2083 // the State.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002084 mGLState.detachTexture(mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002085}
2086
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002087void Context::detachBuffer(GLuint buffer)
2088{
Yuly Novikov5807a532015-12-03 13:01:22 -05002089 // Simple pass-through to State's detachBuffer method, since
2090 // only buffer attachments to container objects that are bound to the current context
2091 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002092
Yuly Novikov5807a532015-12-03 13:01:22 -05002093 // [OpenGL ES 3.2] section 5.1.2 page 45:
2094 // Attachments to unbound container objects, such as
2095 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2096 // are not affected and continue to act as references on the deleted object
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002097 mGLState.detachBuffer(buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002098}
2099
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002100void Context::detachFramebuffer(GLuint framebuffer)
2101{
Shannon Woods53a94a82014-06-24 15:20:36 -04002102 // Framebuffer detachment is handled by Context, because 0 is a valid
2103 // Framebuffer object, and a pointer to it must be passed from Context
2104 // to State at binding time.
2105
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002106 // [OpenGL ES 2.0.24] section 4.4 page 107:
2107 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though
2108 // BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero.
2109
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002110 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002111 {
2112 bindReadFramebuffer(0);
2113 }
2114
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002115 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002116 {
2117 bindDrawFramebuffer(0);
2118 }
2119}
2120
2121void Context::detachRenderbuffer(GLuint renderbuffer)
2122{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002123 mGLState.detachRenderbuffer(renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002124}
2125
Jamie Madill57a89722013-07-02 11:57:03 -04002126void Context::detachVertexArray(GLuint vertexArray)
2127{
Jamie Madill77a72f62015-04-14 11:18:32 -04002128 // Vertex array detachment is handled by Context, because 0 is a valid
2129 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002130 // binding time.
2131
Jamie Madill57a89722013-07-02 11:57:03 -04002132 // [OpenGL ES 3.0.2] section 2.10 page 43:
2133 // If a vertex array object that is currently bound is deleted, the binding
2134 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002135 if (mGLState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002136 {
2137 bindVertexArray(0);
2138 }
2139}
2140
Geoff Langc8058452014-02-03 12:04:11 -05002141void Context::detachTransformFeedback(GLuint transformFeedback)
2142{
Corentin Walleza2257da2016-04-19 16:43:12 -04002143 // Transform feedback detachment is handled by Context, because 0 is a valid
2144 // transform feedback, and a pointer to it must be passed from Context to State at
2145 // binding time.
2146
2147 // The OpenGL specification doesn't mention what should happen when the currently bound
2148 // transform feedback object is deleted. Since it is a container object, we treat it like
2149 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002150 if (mGLState.removeTransformFeedbackBinding(transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002151 {
2152 bindTransformFeedback(0);
2153 }
Geoff Langc8058452014-02-03 12:04:11 -05002154}
2155
Jamie Madilldc356042013-07-19 16:36:57 -04002156void Context::detachSampler(GLuint sampler)
2157{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002158 mGLState.detachSampler(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002159}
2160
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002161void Context::setVertexAttribDivisor(GLuint index, GLuint divisor)
2162{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002163 mGLState.setVertexAttribDivisor(index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002164}
2165
Jamie Madille29d1672013-07-19 16:36:57 -04002166void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2167{
Jamie Madill901b3792016-05-26 09:20:40 -04002168 mResourceManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille29d1672013-07-19 16:36:57 -04002169
2170 Sampler *samplerObject = getSampler(sampler);
2171 ASSERT(samplerObject);
2172
Geoff Lang69cce582015-09-17 13:20:36 -04002173 // clang-format off
Jamie Madille29d1672013-07-19 16:36:57 -04002174 switch (pname)
2175 {
Geoff Lang69cce582015-09-17 13:20:36 -04002176 case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(static_cast<GLenum>(param)); break;
2177 case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(static_cast<GLenum>(param)); break;
2178 case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(static_cast<GLenum>(param)); break;
2179 case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(static_cast<GLenum>(param)); break;
2180 case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(static_cast<GLenum>(param)); break;
2181 case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject->setMaxAnisotropy(std::min(static_cast<GLfloat>(param), getExtensions().maxTextureAnisotropy)); break;
2182 case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(static_cast<GLfloat>(param)); break;
2183 case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(static_cast<GLfloat>(param)); break;
2184 case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(static_cast<GLenum>(param)); break;
2185 case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(static_cast<GLenum>(param)); break;
2186 default: UNREACHABLE(); break;
Jamie Madille29d1672013-07-19 16:36:57 -04002187 }
Geoff Lang69cce582015-09-17 13:20:36 -04002188 // clang-format on
Jamie Madille29d1672013-07-19 16:36:57 -04002189}
2190
2191void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2192{
Jamie Madill901b3792016-05-26 09:20:40 -04002193 mResourceManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille29d1672013-07-19 16:36:57 -04002194
2195 Sampler *samplerObject = getSampler(sampler);
2196 ASSERT(samplerObject);
2197
Geoff Lang69cce582015-09-17 13:20:36 -04002198 // clang-format off
Jamie Madille29d1672013-07-19 16:36:57 -04002199 switch (pname)
2200 {
Geoff Lang69cce582015-09-17 13:20:36 -04002201 case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(uiround<GLenum>(param)); break;
2202 case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(uiround<GLenum>(param)); break;
2203 case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(uiround<GLenum>(param)); break;
2204 case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(uiround<GLenum>(param)); break;
2205 case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(uiround<GLenum>(param)); break;
2206 case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject->setMaxAnisotropy(std::min(param, getExtensions().maxTextureAnisotropy)); break;
2207 case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(param); break;
2208 case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(param); break;
2209 case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(uiround<GLenum>(param)); break;
2210 case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(uiround<GLenum>(param)); break;
2211 default: UNREACHABLE(); break;
Jamie Madille29d1672013-07-19 16:36:57 -04002212 }
Geoff Lang69cce582015-09-17 13:20:36 -04002213 // clang-format on
Jamie Madille29d1672013-07-19 16:36:57 -04002214}
2215
Jamie Madill9675b802013-07-19 16:36:59 -04002216GLint Context::getSamplerParameteri(GLuint sampler, GLenum pname)
2217{
Jamie Madill901b3792016-05-26 09:20:40 -04002218 mResourceManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madill9675b802013-07-19 16:36:59 -04002219
2220 Sampler *samplerObject = getSampler(sampler);
2221 ASSERT(samplerObject);
2222
Geoff Lang69cce582015-09-17 13:20:36 -04002223 // clang-format off
Jamie Madill9675b802013-07-19 16:36:59 -04002224 switch (pname)
2225 {
Geoff Lang69cce582015-09-17 13:20:36 -04002226 case GL_TEXTURE_MIN_FILTER: return static_cast<GLint>(samplerObject->getMinFilter());
2227 case GL_TEXTURE_MAG_FILTER: return static_cast<GLint>(samplerObject->getMagFilter());
2228 case GL_TEXTURE_WRAP_S: return static_cast<GLint>(samplerObject->getWrapS());
2229 case GL_TEXTURE_WRAP_T: return static_cast<GLint>(samplerObject->getWrapT());
2230 case GL_TEXTURE_WRAP_R: return static_cast<GLint>(samplerObject->getWrapR());
2231 case GL_TEXTURE_MAX_ANISOTROPY_EXT: return static_cast<GLint>(samplerObject->getMaxAnisotropy());
Olli Etuaho6ad07232016-03-03 17:15:49 +02002232 case GL_TEXTURE_MIN_LOD: return iround<GLint>(samplerObject->getMinLod());
2233 case GL_TEXTURE_MAX_LOD: return iround<GLint>(samplerObject->getMaxLod());
Geoff Lang69cce582015-09-17 13:20:36 -04002234 case GL_TEXTURE_COMPARE_MODE: return static_cast<GLint>(samplerObject->getCompareMode());
2235 case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLint>(samplerObject->getCompareFunc());
2236 default: UNREACHABLE(); return 0;
Jamie Madill9675b802013-07-19 16:36:59 -04002237 }
Geoff Lang69cce582015-09-17 13:20:36 -04002238 // clang-format on
Jamie Madill9675b802013-07-19 16:36:59 -04002239}
2240
2241GLfloat Context::getSamplerParameterf(GLuint sampler, GLenum pname)
2242{
Jamie Madill901b3792016-05-26 09:20:40 -04002243 mResourceManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madill9675b802013-07-19 16:36:59 -04002244
2245 Sampler *samplerObject = getSampler(sampler);
2246 ASSERT(samplerObject);
2247
Geoff Lang69cce582015-09-17 13:20:36 -04002248 // clang-format off
Jamie Madill9675b802013-07-19 16:36:59 -04002249 switch (pname)
2250 {
Geoff Lang69cce582015-09-17 13:20:36 -04002251 case GL_TEXTURE_MIN_FILTER: return static_cast<GLfloat>(samplerObject->getMinFilter());
2252 case GL_TEXTURE_MAG_FILTER: return static_cast<GLfloat>(samplerObject->getMagFilter());
2253 case GL_TEXTURE_WRAP_S: return static_cast<GLfloat>(samplerObject->getWrapS());
2254 case GL_TEXTURE_WRAP_T: return static_cast<GLfloat>(samplerObject->getWrapT());
2255 case GL_TEXTURE_WRAP_R: return static_cast<GLfloat>(samplerObject->getWrapR());
2256 case GL_TEXTURE_MAX_ANISOTROPY_EXT: return samplerObject->getMaxAnisotropy();
2257 case GL_TEXTURE_MIN_LOD: return samplerObject->getMinLod();
2258 case GL_TEXTURE_MAX_LOD: return samplerObject->getMaxLod();
2259 case GL_TEXTURE_COMPARE_MODE: return static_cast<GLfloat>(samplerObject->getCompareMode());
2260 case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLfloat>(samplerObject->getCompareFunc());
2261 default: UNREACHABLE(); return 0;
Jamie Madill9675b802013-07-19 16:36:59 -04002262 }
Geoff Lang69cce582015-09-17 13:20:36 -04002263 // clang-format on
Jamie Madill9675b802013-07-19 16:36:59 -04002264}
2265
Olli Etuahof0fee072016-03-30 15:11:58 +03002266void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2267{
2268 gl::Program *programObject = getProgram(program);
2269 ASSERT(programObject != nullptr);
2270
2271 ASSERT(pname == GL_PROGRAM_BINARY_RETRIEVABLE_HINT);
2272 programObject->setBinaryRetrievableHint(value != GL_FALSE);
2273}
2274
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002275void Context::initRendererString()
2276{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002277 std::ostringstream rendererString;
2278 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002279 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002280 rendererString << ")";
2281
Geoff Langcec35902014-04-16 10:52:36 -04002282 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002283}
2284
Geoff Langc0b9ef42014-07-02 10:02:37 -04002285const std::string &Context::getRendererString() const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002286{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002287 return mRendererString;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002288}
2289
Geoff Langcec35902014-04-16 10:52:36 -04002290void Context::initExtensionStrings()
2291{
Geoff Lang493daf52014-07-03 13:38:44 -04002292 mExtensionStrings = mExtensions.getStrings();
Geoff Langcec35902014-04-16 10:52:36 -04002293
Geoff Langc0b9ef42014-07-02 10:02:37 -04002294 std::ostringstream combinedStringStream;
2295 std::copy(mExtensionStrings.begin(), mExtensionStrings.end(), std::ostream_iterator<std::string>(combinedStringStream, " "));
2296 mExtensionString = combinedStringStream.str();
Geoff Langcec35902014-04-16 10:52:36 -04002297}
2298
Geoff Langc0b9ef42014-07-02 10:02:37 -04002299const std::string &Context::getExtensionString() const
Geoff Langcec35902014-04-16 10:52:36 -04002300{
2301 return mExtensionString;
2302}
2303
Geoff Langc0b9ef42014-07-02 10:02:37 -04002304const std::string &Context::getExtensionString(size_t idx) const
Geoff Langcec35902014-04-16 10:52:36 -04002305{
2306 return mExtensionStrings[idx];
2307}
2308
2309size_t Context::getExtensionStringCount() const
2310{
2311 return mExtensionStrings.size();
2312}
2313
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002314void Context::beginTransformFeedback(GLenum primitiveMode)
2315{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002316 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002317 ASSERT(transformFeedback != nullptr);
2318 ASSERT(!transformFeedback->isPaused());
2319
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002320 transformFeedback->begin(primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002321}
2322
2323bool Context::hasActiveTransformFeedback(GLuint program) const
2324{
2325 for (auto pair : mTransformFeedbackMap)
2326 {
2327 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
2328 {
2329 return true;
2330 }
2331 }
2332 return false;
2333}
2334
Jamie Madill00ed7a12016-05-19 13:13:38 -04002335void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04002336{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002337 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04002338
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002339 mExtensions = mImplementation->getNativeExtensions();
Geoff Lang493daf52014-07-03 13:38:44 -04002340
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002341 mLimitations = mImplementation->getNativeLimitations();
Austin Kinross02df7962015-07-01 10:03:42 -07002342
Martin Radev1be913c2016-07-11 17:59:16 +03002343 if (mClientMajorVersion < 3)
Geoff Lang493daf52014-07-03 13:38:44 -04002344 {
2345 // Disable ES3+ extensions
2346 mExtensions.colorBufferFloat = false;
Geoff Langb66a9092016-05-16 15:59:14 -04002347 mExtensions.eglImageExternalEssl3 = false;
Vincent Lang25ab4512016-05-13 18:13:59 +02002348 mExtensions.textureNorm16 = false;
Geoff Lang493daf52014-07-03 13:38:44 -04002349 }
2350
Martin Radev1be913c2016-07-11 17:59:16 +03002351 if (mClientMajorVersion > 2)
Geoff Lang493daf52014-07-03 13:38:44 -04002352 {
2353 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
2354 //mExtensions.sRGB = false;
2355 }
2356
Jamie Madill00ed7a12016-05-19 13:13:38 -04002357 // Some extensions are always available because they are implemented in the GL layer.
2358 mExtensions.bindUniformLocation = true;
2359 mExtensions.vertexArrayObject = true;
2360
2361 // Enable the no error extension if the context was created with the flag.
2362 mExtensions.noError = mSkipValidation;
2363
Geoff Lang70d0f492015-12-10 17:45:46 -05002364 // Explicitly enable GL_KHR_debug
2365 mExtensions.debug = true;
2366 mExtensions.maxDebugMessageLength = 1024;
2367 mExtensions.maxDebugLoggedMessages = 1024;
2368 mExtensions.maxDebugGroupStackDepth = 1024;
2369 mExtensions.maxLabelLength = 1024;
2370
Geoff Lang301d1612014-07-09 10:34:37 -04002371 // Apply implementation limits
2372 mCaps.maxVertexAttributes = std::min<GLuint>(mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Geoff Lang301d1612014-07-09 10:34:37 -04002373 mCaps.maxVertexUniformBlocks = std::min<GLuint>(mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
2374 mCaps.maxVertexOutputComponents = std::min<GLuint>(mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2375
2376 mCaps.maxFragmentInputComponents = std::min<GLuint>(mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
Geoff Lang3a61c322014-07-10 13:01:54 -04002377
Geoff Lang900013c2014-07-07 11:32:19 -04002378 mCaps.compressedTextureFormats.clear();
2379
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002380 const TextureCapsMap &rendererFormats = mImplementation->getNativeTextureCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04002381 for (TextureCapsMap::const_iterator i = rendererFormats.begin(); i != rendererFormats.end(); i++)
2382 {
2383 GLenum format = i->first;
2384 TextureCaps formatCaps = i->second;
2385
Geoff Lang5d601382014-07-22 15:14:06 -04002386 const InternalFormat &formatInfo = GetInternalFormatInfo(format);
Geoff Langd87878e2014-09-19 15:42:59 -04002387
Geoff Lang0d8b7242015-09-09 14:56:53 -04002388 // Update the format caps based on the client version and extensions.
2389 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
2390 // ES3.
2391 formatCaps.texturable =
Martin Radev1be913c2016-07-11 17:59:16 +03002392 formatCaps.texturable && formatInfo.textureSupport(mClientMajorVersion, mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002393 formatCaps.renderable =
Martin Radev1be913c2016-07-11 17:59:16 +03002394 formatCaps.renderable && formatInfo.renderSupport(mClientMajorVersion, mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002395 formatCaps.filterable =
Martin Radev1be913c2016-07-11 17:59:16 +03002396 formatCaps.filterable && formatInfo.filterSupport(mClientMajorVersion, mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04002397
2398 // OpenGL ES does not support multisampling with integer formats
2399 if (!formatInfo.renderSupport || formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)
Geoff Lang493daf52014-07-03 13:38:44 -04002400 {
Geoff Langd87878e2014-09-19 15:42:59 -04002401 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04002402 }
Geoff Langd87878e2014-09-19 15:42:59 -04002403
2404 if (formatCaps.texturable && formatInfo.compressed)
2405 {
2406 mCaps.compressedTextureFormats.push_back(format);
2407 }
2408
2409 mTextureCaps.insert(format, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04002410 }
2411}
2412
Jamie Madill1b94d432015-08-07 13:23:23 -04002413void Context::syncRendererState()
2414{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002415 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
2416 mImplementation->syncState(mGLState, dirtyBits);
2417 mGLState.clearDirtyBits();
2418 mGLState.syncDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -04002419}
2420
Jamie Madillad9f24e2016-02-12 09:27:24 -05002421void Context::syncRendererState(const State::DirtyBits &bitMask,
2422 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04002423{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002424 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
2425 mImplementation->syncState(mGLState, dirtyBits);
2426 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002427
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002428 mGLState.syncDirtyObjects(objectMask);
Jamie Madill1b94d432015-08-07 13:23:23 -04002429}
Jamie Madillc29968b2016-01-20 11:17:23 -05002430
2431void Context::blitFramebuffer(GLint srcX0,
2432 GLint srcY0,
2433 GLint srcX1,
2434 GLint srcY1,
2435 GLint dstX0,
2436 GLint dstY0,
2437 GLint dstX1,
2438 GLint dstY1,
2439 GLbitfield mask,
2440 GLenum filter)
2441{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002442 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002443 ASSERT(drawFramebuffer);
2444
2445 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
2446 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
2447
Jamie Madillad9f24e2016-02-12 09:27:24 -05002448 syncStateForBlit();
Jamie Madillc29968b2016-01-20 11:17:23 -05002449
Jamie Madill8415b5f2016-04-26 13:41:39 -04002450 handleError(drawFramebuffer->blit(mImplementation.get(), srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002451}
Jamie Madillc29968b2016-01-20 11:17:23 -05002452
2453void Context::clear(GLbitfield mask)
2454{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002455 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002456 handleError(mGLState.getDrawFramebuffer()->clear(mImplementation.get(), mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05002457}
2458
2459void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
2460{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002461 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002462 handleError(mGLState.getDrawFramebuffer()->clearBufferfv(mImplementation.get(), buffer,
2463 drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002464}
2465
2466void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
2467{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002468 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002469 handleError(mGLState.getDrawFramebuffer()->clearBufferuiv(mImplementation.get(), buffer,
2470 drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002471}
2472
2473void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
2474{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002475 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002476 handleError(mGLState.getDrawFramebuffer()->clearBufferiv(mImplementation.get(), buffer,
2477 drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002478}
2479
2480void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
2481{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002482 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002483 ASSERT(framebufferObject);
2484
2485 // If a buffer is not present, the clear has no effect
2486 if (framebufferObject->getDepthbuffer() == nullptr &&
2487 framebufferObject->getStencilbuffer() == nullptr)
2488 {
2489 return;
2490 }
2491
Jamie Madillad9f24e2016-02-12 09:27:24 -05002492 syncStateForClear();
Jamie Madill8415b5f2016-04-26 13:41:39 -04002493 handleError(framebufferObject->clearBufferfi(mImplementation.get(), buffer, drawbuffer, depth,
2494 stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05002495}
2496
2497void Context::readPixels(GLint x,
2498 GLint y,
2499 GLsizei width,
2500 GLsizei height,
2501 GLenum format,
2502 GLenum type,
2503 GLvoid *pixels)
2504{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002505 syncStateForReadPixels();
Jamie Madillc29968b2016-01-20 11:17:23 -05002506
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002507 Framebuffer *framebufferObject = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002508 ASSERT(framebufferObject);
2509
2510 Rectangle area(x, y, width, height);
Jamie Madill8415b5f2016-04-26 13:41:39 -04002511 handleError(framebufferObject->readPixels(mImplementation.get(), area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05002512}
2513
2514void Context::copyTexImage2D(GLenum target,
2515 GLint level,
2516 GLenum internalformat,
2517 GLint x,
2518 GLint y,
2519 GLsizei width,
2520 GLsizei height,
2521 GLint border)
2522{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002523 // Only sync the read FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002524 mGLState.syncDirtyObject(GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002525
Jamie Madillc29968b2016-01-20 11:17:23 -05002526 Rectangle sourceArea(x, y, width, height);
2527
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002528 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002529 Texture *texture =
2530 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill437fa652016-05-03 15:13:24 -04002531 handleError(texture->copyImage(target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002532}
2533
2534void Context::copyTexSubImage2D(GLenum target,
2535 GLint level,
2536 GLint xoffset,
2537 GLint yoffset,
2538 GLint x,
2539 GLint y,
2540 GLsizei width,
2541 GLsizei height)
2542{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002543 // Only sync the read FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002544 mGLState.syncDirtyObject(GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002545
Jamie Madillc29968b2016-01-20 11:17:23 -05002546 Offset destOffset(xoffset, yoffset, 0);
2547 Rectangle sourceArea(x, y, width, height);
2548
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002549 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002550 Texture *texture =
2551 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill437fa652016-05-03 15:13:24 -04002552 handleError(texture->copySubImage(target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002553}
2554
2555void Context::copyTexSubImage3D(GLenum target,
2556 GLint level,
2557 GLint xoffset,
2558 GLint yoffset,
2559 GLint zoffset,
2560 GLint x,
2561 GLint y,
2562 GLsizei width,
2563 GLsizei height)
2564{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002565 // Only sync the read FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002566 mGLState.syncDirtyObject(GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002567
Jamie Madillc29968b2016-01-20 11:17:23 -05002568 Offset destOffset(xoffset, yoffset, zoffset);
2569 Rectangle sourceArea(x, y, width, height);
2570
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002571 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002572 Texture *texture = getTargetTexture(target);
Jamie Madill437fa652016-05-03 15:13:24 -04002573 handleError(texture->copySubImage(target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002574}
2575
2576void Context::framebufferTexture2D(GLenum target,
2577 GLenum attachment,
2578 GLenum textarget,
2579 GLuint texture,
2580 GLint level)
2581{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002582 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002583 ASSERT(framebuffer);
2584
2585 if (texture != 0)
2586 {
2587 Texture *textureObj = getTexture(texture);
2588
2589 ImageIndex index = ImageIndex::MakeInvalid();
2590
2591 if (textarget == GL_TEXTURE_2D)
2592 {
2593 index = ImageIndex::Make2D(level);
2594 }
2595 else
2596 {
2597 ASSERT(IsCubeMapTextureTarget(textarget));
2598 index = ImageIndex::MakeCube(textarget, level);
2599 }
2600
2601 framebuffer->setAttachment(GL_TEXTURE, attachment, index, textureObj);
2602 }
2603 else
2604 {
2605 framebuffer->resetAttachment(attachment);
2606 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002607
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002608 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002609}
2610
2611void Context::framebufferRenderbuffer(GLenum target,
2612 GLenum attachment,
2613 GLenum renderbuffertarget,
2614 GLuint renderbuffer)
2615{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002616 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002617 ASSERT(framebuffer);
2618
2619 if (renderbuffer != 0)
2620 {
2621 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
2622 framebuffer->setAttachment(GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
2623 renderbufferObject);
2624 }
2625 else
2626 {
2627 framebuffer->resetAttachment(attachment);
2628 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002629
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002630 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002631}
2632
2633void Context::framebufferTextureLayer(GLenum target,
2634 GLenum attachment,
2635 GLuint texture,
2636 GLint level,
2637 GLint layer)
2638{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002639 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002640 ASSERT(framebuffer);
2641
2642 if (texture != 0)
2643 {
2644 Texture *textureObject = getTexture(texture);
2645
2646 ImageIndex index = ImageIndex::MakeInvalid();
2647
2648 if (textureObject->getTarget() == GL_TEXTURE_3D)
2649 {
2650 index = ImageIndex::Make3D(level, layer);
2651 }
2652 else
2653 {
2654 ASSERT(textureObject->getTarget() == GL_TEXTURE_2D_ARRAY);
2655 index = ImageIndex::Make2DArray(level, layer);
2656 }
2657
2658 framebuffer->setAttachment(GL_TEXTURE, attachment, index, textureObject);
2659 }
2660 else
2661 {
2662 framebuffer->resetAttachment(attachment);
2663 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002664
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002665 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002666}
2667
2668void Context::drawBuffers(GLsizei n, const GLenum *bufs)
2669{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002670 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002671 ASSERT(framebuffer);
2672 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002673 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05002674}
2675
2676void Context::readBuffer(GLenum mode)
2677{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002678 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002679 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002680 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05002681}
2682
2683void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
2684{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002685 // Only sync the FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002686 mGLState.syncDirtyObject(target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002687
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002688 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002689 ASSERT(framebuffer);
2690
2691 // The specification isn't clear what should be done when the framebuffer isn't complete.
2692 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill437fa652016-05-03 15:13:24 -04002693 handleError(framebuffer->discard(numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05002694}
2695
2696void Context::invalidateFramebuffer(GLenum target,
2697 GLsizei numAttachments,
2698 const GLenum *attachments)
2699{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002700 // Only sync the FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002701 mGLState.syncDirtyObject(target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002702
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002703 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002704 ASSERT(framebuffer);
2705
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002706 if (framebuffer->checkStatus(mState) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05002707 {
Jamie Madill437fa652016-05-03 15:13:24 -04002708 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05002709 }
Jamie Madill437fa652016-05-03 15:13:24 -04002710
2711 handleError(framebuffer->invalidate(numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05002712}
2713
2714void Context::invalidateSubFramebuffer(GLenum target,
2715 GLsizei numAttachments,
2716 const GLenum *attachments,
2717 GLint x,
2718 GLint y,
2719 GLsizei width,
2720 GLsizei height)
2721{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002722 // Only sync the FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002723 mGLState.syncDirtyObject(target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002724
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002725 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002726 ASSERT(framebuffer);
2727
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002728 if (framebuffer->checkStatus(mState) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05002729 {
Jamie Madill437fa652016-05-03 15:13:24 -04002730 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05002731 }
Jamie Madill437fa652016-05-03 15:13:24 -04002732
2733 Rectangle area(x, y, width, height);
2734 handleError(framebuffer->invalidateSub(numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05002735}
2736
Jamie Madill73a84962016-02-12 09:27:23 -05002737void Context::texImage2D(GLenum target,
2738 GLint level,
2739 GLint internalformat,
2740 GLsizei width,
2741 GLsizei height,
2742 GLint border,
2743 GLenum format,
2744 GLenum type,
2745 const GLvoid *pixels)
2746{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002747 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002748
2749 Extents size(width, height, 1);
2750 Texture *texture =
2751 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002752 handleError(texture->setImage(mGLState.getUnpackState(), target, level, internalformat, size,
Jamie Madill437fa652016-05-03 15:13:24 -04002753 format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05002754}
2755
2756void Context::texImage3D(GLenum target,
2757 GLint level,
2758 GLint internalformat,
2759 GLsizei width,
2760 GLsizei height,
2761 GLsizei depth,
2762 GLint border,
2763 GLenum format,
2764 GLenum type,
2765 const GLvoid *pixels)
2766{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002767 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002768
2769 Extents size(width, height, depth);
2770 Texture *texture = getTargetTexture(target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002771 handleError(texture->setImage(mGLState.getUnpackState(), target, level, internalformat, size,
Jamie Madill437fa652016-05-03 15:13:24 -04002772 format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05002773}
2774
2775void Context::texSubImage2D(GLenum target,
2776 GLint level,
2777 GLint xoffset,
2778 GLint yoffset,
2779 GLsizei width,
2780 GLsizei height,
2781 GLenum format,
2782 GLenum type,
2783 const GLvoid *pixels)
2784{
2785 // Zero sized uploads are valid but no-ops
2786 if (width == 0 || height == 0)
2787 {
2788 return;
2789 }
2790
Jamie Madillad9f24e2016-02-12 09:27:24 -05002791 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002792
2793 Box area(xoffset, yoffset, 0, width, height, 1);
2794 Texture *texture =
2795 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002796 handleError(texture->setSubImage(mGLState.getUnpackState(), target, level, area, format, type,
Jamie Madill437fa652016-05-03 15:13:24 -04002797 reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05002798}
2799
2800void Context::texSubImage3D(GLenum target,
2801 GLint level,
2802 GLint xoffset,
2803 GLint yoffset,
2804 GLint zoffset,
2805 GLsizei width,
2806 GLsizei height,
2807 GLsizei depth,
2808 GLenum format,
2809 GLenum type,
2810 const GLvoid *pixels)
2811{
2812 // Zero sized uploads are valid but no-ops
2813 if (width == 0 || height == 0 || depth == 0)
2814 {
2815 return;
2816 }
2817
Jamie Madillad9f24e2016-02-12 09:27:24 -05002818 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002819
2820 Box area(xoffset, yoffset, zoffset, width, height, depth);
2821 Texture *texture = getTargetTexture(target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002822 handleError(texture->setSubImage(mGLState.getUnpackState(), target, level, area, format, type,
Jamie Madill437fa652016-05-03 15:13:24 -04002823 reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05002824}
2825
2826void Context::compressedTexImage2D(GLenum target,
2827 GLint level,
2828 GLenum internalformat,
2829 GLsizei width,
2830 GLsizei height,
2831 GLint border,
2832 GLsizei imageSize,
2833 const GLvoid *data)
2834{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002835 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002836
2837 Extents size(width, height, 1);
2838 Texture *texture =
2839 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002840 handleError(texture->setCompressedImage(mGLState.getUnpackState(), target, level,
2841 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04002842 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05002843}
2844
2845void Context::compressedTexImage3D(GLenum target,
2846 GLint level,
2847 GLenum internalformat,
2848 GLsizei width,
2849 GLsizei height,
2850 GLsizei depth,
2851 GLint border,
2852 GLsizei imageSize,
2853 const GLvoid *data)
2854{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002855 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002856
2857 Extents size(width, height, depth);
2858 Texture *texture = getTargetTexture(target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002859 handleError(texture->setCompressedImage(mGLState.getUnpackState(), target, level,
2860 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04002861 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05002862}
2863
2864void Context::compressedTexSubImage2D(GLenum target,
2865 GLint level,
2866 GLint xoffset,
2867 GLint yoffset,
2868 GLsizei width,
2869 GLsizei height,
2870 GLenum format,
2871 GLsizei imageSize,
2872 const GLvoid *data)
2873{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002874 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002875
2876 Box area(xoffset, yoffset, 0, width, height, 1);
2877 Texture *texture =
2878 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002879 handleError(texture->setCompressedSubImage(mGLState.getUnpackState(), target, level, area,
2880 format, imageSize,
2881 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05002882}
2883
2884void Context::compressedTexSubImage3D(GLenum target,
2885 GLint level,
2886 GLint xoffset,
2887 GLint yoffset,
2888 GLint zoffset,
2889 GLsizei width,
2890 GLsizei height,
2891 GLsizei depth,
2892 GLenum format,
2893 GLsizei imageSize,
2894 const GLvoid *data)
2895{
2896 // Zero sized uploads are valid but no-ops
2897 if (width == 0 || height == 0)
2898 {
2899 return;
2900 }
2901
Jamie Madillad9f24e2016-02-12 09:27:24 -05002902 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002903
2904 Box area(xoffset, yoffset, zoffset, width, height, depth);
2905 Texture *texture = getTargetTexture(target);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002906 handleError(texture->setCompressedSubImage(mGLState.getUnpackState(), target, level, area,
2907 format, imageSize,
2908 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05002909}
2910
Olli Etuaho0f2b1562016-05-13 16:15:35 +03002911void Context::generateMipmap(GLenum target)
2912{
2913 Texture *texture = getTargetTexture(target);
2914 handleError(texture->generateMipmap());
2915}
2916
Geoff Lang97073d12016-04-20 10:42:34 -07002917void Context::copyTextureCHROMIUM(GLuint sourceId,
2918 GLuint destId,
2919 GLint internalFormat,
2920 GLenum destType,
2921 GLboolean unpackFlipY,
2922 GLboolean unpackPremultiplyAlpha,
2923 GLboolean unpackUnmultiplyAlpha)
2924{
2925 syncStateForTexImage();
2926
2927 gl::Texture *sourceTexture = getTexture(sourceId);
2928 gl::Texture *destTexture = getTexture(destId);
2929 handleError(destTexture->copyTexture(internalFormat, destType, unpackFlipY == GL_TRUE,
2930 unpackPremultiplyAlpha == GL_TRUE,
2931 unpackUnmultiplyAlpha == GL_TRUE, sourceTexture));
2932}
2933
2934void Context::copySubTextureCHROMIUM(GLuint sourceId,
2935 GLuint destId,
2936 GLint xoffset,
2937 GLint yoffset,
2938 GLint x,
2939 GLint y,
2940 GLsizei width,
2941 GLsizei height,
2942 GLboolean unpackFlipY,
2943 GLboolean unpackPremultiplyAlpha,
2944 GLboolean unpackUnmultiplyAlpha)
2945{
2946 // Zero sized copies are valid but no-ops
2947 if (width == 0 || height == 0)
2948 {
2949 return;
2950 }
2951
2952 syncStateForTexImage();
2953
2954 gl::Texture *sourceTexture = getTexture(sourceId);
2955 gl::Texture *destTexture = getTexture(destId);
2956 Offset offset(xoffset, yoffset, 0);
2957 Rectangle area(x, y, width, height);
2958 handleError(destTexture->copySubTexture(offset, area, unpackFlipY == GL_TRUE,
2959 unpackPremultiplyAlpha == GL_TRUE,
2960 unpackUnmultiplyAlpha == GL_TRUE, sourceTexture));
2961}
2962
Olli Etuaho4f667482016-03-30 15:56:35 +03002963void Context::getBufferPointerv(GLenum target, GLenum /*pname*/, void **params)
2964{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002965 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03002966 ASSERT(buffer);
2967
2968 if (!buffer->isMapped())
2969 {
2970 *params = nullptr;
2971 }
2972 else
2973 {
2974 *params = buffer->getMapPointer();
2975 }
2976}
2977
2978GLvoid *Context::mapBuffer(GLenum target, GLenum access)
2979{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002980 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03002981 ASSERT(buffer);
2982
2983 Error error = buffer->map(access);
2984 if (error.isError())
2985 {
Jamie Madill437fa652016-05-03 15:13:24 -04002986 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03002987 return nullptr;
2988 }
2989
2990 return buffer->getMapPointer();
2991}
2992
2993GLboolean Context::unmapBuffer(GLenum target)
2994{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002995 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03002996 ASSERT(buffer);
2997
2998 GLboolean result;
2999 Error error = buffer->unmap(&result);
3000 if (error.isError())
3001 {
Jamie Madill437fa652016-05-03 15:13:24 -04003002 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003003 return GL_FALSE;
3004 }
3005
3006 return result;
3007}
3008
3009GLvoid *Context::mapBufferRange(GLenum target,
3010 GLintptr offset,
3011 GLsizeiptr length,
3012 GLbitfield access)
3013{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003014 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003015 ASSERT(buffer);
3016
3017 Error error = buffer->mapRange(offset, length, access);
3018 if (error.isError())
3019 {
Jamie Madill437fa652016-05-03 15:13:24 -04003020 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003021 return nullptr;
3022 }
3023
3024 return buffer->getMapPointer();
3025}
3026
3027void Context::flushMappedBufferRange(GLenum /*target*/, GLintptr /*offset*/, GLsizeiptr /*length*/)
3028{
3029 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
3030}
3031
Jamie Madillad9f24e2016-02-12 09:27:24 -05003032void Context::syncStateForReadPixels()
3033{
3034 syncRendererState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
3035}
3036
3037void Context::syncStateForTexImage()
3038{
3039 syncRendererState(mTexImageDirtyBits, mTexImageDirtyObjects);
3040}
3041
3042void Context::syncStateForClear()
3043{
3044 syncRendererState(mClearDirtyBits, mClearDirtyObjects);
3045}
3046
3047void Context::syncStateForBlit()
3048{
3049 syncRendererState(mBlitDirtyBits, mBlitDirtyObjects);
3050}
3051
Jamie Madillc20ab272016-06-09 07:20:46 -07003052void Context::activeTexture(GLenum texture)
3053{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003054 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003055}
3056
3057void Context::blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
3058{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003059 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003060}
3061
3062void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
3063{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003064 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003065}
3066
3067void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
3068{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003069 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003070}
3071
3072void Context::clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
3073{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003074 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003075}
3076
3077void Context::clearDepthf(GLclampf depth)
3078{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003079 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07003080}
3081
3082void Context::clearStencil(GLint s)
3083{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003084 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07003085}
3086
3087void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
3088{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003089 mGLState.setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
Jamie Madillc20ab272016-06-09 07:20:46 -07003090}
3091
3092void Context::cullFace(GLenum mode)
3093{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003094 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003095}
3096
3097void Context::depthFunc(GLenum func)
3098{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003099 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07003100}
3101
3102void Context::depthMask(GLboolean flag)
3103{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003104 mGLState.setDepthMask(flag != GL_FALSE);
Jamie Madillc20ab272016-06-09 07:20:46 -07003105}
3106
3107void Context::depthRangef(GLclampf zNear, GLclampf zFar)
3108{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003109 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07003110}
3111
3112void Context::disable(GLenum cap)
3113{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003114 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003115}
3116
3117void Context::disableVertexAttribArray(GLuint index)
3118{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003119 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003120}
3121
3122void Context::enable(GLenum cap)
3123{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003124 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003125}
3126
3127void Context::enableVertexAttribArray(GLuint index)
3128{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003129 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003130}
3131
3132void Context::frontFace(GLenum mode)
3133{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003134 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003135}
3136
3137void Context::hint(GLenum target, GLenum mode)
3138{
3139 switch (target)
3140 {
3141 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003142 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003143 break;
3144
3145 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003146 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003147 break;
3148
3149 default:
3150 UNREACHABLE();
3151 return;
3152 }
3153}
3154
3155void Context::lineWidth(GLfloat width)
3156{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003157 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07003158}
3159
3160void Context::pixelStorei(GLenum pname, GLint param)
3161{
3162 switch (pname)
3163 {
3164 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003165 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003166 break;
3167
3168 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003169 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003170 break;
3171
3172 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003173 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003174 break;
3175
3176 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003177 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003178 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003179 break;
3180
3181 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03003182 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003183 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003184 break;
3185
3186 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03003187 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003188 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003189 break;
3190
3191 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003192 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003193 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003194 break;
3195
3196 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003197 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003198 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003199 break;
3200
3201 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003202 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003203 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003204 break;
3205
3206 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003207 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003208 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003209 break;
3210
3211 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003212 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003213 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003214 break;
3215
3216 default:
3217 UNREACHABLE();
3218 return;
3219 }
3220}
3221
3222void Context::polygonOffset(GLfloat factor, GLfloat units)
3223{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003224 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07003225}
3226
3227void Context::sampleCoverage(GLclampf value, GLboolean invert)
3228{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003229 mGLState.setSampleCoverageParams(clamp01(value), invert == GL_TRUE);
Jamie Madillc20ab272016-06-09 07:20:46 -07003230}
3231
3232void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
3233{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003234 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003235}
3236
3237void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3238{
3239 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3240 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003241 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003242 }
3243
3244 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3245 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003246 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003247 }
3248}
3249
3250void Context::stencilMaskSeparate(GLenum face, GLuint mask)
3251{
3252 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3253 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003254 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003255 }
3256
3257 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3258 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003259 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003260 }
3261}
3262
3263void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3264{
3265 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3266 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003267 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003268 }
3269
3270 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3271 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003272 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003273 }
3274}
3275
3276void Context::vertexAttrib1f(GLuint index, GLfloat x)
3277{
3278 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003279 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003280}
3281
3282void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
3283{
3284 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003285 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003286}
3287
3288void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
3289{
3290 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003291 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003292}
3293
3294void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
3295{
3296 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003297 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003298}
3299
3300void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
3301{
3302 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003303 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003304}
3305
3306void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
3307{
3308 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003309 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003310}
3311
3312void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3313{
3314 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003315 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003316}
3317
3318void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
3319{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003320 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07003321}
3322
3323void Context::vertexAttribPointer(GLuint index,
3324 GLint size,
3325 GLenum type,
3326 GLboolean normalized,
3327 GLsizei stride,
3328 const GLvoid *ptr)
3329{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003330 mGLState.setVertexAttribState(index, mGLState.getTargetBuffer(GL_ARRAY_BUFFER), size, type,
3331 normalized == GL_TRUE, false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07003332}
3333
3334void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
3335{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003336 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003337}
3338
3339void Context::vertexAttribIPointer(GLuint index,
3340 GLint size,
3341 GLenum type,
3342 GLsizei stride,
3343 const GLvoid *pointer)
3344{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003345 mGLState.setVertexAttribState(index, mGLState.getTargetBuffer(GL_ARRAY_BUFFER), size, type,
3346 false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07003347}
3348
3349void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
3350{
3351 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003352 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003353}
3354
3355void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
3356{
3357 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003358 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003359}
3360
3361void Context::vertexAttribI4iv(GLuint index, const GLint *v)
3362{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003363 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003364}
3365
3366void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
3367{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003368 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003369}
3370
3371void Context::debugMessageControl(GLenum source,
3372 GLenum type,
3373 GLenum severity,
3374 GLsizei count,
3375 const GLuint *ids,
3376 GLboolean enabled)
3377{
3378 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003379 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
3380 (enabled != GL_FALSE));
Jamie Madillc20ab272016-06-09 07:20:46 -07003381}
3382
3383void Context::debugMessageInsert(GLenum source,
3384 GLenum type,
3385 GLuint id,
3386 GLenum severity,
3387 GLsizei length,
3388 const GLchar *buf)
3389{
3390 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003391 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07003392}
3393
3394void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
3395{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003396 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07003397}
3398
3399GLuint Context::getDebugMessageLog(GLuint count,
3400 GLsizei bufSize,
3401 GLenum *sources,
3402 GLenum *types,
3403 GLuint *ids,
3404 GLenum *severities,
3405 GLsizei *lengths,
3406 GLchar *messageLog)
3407{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003408 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
3409 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07003410}
3411
3412void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
3413{
3414 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003415 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07003416}
3417
3418void Context::popDebugGroup()
3419{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003420 mGLState.getDebug().popGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07003421}
3422
Jamie Madillc29968b2016-01-20 11:17:23 -05003423} // namespace gl