blob: fada66e898e486831a93dc46efe05bdef05ad7f0 [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 Madill231c7f52017-04-26 13:45:37 -040012#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050013#include <iterator>
14#include <sstream>
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 Langc339c4e2016-11-29 10:37:36 -050020#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050021#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050022#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040023#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050024#include "libANGLE/Fence.h"
25#include "libANGLE/Framebuffer.h"
26#include "libANGLE/FramebufferAttachment.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030027#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050028#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080029#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050031#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/ResourceManager.h"
33#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050034#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050035#include "libANGLE/Texture.h"
36#include "libANGLE/TransformFeedback.h"
37#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070038#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040039#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030040#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040041#include "libANGLE/queryutils.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040042#include "libANGLE/renderer/ContextImpl.h"
43#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040044#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000046
Geoff Langf6db0982015-08-25 13:04:00 -040047namespace
48{
49
Jamie Madillb6664922017-07-25 12:55:04 -040050#define ANGLE_HANDLE_ERR(X) \
51 handleError(X); \
52 return;
53#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
54
Ian Ewell3ffd78b2016-01-22 16:09:42 -050055template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050056std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030057 GLsizei numPaths,
58 const void *paths,
59 GLuint pathBase)
60{
61 std::vector<gl::Path *> ret;
62 ret.reserve(numPaths);
63
64 const auto *nameArray = static_cast<const T *>(paths);
65
66 for (GLsizei i = 0; i < numPaths; ++i)
67 {
68 const GLuint pathName = nameArray[i] + pathBase;
69
70 ret.push_back(resourceManager.getPath(pathName));
71 }
72
73 return ret;
74}
75
Geoff Lang4ddf5af2016-12-01 14:30:44 -050076std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030077 GLsizei numPaths,
78 GLenum pathNameType,
79 const void *paths,
80 GLuint pathBase)
81{
82 switch (pathNameType)
83 {
84 case GL_UNSIGNED_BYTE:
85 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
86
87 case GL_BYTE:
88 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_UNSIGNED_SHORT:
91 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_SHORT:
94 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_UNSIGNED_INT:
97 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_INT:
100 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
101 }
102
103 UNREACHABLE();
104 return std::vector<gl::Path *>();
105}
106
107template <typename T>
Geoff Lang2186c382016-10-14 10:54:54 -0400108gl::Error GetQueryObjectParameter(gl::Query *query, GLenum pname, T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500109{
Geoff Lang2186c382016-10-14 10:54:54 -0400110 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500111
112 switch (pname)
113 {
114 case GL_QUERY_RESULT_EXT:
Geoff Lang2186c382016-10-14 10:54:54 -0400115 return query->getResult(params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500116 case GL_QUERY_RESULT_AVAILABLE_EXT:
117 {
118 bool available;
Geoff Lang2186c382016-10-14 10:54:54 -0400119 gl::Error error = query->isResultAvailable(&available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500120 if (!error.isError())
121 {
jchen10a99ed552017-09-22 08:10:32 +0800122 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500123 }
124 return error;
125 }
126 default:
127 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500128 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500129 }
130}
131
Jamie Madill09463932018-04-04 05:26:59 -0400132void MarkTransformFeedbackBufferUsage(const gl::Context *context,
133 gl::TransformFeedback *transformFeedback,
James Darpinian30b604d2018-03-12 17:26:57 -0700134 GLsizei count,
135 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400136{
Geoff Lang1a683462015-09-29 15:09:59 -0400137 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400138 {
Jamie Madill09463932018-04-04 05:26:59 -0400139 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400140 }
141}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500142
143// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300144EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500145{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400146 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500147}
148
Martin Radev1be913c2016-07-11 17:59:16 +0300149EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
150{
151 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
152}
153
Geoff Langeb66a6e2016-10-31 13:06:12 -0400154gl::Version GetClientVersion(const egl::AttributeMap &attribs)
155{
156 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
157}
158
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500159GLenum GetResetStrategy(const egl::AttributeMap &attribs)
160{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800161 EGLAttrib attrib =
162 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500163 switch (attrib)
164 {
165 case EGL_NO_RESET_NOTIFICATION:
166 return GL_NO_RESET_NOTIFICATION_EXT;
167 case EGL_LOSE_CONTEXT_ON_RESET:
168 return GL_LOSE_CONTEXT_ON_RESET_EXT;
169 default:
170 UNREACHABLE();
171 return GL_NONE;
172 }
173}
174
175bool GetRobustAccess(const egl::AttributeMap &attribs)
176{
Geoff Lang077f20a2016-11-01 10:08:02 -0400177 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
178 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
179 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500180}
181
182bool GetDebug(const egl::AttributeMap &attribs)
183{
Geoff Lang077f20a2016-11-01 10:08:02 -0400184 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
185 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500186}
187
188bool GetNoError(const egl::AttributeMap &attribs)
189{
190 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
191}
192
Geoff Langc287ea62016-09-16 14:46:51 -0400193bool GetWebGLContext(const egl::AttributeMap &attribs)
194{
195 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
196}
197
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400198bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
199{
200 // If the context is WebGL, extensions are disabled by default
201 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
202 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
203}
204
Geoff Langf41a7152016-09-19 15:11:17 -0400205bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
206{
207 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
208}
209
Geoff Langfeb8c682017-02-13 16:07:35 -0500210bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
211{
212 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
213}
214
Geoff Langb433e872017-10-05 14:01:47 -0400215bool GetRobustResourceInit(const egl::AttributeMap &attribs)
216{
217 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
218}
219
Martin Radev9d901792016-07-15 15:58:58 +0300220std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
221{
222 std::string labelName;
223 if (label != nullptr)
224 {
225 size_t labelLength = length < 0 ? strlen(label) : length;
226 labelName = std::string(label, labelLength);
227 }
228 return labelName;
229}
230
231void GetObjectLabelBase(const std::string &objectLabel,
232 GLsizei bufSize,
233 GLsizei *length,
234 GLchar *label)
235{
236 size_t writeLength = objectLabel.length();
237 if (label != nullptr && bufSize > 0)
238 {
239 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
240 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
241 label[writeLength] = '\0';
242 }
243
244 if (length != nullptr)
245 {
246 *length = static_cast<GLsizei>(writeLength);
247 }
248}
249
Jamie Madill0f80ed82017-09-19 00:24:56 -0400250template <typename CapT, typename MaxT>
251void LimitCap(CapT *cap, MaxT maximum)
252{
253 *cap = std::min(*cap, static_cast<CapT>(maximum));
254}
255
Geoff Langf6db0982015-08-25 13:04:00 -0400256} // anonymous namespace
257
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000258namespace gl
259{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000260
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400261Context::Context(rx::EGLImplFactory *implFactory,
262 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400263 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500264 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400265 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500266 const egl::AttributeMap &attribs,
Geoff Langb433e872017-10-05 14:01:47 -0400267 const egl::DisplayExtensions &displayExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500268 : mState(reinterpret_cast<ContextID>(this),
269 shareContext ? &shareContext->mState : nullptr,
270 shareTextures,
271 GetClientVersion(attribs),
272 &mGLState,
273 mCaps,
274 mTextureCaps,
275 mExtensions,
276 mLimitations),
277 mSkipValidation(GetNoError(attribs)),
278 mDisplayTextureShareGroup(shareTextures != nullptr),
279 mSavedArgsType(nullptr),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700280 mImplementation(implFactory->createContext(mState)),
Jamie Madill2f348d22017-06-05 10:50:59 -0400281 mCompiler(),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400282 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500283 mClientType(EGL_OPENGL_ES_API),
284 mHasBeenCurrent(false),
285 mContextLost(false),
286 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700287 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500288 mResetStrategy(GetResetStrategy(attribs)),
289 mRobustAccess(GetRobustAccess(attribs)),
Jamie Madill61e16b42017-06-19 11:13:23 -0400290 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
291 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500292 mSurfacelessFramebuffer(nullptr),
Jamie Madille14951e2017-03-09 18:55:16 -0500293 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400294 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400295 mMemoryProgramCache(memoryProgramCache),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400296 mScratchBuffer(1000u),
297 mZeroFilledBuffer(1000u)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000298{
Jamie Madill5b772312018-03-08 20:28:32 -0500299 // Needed to solve a Clang warning of unused variables.
300 UNUSED_VARIABLE(mSavedArgsType);
301 UNUSED_VARIABLE(mParamsBuffer);
302
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400303 mImplementation->setMemoryProgramCache(memoryProgramCache);
304
Geoff Langb433e872017-10-05 14:01:47 -0400305 bool robustResourceInit = GetRobustResourceInit(attribs);
306 initCaps(displayExtensions, robustResourceInit);
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700307 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400308
Jamie Madill4928b7c2017-06-20 12:57:39 -0400309 mGLState.initialize(this, GetDebug(attribs), GetBindGeneratesResource(attribs),
Jamie Madillc43be722017-07-13 16:22:14 -0400310 GetClientArraysEnabled(attribs), robustResourceInit,
311 mMemoryProgramCache != nullptr);
Régis Fénéon83107972015-02-05 12:57:44 +0100312
Shannon Woods53a94a82014-06-24 15:20:36 -0400313 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400314
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000315 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400316 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000317 // and cube map texture state vectors respectively associated with them.
318 // In order that access to these initial textures not be lost, they are treated as texture
319 // objects all of whose names are 0.
320
Corentin Wallez99d492c2018-02-27 15:17:10 -0500321 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800322 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500323
Corentin Wallez99d492c2018-02-27 15:17:10 -0500324 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800325 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400326
Geoff Langeb66a6e2016-10-31 13:06:12 -0400327 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400328 {
329 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500330 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800331 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400332
Corentin Wallez99d492c2018-02-27 15:17:10 -0500333 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800334 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400335 }
Geoff Lang3b573612016-10-31 14:08:10 -0400336 if (getClientVersion() >= Version(3, 1))
337 {
338 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500339 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800340 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800341
Jiajia Qin6eafb042016-12-27 17:04:07 +0800342 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
343 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800344 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800345 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800346
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800347 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
348 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400349 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800350 }
Geoff Lang3b573612016-10-31 14:08:10 -0400351 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000352
Geoff Lang4751aab2017-10-30 15:14:52 -0400353 const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
354 if (nativeExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400355 {
356 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500357 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800358 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400359 }
360
Geoff Lang4751aab2017-10-30 15:14:52 -0400361 if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400362 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500363 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800364 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400365 }
366
Jamie Madill4928b7c2017-06-20 12:57:39 -0400367 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500368
Jamie Madill57a89722013-07-02 11:57:03 -0400369 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000370
Geoff Langeb66a6e2016-10-31 13:06:12 -0400371 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400372 {
373 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
374 // In the initial state, a default transform feedback object is bound and treated as
375 // a transform feedback object with a name of zero. That object is bound any time
376 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400377 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400378 }
Geoff Langc8058452014-02-03 12:04:11 -0500379
Corentin Wallez336129f2017-10-17 15:55:40 -0400380 for (auto type : angle::AllEnums<BufferBinding>())
381 {
382 bindBuffer(type, 0);
383 }
384
385 bindRenderbuffer(GL_RENDERBUFFER, 0);
386
387 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
388 {
389 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
390 }
391
Jamie Madillad9f24e2016-02-12 09:27:24 -0500392 // Initialize dirty bit masks
Jamie Madillc67323a2017-11-02 23:11:41 -0400393 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500394 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500395 // No dirty objects.
396
397 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400398 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500399 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500400 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
401
402 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
403 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
404 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
405 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
406 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
407 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
408 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
409 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
410 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
411 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
412 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
413 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
414
415 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
416 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700417 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500418 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
419 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400420
Xinghua Cao10a4d432017-11-28 14:46:26 +0800421 // TODO(xinghua.cao@intel.com): add other dirty bits and dirty objects.
422 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
423 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
424 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
425 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
426 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800427 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800428 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800429
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400430 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000431}
432
Jamie Madill4928b7c2017-06-20 12:57:39 -0400433egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000434{
Jamie Madille7b3fe22018-04-05 09:42:46 -0400435 // Delete the Surface first to trigger a finish() in Vulkan.
436 SafeDelete(mSurfacelessFramebuffer);
437
438 ANGLE_TRY(releaseSurface(display));
439
Corentin Wallez80b24112015-08-25 16:41:57 -0400440 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000441 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400442 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000443 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400444 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000445
Corentin Wallez80b24112015-08-25 16:41:57 -0400446 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000447 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400448 if (query.second != nullptr)
449 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400450 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400451 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000452 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400453 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000454
Corentin Wallez80b24112015-08-25 16:41:57 -0400455 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400456 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400457 if (vertexArray.second)
458 {
459 vertexArray.second->onDestroy(this);
460 }
Jamie Madill57a89722013-07-02 11:57:03 -0400461 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400462 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400463
Corentin Wallez80b24112015-08-25 16:41:57 -0400464 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500465 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500466 if (transformFeedback.second != nullptr)
467 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500468 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500469 }
Geoff Langc8058452014-02-03 12:04:11 -0500470 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400471 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500472
Jamie Madill5b772312018-03-08 20:28:32 -0500473 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400474 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800475 if (zeroTexture.get() != nullptr)
476 {
477 ANGLE_TRY(zeroTexture->onDestroy(this));
478 zeroTexture.set(this, nullptr);
479 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400480 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000481
Jamie Madill2f348d22017-06-05 10:50:59 -0400482 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500483
Jamie Madill4928b7c2017-06-20 12:57:39 -0400484 mGLState.reset(this);
485
Jamie Madill6c1f6712017-02-14 19:08:04 -0500486 mState.mBuffers->release(this);
487 mState.mShaderPrograms->release(this);
488 mState.mTextures->release(this);
489 mState.mRenderbuffers->release(this);
490 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400491 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500492 mState.mPaths->release(this);
493 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800494 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400495
Jamie Madill76e471e2017-10-21 09:56:01 -0400496 mImplementation->onDestroy(this);
497
Jamie Madill4928b7c2017-06-20 12:57:39 -0400498 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000499}
500
Jamie Madill70ee0f62017-02-06 16:04:20 -0500501Context::~Context()
502{
503}
504
Jamie Madill4928b7c2017-06-20 12:57:39 -0400505egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000506{
Jamie Madill61e16b42017-06-19 11:13:23 -0400507 mCurrentDisplay = display;
508
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000509 if (!mHasBeenCurrent)
510 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000511 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500512 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400513 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000514
Corentin Wallezc295e512017-01-27 17:47:50 -0500515 int width = 0;
516 int height = 0;
517 if (surface != nullptr)
518 {
519 width = surface->getWidth();
520 height = surface->getHeight();
521 }
522
523 mGLState.setViewportParams(0, 0, width, height);
524 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000525
526 mHasBeenCurrent = true;
527 }
528
Jamie Madill1b94d432015-08-07 13:23:23 -0400529 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700530 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400531 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400532
Jamie Madill4928b7c2017-06-20 12:57:39 -0400533 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500534
535 Framebuffer *newDefault = nullptr;
536 if (surface != nullptr)
537 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400538 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500539 mCurrentSurface = surface;
540 newDefault = surface->getDefaultFramebuffer();
541 }
542 else
543 {
544 if (mSurfacelessFramebuffer == nullptr)
545 {
546 mSurfacelessFramebuffer = new Framebuffer(mImplementation.get());
547 }
548
549 newDefault = mSurfacelessFramebuffer;
550 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000551
Corentin Wallez37c39792015-08-20 14:19:46 -0400552 // Update default framebuffer, the binding of the previous default
553 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400554 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700555 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400556 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700557 mGLState.setReadFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400558 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700559 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400560 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700561 mGLState.setDrawFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400562 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500563 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400564 }
Ian Ewell292f0052016-02-04 10:37:32 -0500565
566 // Notify the renderer of a context switch
Jamie Madill4928b7c2017-06-20 12:57:39 -0400567 mImplementation->onMakeCurrent(this);
568 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000569}
570
Jamie Madill4928b7c2017-06-20 12:57:39 -0400571egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400572{
Corentin Wallez37c39792015-08-20 14:19:46 -0400573 // Remove the default framebuffer
Corentin Wallezc295e512017-01-27 17:47:50 -0500574 Framebuffer *currentDefault = nullptr;
575 if (mCurrentSurface != nullptr)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400576 {
Corentin Wallezc295e512017-01-27 17:47:50 -0500577 currentDefault = mCurrentSurface->getDefaultFramebuffer();
578 }
579 else if (mSurfacelessFramebuffer != nullptr)
580 {
581 currentDefault = mSurfacelessFramebuffer;
Corentin Wallez51706ea2015-08-07 14:39:22 -0400582 }
583
Corentin Wallezc295e512017-01-27 17:47:50 -0500584 if (mGLState.getReadFramebuffer() == currentDefault)
585 {
586 mGLState.setReadFramebufferBinding(nullptr);
587 }
588 if (mGLState.getDrawFramebuffer() == currentDefault)
589 {
590 mGLState.setDrawFramebufferBinding(nullptr);
591 }
592 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
593
594 if (mCurrentSurface)
595 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400596 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500597 mCurrentSurface = nullptr;
598 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400599
600 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400601}
602
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000603GLuint Context::createBuffer()
604{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500605 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000606}
607
608GLuint Context::createProgram()
609{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500610 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000611}
612
Jiawei Shao385b3e02018-03-21 09:43:28 +0800613GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000614{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500615 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000616}
617
618GLuint Context::createTexture()
619{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500620 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000621}
622
623GLuint Context::createRenderbuffer()
624{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500625 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000626}
627
Brandon Jones59770802018-04-02 13:18:42 -0700628GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300629{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500630 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300631 if (resultOrError.isError())
632 {
633 handleError(resultOrError.getError());
634 return 0;
635 }
636 return resultOrError.getResult();
637}
638
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000639// Returns an unused framebuffer name
640GLuint Context::createFramebuffer()
641{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500642 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000643}
644
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500645void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000646{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500647 for (int i = 0; i < n; i++)
648 {
649 GLuint handle = mFenceNVHandleAllocator.allocate();
650 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
651 fences[i] = handle;
652 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000653}
654
Yunchao Hea336b902017-08-02 16:05:21 +0800655GLuint Context::createProgramPipeline()
656{
657 return mState.mPipelines->createProgramPipeline();
658}
659
Jiawei Shao385b3e02018-03-21 09:43:28 +0800660GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800661{
662 UNIMPLEMENTED();
663 return 0u;
664}
665
James Darpinian4d9d4832018-03-13 12:43:28 -0700666void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000667{
James Darpinian4d9d4832018-03-13 12:43:28 -0700668 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
669 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000670 {
671 detachBuffer(buffer);
672 }
Jamie Madill893ab082014-05-16 16:56:10 -0400673
James Darpinian4d9d4832018-03-13 12:43:28 -0700674 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000675}
676
677void Context::deleteShader(GLuint shader)
678{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500679 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000680}
681
682void Context::deleteProgram(GLuint program)
683{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500684 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000685}
686
687void Context::deleteTexture(GLuint texture)
688{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500689 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000690 {
691 detachTexture(texture);
692 }
693
Jamie Madill6c1f6712017-02-14 19:08:04 -0500694 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000695}
696
697void Context::deleteRenderbuffer(GLuint renderbuffer)
698{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500699 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000700 {
701 detachRenderbuffer(renderbuffer);
702 }
Jamie Madill893ab082014-05-16 16:56:10 -0400703
Jamie Madill6c1f6712017-02-14 19:08:04 -0500704 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000705}
706
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400707void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400708{
709 // The spec specifies the underlying Fence object is not deleted until all current
710 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
711 // and since our API is currently designed for being called from a single thread, we can delete
712 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400713 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400714}
715
Yunchao Hea336b902017-08-02 16:05:21 +0800716void Context::deleteProgramPipeline(GLuint pipeline)
717{
718 if (mState.mPipelines->getProgramPipeline(pipeline))
719 {
720 detachProgramPipeline(pipeline);
721 }
722
723 mState.mPipelines->deleteObject(this, pipeline);
724}
725
Sami Väisänene45e53b2016-05-25 10:36:04 +0300726void Context::deletePaths(GLuint first, GLsizei range)
727{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500728 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300729}
730
Brandon Jones59770802018-04-02 13:18:42 -0700731bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300732{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500733 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300734 if (pathObj == nullptr)
735 return false;
736
737 return pathObj->hasPathData();
738}
739
Brandon Jones59770802018-04-02 13:18:42 -0700740bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300741{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500742 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300743}
744
Brandon Jones59770802018-04-02 13:18:42 -0700745void Context::pathCommands(GLuint path,
746 GLsizei numCommands,
747 const GLubyte *commands,
748 GLsizei numCoords,
749 GLenum coordType,
750 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300751{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500752 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300753
754 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
755}
756
Jamie Madill007530e2017-12-28 14:27:04 -0500757void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300758{
Jamie Madill007530e2017-12-28 14:27:04 -0500759 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300760
761 switch (pname)
762 {
763 case GL_PATH_STROKE_WIDTH_CHROMIUM:
764 pathObj->setStrokeWidth(value);
765 break;
766 case GL_PATH_END_CAPS_CHROMIUM:
767 pathObj->setEndCaps(static_cast<GLenum>(value));
768 break;
769 case GL_PATH_JOIN_STYLE_CHROMIUM:
770 pathObj->setJoinStyle(static_cast<GLenum>(value));
771 break;
772 case GL_PATH_MITER_LIMIT_CHROMIUM:
773 pathObj->setMiterLimit(value);
774 break;
775 case GL_PATH_STROKE_BOUND_CHROMIUM:
776 pathObj->setStrokeBound(value);
777 break;
778 default:
779 UNREACHABLE();
780 break;
781 }
782}
783
Jamie Madill007530e2017-12-28 14:27:04 -0500784void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300785{
Jamie Madill007530e2017-12-28 14:27:04 -0500786 // TODO(jmadill): Should use proper clamping/casting.
787 pathParameterf(path, pname, static_cast<GLfloat>(value));
788}
789
790void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
791{
792 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300793
794 switch (pname)
795 {
796 case GL_PATH_STROKE_WIDTH_CHROMIUM:
797 *value = pathObj->getStrokeWidth();
798 break;
799 case GL_PATH_END_CAPS_CHROMIUM:
800 *value = static_cast<GLfloat>(pathObj->getEndCaps());
801 break;
802 case GL_PATH_JOIN_STYLE_CHROMIUM:
803 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
804 break;
805 case GL_PATH_MITER_LIMIT_CHROMIUM:
806 *value = pathObj->getMiterLimit();
807 break;
808 case GL_PATH_STROKE_BOUND_CHROMIUM:
809 *value = pathObj->getStrokeBound();
810 break;
811 default:
812 UNREACHABLE();
813 break;
814 }
815}
816
Jamie Madill007530e2017-12-28 14:27:04 -0500817void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
818{
819 GLfloat val = 0.0f;
820 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
821 if (value)
822 *value = static_cast<GLint>(val);
823}
824
Brandon Jones59770802018-04-02 13:18:42 -0700825void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300826{
827 mGLState.setPathStencilFunc(func, ref, mask);
828}
829
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000830void Context::deleteFramebuffer(GLuint framebuffer)
831{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500832 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000833 {
834 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000835 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500836
Jamie Madill6c1f6712017-02-14 19:08:04 -0500837 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000838}
839
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500840void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000841{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500842 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000843 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500844 GLuint fence = fences[i];
845
846 FenceNV *fenceObject = nullptr;
847 if (mFenceNVMap.erase(fence, &fenceObject))
848 {
849 mFenceNVHandleAllocator.release(fence);
850 delete fenceObject;
851 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000852 }
853}
854
Geoff Lang70d0f492015-12-10 17:45:46 -0500855Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000856{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500857 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000858}
859
Jamie Madill570f7c82014-07-03 10:38:54 -0400860Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000861{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500862 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000863}
864
Geoff Lang70d0f492015-12-10 17:45:46 -0500865Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000866{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500867 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000868}
869
Jamie Madill70b5bb02017-08-28 13:32:37 -0400870Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400871{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400872 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400873}
874
Jamie Madill57a89722013-07-02 11:57:03 -0400875VertexArray *Context::getVertexArray(GLuint handle) const
876{
Jamie Madill96a483b2017-06-27 16:49:21 -0400877 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400878}
879
Jamie Madilldc356042013-07-19 16:36:57 -0400880Sampler *Context::getSampler(GLuint handle) const
881{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500882 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400883}
884
Geoff Langc8058452014-02-03 12:04:11 -0500885TransformFeedback *Context::getTransformFeedback(GLuint handle) const
886{
Jamie Madill96a483b2017-06-27 16:49:21 -0400887 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500888}
889
Yunchao Hea336b902017-08-02 16:05:21 +0800890ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
891{
892 return mState.mPipelines->getProgramPipeline(handle);
893}
894
Geoff Lang70d0f492015-12-10 17:45:46 -0500895LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
896{
897 switch (identifier)
898 {
899 case GL_BUFFER:
900 return getBuffer(name);
901 case GL_SHADER:
902 return getShader(name);
903 case GL_PROGRAM:
904 return getProgram(name);
905 case GL_VERTEX_ARRAY:
906 return getVertexArray(name);
907 case GL_QUERY:
908 return getQuery(name);
909 case GL_TRANSFORM_FEEDBACK:
910 return getTransformFeedback(name);
911 case GL_SAMPLER:
912 return getSampler(name);
913 case GL_TEXTURE:
914 return getTexture(name);
915 case GL_RENDERBUFFER:
916 return getRenderbuffer(name);
917 case GL_FRAMEBUFFER:
918 return getFramebuffer(name);
919 default:
920 UNREACHABLE();
921 return nullptr;
922 }
923}
924
925LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
926{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400927 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -0500928}
929
Martin Radev9d901792016-07-15 15:58:58 +0300930void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
931{
932 LabeledObject *object = getLabeledObject(identifier, name);
933 ASSERT(object != nullptr);
934
935 std::string labelName = GetObjectLabelFromPointer(length, label);
936 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -0400937
938 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
939 // specified object is active until we do this.
940 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +0300941}
942
943void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
944{
945 LabeledObject *object = getLabeledObjectFromPtr(ptr);
946 ASSERT(object != nullptr);
947
948 std::string labelName = GetObjectLabelFromPointer(length, label);
949 object->setLabel(labelName);
950}
951
952void Context::getObjectLabel(GLenum identifier,
953 GLuint name,
954 GLsizei bufSize,
955 GLsizei *length,
956 GLchar *label) const
957{
958 LabeledObject *object = getLabeledObject(identifier, name);
959 ASSERT(object != nullptr);
960
961 const std::string &objectLabel = object->getLabel();
962 GetObjectLabelBase(objectLabel, bufSize, length, label);
963}
964
965void Context::getObjectPtrLabel(const void *ptr,
966 GLsizei bufSize,
967 GLsizei *length,
968 GLchar *label) const
969{
970 LabeledObject *object = getLabeledObjectFromPtr(ptr);
971 ASSERT(object != nullptr);
972
973 const std::string &objectLabel = object->getLabel();
974 GetObjectLabelBase(objectLabel, bufSize, length, label);
975}
976
Jamie Madilldc356042013-07-19 16:36:57 -0400977bool Context::isSampler(GLuint samplerName) const
978{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500979 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -0400980}
981
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800982void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000983{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500984 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000985
Jamie Madilldedd7b92014-11-05 16:30:36 -0500986 if (handle == 0)
987 {
988 texture = mZeroTextures[target].get();
989 }
990 else
991 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500992 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500993 }
994
995 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400996 mGLState.setSamplerTexture(this, target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000997}
998
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500999void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001000{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001001 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1002 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001003 mGLState.setReadFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001004}
1005
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001006void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001007{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001008 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1009 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001010 mGLState.setDrawFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001011}
1012
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001013void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001014{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001015 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001016 mGLState.setVertexArrayBinding(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -04001017}
1018
Shao80957d92017-02-20 21:25:59 +08001019void Context::bindVertexBuffer(GLuint bindingIndex,
1020 GLuint bufferHandle,
1021 GLintptr offset,
1022 GLsizei stride)
1023{
1024 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001025 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +08001026}
1027
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001028void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001029{
Geoff Lang76b10c92014-09-05 16:28:14 -04001030 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001031 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001032 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001033 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001034}
1035
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001036void Context::bindImageTexture(GLuint unit,
1037 GLuint texture,
1038 GLint level,
1039 GLboolean layered,
1040 GLint layer,
1041 GLenum access,
1042 GLenum format)
1043{
1044 Texture *tex = mState.mTextures->getTexture(texture);
1045 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1046}
1047
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001048void Context::useProgram(GLuint program)
1049{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001050 mGLState.setProgram(this, getProgram(program));
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001051}
1052
Jiajia Qin5451d532017-11-16 17:16:34 +08001053void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1054{
1055 UNIMPLEMENTED();
1056}
1057
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001058void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001059{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001060 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001061 TransformFeedback *transformFeedback =
1062 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001063 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001064}
1065
Yunchao Hea336b902017-08-02 16:05:21 +08001066void Context::bindProgramPipeline(GLuint pipelineHandle)
1067{
1068 ProgramPipeline *pipeline =
1069 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1070 mGLState.setProgramPipelineBinding(this, pipeline);
1071}
1072
Jamie Madillf0e04492017-08-26 15:28:42 -04001073void Context::beginQuery(GLenum target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001074{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001075 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001076 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001077
Geoff Lang5aad9672014-09-08 11:10:42 -04001078 // begin query
Jamie Madillf0e04492017-08-26 15:28:42 -04001079 ANGLE_CONTEXT_TRY(queryObject->begin());
Geoff Lang5aad9672014-09-08 11:10:42 -04001080
1081 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001082 mGLState.setActiveQuery(this, target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001083}
1084
Jamie Madillf0e04492017-08-26 15:28:42 -04001085void Context::endQuery(GLenum target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001086{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001087 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001088 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001089
Jamie Madillf0e04492017-08-26 15:28:42 -04001090 handleError(queryObject->end());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001091
Geoff Lang5aad9672014-09-08 11:10:42 -04001092 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001093 mGLState.setActiveQuery(this, target, nullptr);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001094}
1095
Jamie Madillf0e04492017-08-26 15:28:42 -04001096void Context::queryCounter(GLuint id, GLenum target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001097{
1098 ASSERT(target == GL_TIMESTAMP_EXT);
1099
1100 Query *queryObject = getQuery(id, true, target);
1101 ASSERT(queryObject);
1102
Jamie Madillf0e04492017-08-26 15:28:42 -04001103 handleError(queryObject->queryCounter());
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001104}
1105
1106void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
1107{
1108 switch (pname)
1109 {
1110 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001111 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001112 break;
1113 case GL_QUERY_COUNTER_BITS_EXT:
1114 switch (target)
1115 {
1116 case GL_TIME_ELAPSED_EXT:
1117 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1118 break;
1119 case GL_TIMESTAMP_EXT:
1120 params[0] = getExtensions().queryCounterBitsTimestamp;
1121 break;
1122 default:
1123 UNREACHABLE();
1124 params[0] = 0;
1125 break;
1126 }
1127 break;
1128 default:
1129 UNREACHABLE();
1130 return;
1131 }
1132}
1133
Brandon Jones59770802018-04-02 13:18:42 -07001134void Context::getQueryivRobust(GLenum target,
1135 GLenum pname,
1136 GLsizei bufSize,
1137 GLsizei *length,
1138 GLint *params)
1139{
1140 getQueryiv(target, pname, params);
1141}
1142
Geoff Lang2186c382016-10-14 10:54:54 -04001143void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001144{
Geoff Lang2186c382016-10-14 10:54:54 -04001145 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001146}
1147
Brandon Jones59770802018-04-02 13:18:42 -07001148void Context::getQueryObjectivRobust(GLuint id,
1149 GLenum pname,
1150 GLsizei bufSize,
1151 GLsizei *length,
1152 GLint *params)
1153{
1154 getQueryObjectiv(id, pname, params);
1155}
1156
Geoff Lang2186c382016-10-14 10:54:54 -04001157void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001158{
Geoff Lang2186c382016-10-14 10:54:54 -04001159 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001160}
1161
Brandon Jones59770802018-04-02 13:18:42 -07001162void Context::getQueryObjectuivRobust(GLuint id,
1163 GLenum pname,
1164 GLsizei bufSize,
1165 GLsizei *length,
1166 GLuint *params)
1167{
1168 getQueryObjectuiv(id, pname, params);
1169}
1170
Geoff Lang2186c382016-10-14 10:54:54 -04001171void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001172{
Geoff Lang2186c382016-10-14 10:54:54 -04001173 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001174}
1175
Brandon Jones59770802018-04-02 13:18:42 -07001176void Context::getQueryObjecti64vRobust(GLuint id,
1177 GLenum pname,
1178 GLsizei bufSize,
1179 GLsizei *length,
1180 GLint64 *params)
1181{
1182 getQueryObjecti64v(id, pname, params);
1183}
1184
Geoff Lang2186c382016-10-14 10:54:54 -04001185void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001186{
Geoff Lang2186c382016-10-14 10:54:54 -04001187 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001188}
1189
Brandon Jones59770802018-04-02 13:18:42 -07001190void Context::getQueryObjectui64vRobust(GLuint id,
1191 GLenum pname,
1192 GLsizei bufSize,
1193 GLsizei *length,
1194 GLuint64 *params)
1195{
1196 getQueryObjectui64v(id, pname, params);
1197}
1198
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001199Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001200{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001201 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001202}
1203
Jamie Madill2f348d22017-06-05 10:50:59 -04001204FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001205{
Jamie Madill96a483b2017-06-27 16:49:21 -04001206 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001207}
1208
Jamie Madill2f348d22017-06-05 10:50:59 -04001209Query *Context::getQuery(GLuint handle, bool create, GLenum type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001210{
Jamie Madill96a483b2017-06-27 16:49:21 -04001211 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001212 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001213 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001214 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001215
1216 Query *query = mQueryMap.query(handle);
1217 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001218 {
Jamie Madill96a483b2017-06-27 16:49:21 -04001219 query = new Query(mImplementation->createQuery(type), handle);
1220 query->addRef();
1221 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001222 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001223 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001224}
1225
Geoff Lang70d0f492015-12-10 17:45:46 -05001226Query *Context::getQuery(GLuint handle) const
1227{
Jamie Madill96a483b2017-06-27 16:49:21 -04001228 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001229}
1230
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001231Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001232{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001233 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1234 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001235}
1236
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001237Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001238{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001239 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001240}
1241
Geoff Lang492a7e42014-11-05 13:27:06 -05001242Compiler *Context::getCompiler() const
1243{
Jamie Madill2f348d22017-06-05 10:50:59 -04001244 if (mCompiler.get() == nullptr)
1245 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001246 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001247 }
1248 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001249}
1250
Jamie Madillc1d770e2017-04-13 17:31:24 -04001251void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001252{
1253 switch (pname)
1254 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001255 case GL_SHADER_COMPILER:
1256 *params = GL_TRUE;
1257 break;
1258 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1259 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1260 break;
1261 default:
1262 mGLState.getBooleanv(pname, params);
1263 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001264 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001265}
1266
Jamie Madillc1d770e2017-04-13 17:31:24 -04001267void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001268{
Shannon Woods53a94a82014-06-24 15:20:36 -04001269 // Queries about context capabilities and maximums are answered by Context.
1270 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001271 switch (pname)
1272 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001273 case GL_ALIASED_LINE_WIDTH_RANGE:
1274 params[0] = mCaps.minAliasedLineWidth;
1275 params[1] = mCaps.maxAliasedLineWidth;
1276 break;
1277 case GL_ALIASED_POINT_SIZE_RANGE:
1278 params[0] = mCaps.minAliasedPointSize;
1279 params[1] = mCaps.maxAliasedPointSize;
1280 break;
1281 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1282 ASSERT(mExtensions.textureFilterAnisotropic);
1283 *params = mExtensions.maxTextureAnisotropy;
1284 break;
1285 case GL_MAX_TEXTURE_LOD_BIAS:
1286 *params = mCaps.maxLODBias;
1287 break;
1288
1289 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1290 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1291 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001292 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1293 // GLES1 constants for modelview/projection matrix.
1294 if (getClientVersion() < Version(2, 0))
1295 {
1296 mGLState.getFloatv(pname, params);
1297 }
1298 else
1299 {
1300 ASSERT(mExtensions.pathRendering);
1301 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1302 memcpy(params, m, 16 * sizeof(GLfloat));
1303 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001304 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001305 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001306
Jamie Madill231c7f52017-04-26 13:45:37 -04001307 default:
1308 mGLState.getFloatv(pname, params);
1309 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001310 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001311}
1312
Jamie Madillc1d770e2017-04-13 17:31:24 -04001313void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001314{
Shannon Woods53a94a82014-06-24 15:20:36 -04001315 // Queries about context capabilities and maximums are answered by Context.
1316 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001317
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001318 switch (pname)
1319 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001320 case GL_MAX_VERTEX_ATTRIBS:
1321 *params = mCaps.maxVertexAttributes;
1322 break;
1323 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1324 *params = mCaps.maxVertexUniformVectors;
1325 break;
1326 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
1327 *params = mCaps.maxVertexUniformComponents;
1328 break;
1329 case GL_MAX_VARYING_VECTORS:
1330 *params = mCaps.maxVaryingVectors;
1331 break;
1332 case GL_MAX_VARYING_COMPONENTS:
1333 *params = mCaps.maxVertexOutputComponents;
1334 break;
1335 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1336 *params = mCaps.maxCombinedTextureImageUnits;
1337 break;
1338 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
1339 *params = mCaps.maxVertexTextureImageUnits;
1340 break;
1341 case GL_MAX_TEXTURE_IMAGE_UNITS:
1342 *params = mCaps.maxTextureImageUnits;
1343 break;
1344 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1345 *params = mCaps.maxFragmentUniformVectors;
1346 break;
1347 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
1348 *params = mCaps.maxFragmentUniformComponents;
1349 break;
1350 case GL_MAX_RENDERBUFFER_SIZE:
1351 *params = mCaps.maxRenderbufferSize;
1352 break;
1353 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1354 *params = mCaps.maxColorAttachments;
1355 break;
1356 case GL_MAX_DRAW_BUFFERS_EXT:
1357 *params = mCaps.maxDrawBuffers;
1358 break;
1359 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1360 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1361 case GL_SUBPIXEL_BITS:
1362 *params = 4;
1363 break;
1364 case GL_MAX_TEXTURE_SIZE:
1365 *params = mCaps.max2DTextureSize;
1366 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001367 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1368 *params = mCaps.maxRectangleTextureSize;
1369 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001370 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1371 *params = mCaps.maxCubeMapTextureSize;
1372 break;
1373 case GL_MAX_3D_TEXTURE_SIZE:
1374 *params = mCaps.max3DTextureSize;
1375 break;
1376 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1377 *params = mCaps.maxArrayTextureLayers;
1378 break;
1379 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1380 *params = mCaps.uniformBufferOffsetAlignment;
1381 break;
1382 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1383 *params = mCaps.maxUniformBufferBindings;
1384 break;
1385 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
1386 *params = mCaps.maxVertexUniformBlocks;
1387 break;
1388 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
1389 *params = mCaps.maxFragmentUniformBlocks;
1390 break;
1391 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1392 *params = mCaps.maxCombinedTextureImageUnits;
1393 break;
1394 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1395 *params = mCaps.maxVertexOutputComponents;
1396 break;
1397 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1398 *params = mCaps.maxFragmentInputComponents;
1399 break;
1400 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1401 *params = mCaps.minProgramTexelOffset;
1402 break;
1403 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1404 *params = mCaps.maxProgramTexelOffset;
1405 break;
1406 case GL_MAJOR_VERSION:
1407 *params = getClientVersion().major;
1408 break;
1409 case GL_MINOR_VERSION:
1410 *params = getClientVersion().minor;
1411 break;
1412 case GL_MAX_ELEMENTS_INDICES:
1413 *params = mCaps.maxElementsIndices;
1414 break;
1415 case GL_MAX_ELEMENTS_VERTICES:
1416 *params = mCaps.maxElementsVertices;
1417 break;
1418 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1419 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1420 break;
1421 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1422 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1423 break;
1424 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1425 *params = mCaps.maxTransformFeedbackSeparateComponents;
1426 break;
1427 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1428 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1429 break;
1430 case GL_MAX_SAMPLES_ANGLE:
1431 *params = mCaps.maxSamples;
1432 break;
1433 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001434 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001435 params[0] = mCaps.maxViewportWidth;
1436 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001437 }
1438 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001439 case GL_COMPRESSED_TEXTURE_FORMATS:
1440 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1441 params);
1442 break;
1443 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1444 *params = mResetStrategy;
1445 break;
1446 case GL_NUM_SHADER_BINARY_FORMATS:
1447 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1448 break;
1449 case GL_SHADER_BINARY_FORMATS:
1450 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1451 break;
1452 case GL_NUM_PROGRAM_BINARY_FORMATS:
1453 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1454 break;
1455 case GL_PROGRAM_BINARY_FORMATS:
1456 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1457 break;
1458 case GL_NUM_EXTENSIONS:
1459 *params = static_cast<GLint>(mExtensionStrings.size());
1460 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001461
Jamie Madill231c7f52017-04-26 13:45:37 -04001462 // GL_KHR_debug
1463 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1464 *params = mExtensions.maxDebugMessageLength;
1465 break;
1466 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1467 *params = mExtensions.maxDebugLoggedMessages;
1468 break;
1469 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1470 *params = mExtensions.maxDebugGroupStackDepth;
1471 break;
1472 case GL_MAX_LABEL_LENGTH:
1473 *params = mExtensions.maxLabelLength;
1474 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001475
Martin Radeve5285d22017-07-14 16:23:53 +03001476 // GL_ANGLE_multiview
1477 case GL_MAX_VIEWS_ANGLE:
1478 *params = mExtensions.maxViews;
1479 break;
1480
Jamie Madill231c7f52017-04-26 13:45:37 -04001481 // GL_EXT_disjoint_timer_query
1482 case GL_GPU_DISJOINT_EXT:
1483 *params = mImplementation->getGPUDisjoint();
1484 break;
1485 case GL_MAX_FRAMEBUFFER_WIDTH:
1486 *params = mCaps.maxFramebufferWidth;
1487 break;
1488 case GL_MAX_FRAMEBUFFER_HEIGHT:
1489 *params = mCaps.maxFramebufferHeight;
1490 break;
1491 case GL_MAX_FRAMEBUFFER_SAMPLES:
1492 *params = mCaps.maxFramebufferSamples;
1493 break;
1494 case GL_MAX_SAMPLE_MASK_WORDS:
1495 *params = mCaps.maxSampleMaskWords;
1496 break;
1497 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1498 *params = mCaps.maxColorTextureSamples;
1499 break;
1500 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1501 *params = mCaps.maxDepthTextureSamples;
1502 break;
1503 case GL_MAX_INTEGER_SAMPLES:
1504 *params = mCaps.maxIntegerSamples;
1505 break;
1506 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1507 *params = mCaps.maxVertexAttribRelativeOffset;
1508 break;
1509 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1510 *params = mCaps.maxVertexAttribBindings;
1511 break;
1512 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1513 *params = mCaps.maxVertexAttribStride;
1514 break;
1515 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
1516 *params = mCaps.maxVertexAtomicCounterBuffers;
1517 break;
1518 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
1519 *params = mCaps.maxVertexAtomicCounters;
1520 break;
1521 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
1522 *params = mCaps.maxVertexImageUniforms;
1523 break;
1524 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
1525 *params = mCaps.maxVertexShaderStorageBlocks;
1526 break;
1527 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
1528 *params = mCaps.maxFragmentAtomicCounterBuffers;
1529 break;
1530 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
1531 *params = mCaps.maxFragmentAtomicCounters;
1532 break;
1533 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
1534 *params = mCaps.maxFragmentImageUniforms;
1535 break;
1536 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
1537 *params = mCaps.maxFragmentShaderStorageBlocks;
1538 break;
1539 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1540 *params = mCaps.minProgramTextureGatherOffset;
1541 break;
1542 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1543 *params = mCaps.maxProgramTextureGatherOffset;
1544 break;
1545 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1546 *params = mCaps.maxComputeWorkGroupInvocations;
1547 break;
1548 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
1549 *params = mCaps.maxComputeUniformBlocks;
1550 break;
1551 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
1552 *params = mCaps.maxComputeTextureImageUnits;
1553 break;
1554 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1555 *params = mCaps.maxComputeSharedMemorySize;
1556 break;
1557 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
1558 *params = mCaps.maxComputeUniformComponents;
1559 break;
1560 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
1561 *params = mCaps.maxComputeAtomicCounterBuffers;
1562 break;
1563 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
1564 *params = mCaps.maxComputeAtomicCounters;
1565 break;
1566 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
1567 *params = mCaps.maxComputeImageUniforms;
1568 break;
1569 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
1570 *params = mCaps.maxCombinedComputeUniformComponents;
1571 break;
1572 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
1573 *params = mCaps.maxComputeShaderStorageBlocks;
1574 break;
1575 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1576 *params = mCaps.maxCombinedShaderOutputResources;
1577 break;
1578 case GL_MAX_UNIFORM_LOCATIONS:
1579 *params = mCaps.maxUniformLocations;
1580 break;
1581 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1582 *params = mCaps.maxAtomicCounterBufferBindings;
1583 break;
1584 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1585 *params = mCaps.maxAtomicCounterBufferSize;
1586 break;
1587 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1588 *params = mCaps.maxCombinedAtomicCounterBuffers;
1589 break;
1590 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1591 *params = mCaps.maxCombinedAtomicCounters;
1592 break;
1593 case GL_MAX_IMAGE_UNITS:
1594 *params = mCaps.maxImageUnits;
1595 break;
1596 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1597 *params = mCaps.maxCombinedImageUniforms;
1598 break;
1599 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1600 *params = mCaps.maxShaderStorageBufferBindings;
1601 break;
1602 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1603 *params = mCaps.maxCombinedShaderStorageBlocks;
1604 break;
1605 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1606 *params = mCaps.shaderStorageBufferOffsetAlignment;
1607 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001608
1609 // GL_EXT_geometry_shader
1610 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1611 *params = mCaps.maxFramebufferLayers;
1612 break;
1613 case GL_LAYER_PROVOKING_VERTEX_EXT:
1614 *params = mCaps.layerProvokingVertex;
1615 break;
1616 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1617 *params = mCaps.maxGeometryUniformComponents;
1618 break;
1619 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
1620 *params = mCaps.maxGeometryUniformBlocks;
1621 break;
1622 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1623 *params = mCaps.maxCombinedGeometryUniformComponents;
1624 break;
1625 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1626 *params = mCaps.maxGeometryInputComponents;
1627 break;
1628 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1629 *params = mCaps.maxGeometryOutputComponents;
1630 break;
1631 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1632 *params = mCaps.maxGeometryOutputVertices;
1633 break;
1634 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1635 *params = mCaps.maxGeometryTotalOutputComponents;
1636 break;
1637 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1638 *params = mCaps.maxGeometryShaderInvocations;
1639 break;
1640 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
1641 *params = mCaps.maxGeometryTextureImageUnits;
1642 break;
1643 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
1644 *params = mCaps.maxGeometryAtomicCounterBuffers;
1645 break;
1646 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
1647 *params = mCaps.maxGeometryAtomicCounters;
1648 break;
1649 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
1650 *params = mCaps.maxGeometryImageUniforms;
1651 break;
1652 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
1653 *params = mCaps.maxGeometryShaderStorageBlocks;
1654 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001655 // GLES1 emulation: Caps queries
1656 case GL_MAX_TEXTURE_UNITS:
1657 *params = mCaps.maxMultitextureUnits;
1658 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001659 case GL_MAX_MODELVIEW_STACK_DEPTH:
1660 *params = mCaps.maxModelviewMatrixStackDepth;
1661 break;
1662 case GL_MAX_PROJECTION_STACK_DEPTH:
1663 *params = mCaps.maxProjectionMatrixStackDepth;
1664 break;
1665 case GL_MAX_TEXTURE_STACK_DEPTH:
1666 *params = mCaps.maxTextureMatrixStackDepth;
1667 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001668 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001669 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001670 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001671 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001672}
1673
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001674void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001675{
Shannon Woods53a94a82014-06-24 15:20:36 -04001676 // Queries about context capabilities and maximums are answered by Context.
1677 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001678 switch (pname)
1679 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001680 case GL_MAX_ELEMENT_INDEX:
1681 *params = mCaps.maxElementIndex;
1682 break;
1683 case GL_MAX_UNIFORM_BLOCK_SIZE:
1684 *params = mCaps.maxUniformBlockSize;
1685 break;
1686 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
1687 *params = mCaps.maxCombinedVertexUniformComponents;
1688 break;
1689 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
1690 *params = mCaps.maxCombinedFragmentUniformComponents;
1691 break;
1692 case GL_MAX_SERVER_WAIT_TIMEOUT:
1693 *params = mCaps.maxServerWaitTimeout;
1694 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001695
Jamie Madill231c7f52017-04-26 13:45:37 -04001696 // GL_EXT_disjoint_timer_query
1697 case GL_TIMESTAMP_EXT:
1698 *params = mImplementation->getTimestamp();
1699 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001700
Jamie Madill231c7f52017-04-26 13:45:37 -04001701 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1702 *params = mCaps.maxShaderStorageBlockSize;
1703 break;
1704 default:
1705 UNREACHABLE();
1706 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001707 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001708}
1709
Geoff Lang70d0f492015-12-10 17:45:46 -05001710void Context::getPointerv(GLenum pname, void **params) const
1711{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001712 mGLState.getPointerv(pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001713}
1714
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001715void Context::getPointervRobustANGLERobust(GLenum pname,
1716 GLsizei bufSize,
1717 GLsizei *length,
1718 void **params)
1719{
1720 UNIMPLEMENTED();
1721}
1722
Martin Radev66fb8202016-07-28 11:45:20 +03001723void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001724{
Shannon Woods53a94a82014-06-24 15:20:36 -04001725 // Queries about context capabilities and maximums are answered by Context.
1726 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001727
1728 GLenum nativeType;
1729 unsigned int numParams;
1730 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1731 ASSERT(queryStatus);
1732
1733 if (nativeType == GL_INT)
1734 {
1735 switch (target)
1736 {
1737 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1738 ASSERT(index < 3u);
1739 *data = mCaps.maxComputeWorkGroupCount[index];
1740 break;
1741 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1742 ASSERT(index < 3u);
1743 *data = mCaps.maxComputeWorkGroupSize[index];
1744 break;
1745 default:
1746 mGLState.getIntegeri_v(target, index, data);
1747 }
1748 }
1749 else
1750 {
1751 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1752 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001753}
1754
Brandon Jones59770802018-04-02 13:18:42 -07001755void Context::getIntegeri_vRobust(GLenum target,
1756 GLuint index,
1757 GLsizei bufSize,
1758 GLsizei *length,
1759 GLint *data)
1760{
1761 getIntegeri_v(target, index, data);
1762}
1763
Martin Radev66fb8202016-07-28 11:45:20 +03001764void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001765{
Shannon Woods53a94a82014-06-24 15:20:36 -04001766 // Queries about context capabilities and maximums are answered by Context.
1767 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001768
1769 GLenum nativeType;
1770 unsigned int numParams;
1771 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1772 ASSERT(queryStatus);
1773
1774 if (nativeType == GL_INT_64_ANGLEX)
1775 {
1776 mGLState.getInteger64i_v(target, index, data);
1777 }
1778 else
1779 {
1780 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1781 }
1782}
1783
Brandon Jones59770802018-04-02 13:18:42 -07001784void Context::getInteger64i_vRobust(GLenum target,
1785 GLuint index,
1786 GLsizei bufSize,
1787 GLsizei *length,
1788 GLint64 *data)
1789{
1790 getInteger64i_v(target, index, data);
1791}
1792
Martin Radev66fb8202016-07-28 11:45:20 +03001793void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1794{
1795 // Queries about context capabilities and maximums are answered by Context.
1796 // Queries about current GL state values are answered by State.
1797
1798 GLenum nativeType;
1799 unsigned int numParams;
1800 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1801 ASSERT(queryStatus);
1802
1803 if (nativeType == GL_BOOL)
1804 {
1805 mGLState.getBooleani_v(target, index, data);
1806 }
1807 else
1808 {
1809 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1810 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001811}
1812
Brandon Jones59770802018-04-02 13:18:42 -07001813void Context::getBooleani_vRobust(GLenum target,
1814 GLuint index,
1815 GLsizei bufSize,
1816 GLsizei *length,
1817 GLboolean *data)
1818{
1819 getBooleani_v(target, index, data);
1820}
1821
Corentin Wallez336129f2017-10-17 15:55:40 -04001822void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001823{
1824 Buffer *buffer = mGLState.getTargetBuffer(target);
1825 QueryBufferParameteriv(buffer, pname, params);
1826}
1827
Brandon Jones59770802018-04-02 13:18:42 -07001828void Context::getBufferParameterivRobust(BufferBinding target,
1829 GLenum pname,
1830 GLsizei bufSize,
1831 GLsizei *length,
1832 GLint *params)
1833{
1834 getBufferParameteriv(target, pname, params);
1835}
1836
He Yunchao010e4db2017-03-03 14:22:06 +08001837void Context::getFramebufferAttachmentParameteriv(GLenum target,
1838 GLenum attachment,
1839 GLenum pname,
1840 GLint *params)
1841{
1842 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08001843 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08001844}
1845
Brandon Jones59770802018-04-02 13:18:42 -07001846void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
1847 GLenum attachment,
1848 GLenum pname,
1849 GLsizei bufSize,
1850 GLsizei *length,
1851 GLint *params)
1852{
1853 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
1854}
1855
He Yunchao010e4db2017-03-03 14:22:06 +08001856void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
1857{
1858 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
1859 QueryRenderbufferiv(this, renderbuffer, pname, params);
1860}
1861
Brandon Jones59770802018-04-02 13:18:42 -07001862void Context::getRenderbufferParameterivRobust(GLenum target,
1863 GLenum pname,
1864 GLsizei bufSize,
1865 GLsizei *length,
1866 GLint *params)
1867{
1868 getRenderbufferParameteriv(target, pname, params);
1869}
1870
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001871void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001872{
1873 Texture *texture = getTargetTexture(target);
1874 QueryTexParameterfv(texture, pname, params);
1875}
1876
Brandon Jones59770802018-04-02 13:18:42 -07001877void Context::getTexParameterfvRobust(TextureType target,
1878 GLenum pname,
1879 GLsizei bufSize,
1880 GLsizei *length,
1881 GLfloat *params)
1882{
1883 getTexParameterfv(target, pname, params);
1884}
1885
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001886void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001887{
1888 Texture *texture = getTargetTexture(target);
1889 QueryTexParameteriv(texture, pname, params);
1890}
Jiajia Qin5451d532017-11-16 17:16:34 +08001891
Brandon Jones59770802018-04-02 13:18:42 -07001892void Context::getTexParameterivRobust(TextureType target,
1893 GLenum pname,
1894 GLsizei bufSize,
1895 GLsizei *length,
1896 GLint *params)
1897{
1898 getTexParameteriv(target, pname, params);
1899}
1900
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001901void Context::getTexParameterIivRobust(TextureType target,
1902 GLenum pname,
1903 GLsizei bufSize,
1904 GLsizei *length,
1905 GLint *params)
1906{
1907 UNIMPLEMENTED();
1908}
1909
1910void Context::getTexParameterIuivRobust(TextureType target,
1911 GLenum pname,
1912 GLsizei bufSize,
1913 GLsizei *length,
1914 GLuint *params)
1915{
1916 UNIMPLEMENTED();
1917}
1918
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001919void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08001920{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001921 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05001922 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08001923}
1924
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001925void Context::getTexLevelParameterivRobust(TextureTarget target,
1926 GLint level,
1927 GLenum pname,
1928 GLsizei bufSize,
1929 GLsizei *length,
1930 GLint *params)
1931{
1932 UNIMPLEMENTED();
1933}
1934
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001935void Context::getTexLevelParameterfv(TextureTarget target,
1936 GLint level,
1937 GLenum pname,
1938 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08001939{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001940 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05001941 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08001942}
1943
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001944void Context::getTexLevelParameterfvRobust(TextureTarget target,
1945 GLint level,
1946 GLenum pname,
1947 GLsizei bufSize,
1948 GLsizei *length,
1949 GLfloat *params)
1950{
1951 UNIMPLEMENTED();
1952}
1953
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001954void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08001955{
1956 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001957 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001958 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001959}
1960
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001961void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001962{
1963 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001964 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001965 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001966}
1967
Brandon Jones59770802018-04-02 13:18:42 -07001968void Context::texParameterfvRobust(TextureType target,
1969 GLenum pname,
1970 GLsizei bufSize,
1971 const GLfloat *params)
1972{
1973 texParameterfv(target, pname, params);
1974}
1975
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001976void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08001977{
1978 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001979 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001980 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001981}
1982
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001983void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001984{
1985 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001986 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001987 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001988}
1989
Brandon Jones59770802018-04-02 13:18:42 -07001990void Context::texParameterivRobust(TextureType target,
1991 GLenum pname,
1992 GLsizei bufSize,
1993 const GLint *params)
1994{
1995 texParameteriv(target, pname, params);
1996}
1997
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001998void Context::texParameterIivRobust(TextureType target,
1999 GLenum pname,
2000 GLsizei bufSize,
2001 const GLint *params)
2002{
2003 UNIMPLEMENTED();
2004}
2005
2006void Context::texParameterIuivRobust(TextureType target,
2007 GLenum pname,
2008 GLsizei bufSize,
2009 const GLuint *params)
2010{
2011 UNIMPLEMENTED();
2012}
2013
Jamie Madill675fe712016-12-19 13:07:54 -05002014void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002015{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002016 // No-op if zero count
2017 if (count == 0)
2018 {
2019 return;
2020 }
2021
Jamie Madill05b35b22017-10-03 09:01:44 -04002022 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002023 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002024 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002025}
2026
Jamie Madill675fe712016-12-19 13:07:54 -05002027void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002028{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002029 // No-op if zero count
2030 if (count == 0 || instanceCount == 0)
2031 {
2032 return;
2033 }
2034
Jamie Madill05b35b22017-10-03 09:01:44 -04002035 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002036 ANGLE_CONTEXT_TRY(
2037 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002038 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2039 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002040}
2041
Jamie Madill876429b2017-04-20 15:46:24 -04002042void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002043{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002044 // No-op if zero count
2045 if (count == 0)
2046 {
2047 return;
2048 }
2049
Jamie Madill05b35b22017-10-03 09:01:44 -04002050 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002051 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002052}
2053
Jamie Madill675fe712016-12-19 13:07:54 -05002054void Context::drawElementsInstanced(GLenum mode,
2055 GLsizei count,
2056 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002057 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002058 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002059{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002060 // No-op if zero count
2061 if (count == 0 || instances == 0)
2062 {
2063 return;
2064 }
2065
Jamie Madill05b35b22017-10-03 09:01:44 -04002066 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002067 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002068 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002069}
2070
Jamie Madill675fe712016-12-19 13:07:54 -05002071void Context::drawRangeElements(GLenum mode,
2072 GLuint start,
2073 GLuint end,
2074 GLsizei count,
2075 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002076 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002077{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002078 // No-op if zero count
2079 if (count == 0)
2080 {
2081 return;
2082 }
2083
Jamie Madill05b35b22017-10-03 09:01:44 -04002084 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002085 ANGLE_CONTEXT_TRY(
2086 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002087}
2088
Jamie Madill876429b2017-04-20 15:46:24 -04002089void Context::drawArraysIndirect(GLenum mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002090{
Jamie Madill05b35b22017-10-03 09:01:44 -04002091 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002092 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002093}
2094
Jamie Madill876429b2017-04-20 15:46:24 -04002095void Context::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002096{
Jamie Madill05b35b22017-10-03 09:01:44 -04002097 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002098 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002099}
2100
Jamie Madill675fe712016-12-19 13:07:54 -05002101void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002102{
Jamie Madillafa02a22017-11-23 12:57:38 -05002103 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002104}
2105
Jamie Madill675fe712016-12-19 13:07:54 -05002106void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002107{
Jamie Madillafa02a22017-11-23 12:57:38 -05002108 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002109}
2110
Austin Kinross6ee1e782015-05-29 17:05:37 -07002111void Context::insertEventMarker(GLsizei length, const char *marker)
2112{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002113 ASSERT(mImplementation);
2114 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002115}
2116
2117void Context::pushGroupMarker(GLsizei length, const char *marker)
2118{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002119 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002120
2121 if (marker == nullptr)
2122 {
2123 // From the EXT_debug_marker spec,
2124 // "If <marker> is null then an empty string is pushed on the stack."
2125 mImplementation->pushGroupMarker(length, "");
2126 }
2127 else
2128 {
2129 mImplementation->pushGroupMarker(length, marker);
2130 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002131}
2132
2133void Context::popGroupMarker()
2134{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002135 ASSERT(mImplementation);
2136 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002137}
2138
Geoff Langd8605522016-04-13 10:19:12 -04002139void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2140{
2141 Program *programObject = getProgram(program);
2142 ASSERT(programObject);
2143
2144 programObject->bindUniformLocation(location, name);
2145}
2146
Brandon Jones59770802018-04-02 13:18:42 -07002147void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002148{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002149 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002150}
2151
Brandon Jones59770802018-04-02 13:18:42 -07002152void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002153{
2154 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2155}
2156
Brandon Jones59770802018-04-02 13:18:42 -07002157void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002158{
2159 GLfloat I[16];
2160 angle::Matrix<GLfloat>::setToIdentity(I);
2161
2162 mGLState.loadPathRenderingMatrix(matrixMode, I);
2163}
2164
2165void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2166{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002167 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002168 if (!pathObj)
2169 return;
2170
2171 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002172 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002173
2174 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2175}
2176
2177void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2178{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002179 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002180 if (!pathObj)
2181 return;
2182
2183 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002184 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002185
2186 mImplementation->stencilStrokePath(pathObj, reference, mask);
2187}
2188
2189void Context::coverFillPath(GLuint path, GLenum coverMode)
2190{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002191 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002192 if (!pathObj)
2193 return;
2194
2195 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002196 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002197
2198 mImplementation->coverFillPath(pathObj, coverMode);
2199}
2200
2201void Context::coverStrokePath(GLuint path, GLenum coverMode)
2202{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002203 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002204 if (!pathObj)
2205 return;
2206
2207 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002208 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002209
2210 mImplementation->coverStrokePath(pathObj, coverMode);
2211}
2212
2213void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2214{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002215 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002216 if (!pathObj)
2217 return;
2218
2219 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002220 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002221
2222 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2223}
2224
2225void Context::stencilThenCoverStrokePath(GLuint path,
2226 GLint reference,
2227 GLuint mask,
2228 GLenum coverMode)
2229{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002230 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002231 if (!pathObj)
2232 return;
2233
2234 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002235 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002236
2237 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2238}
2239
Sami Väisänend59ca052016-06-21 16:10:00 +03002240void Context::coverFillPathInstanced(GLsizei numPaths,
2241 GLenum pathNameType,
2242 const void *paths,
2243 GLuint pathBase,
2244 GLenum coverMode,
2245 GLenum transformType,
2246 const GLfloat *transformValues)
2247{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002248 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002249
2250 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002251 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002252
2253 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2254}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002255
Sami Väisänend59ca052016-06-21 16:10:00 +03002256void Context::coverStrokePathInstanced(GLsizei numPaths,
2257 GLenum pathNameType,
2258 const void *paths,
2259 GLuint pathBase,
2260 GLenum coverMode,
2261 GLenum transformType,
2262 const GLfloat *transformValues)
2263{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002264 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002265
2266 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002267 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002268
2269 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2270 transformValues);
2271}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002272
Sami Väisänend59ca052016-06-21 16:10:00 +03002273void Context::stencilFillPathInstanced(GLsizei numPaths,
2274 GLenum pathNameType,
2275 const void *paths,
2276 GLuint pathBase,
2277 GLenum fillMode,
2278 GLuint mask,
2279 GLenum transformType,
2280 const GLfloat *transformValues)
2281{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002282 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002283
2284 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002285 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002286
2287 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2288 transformValues);
2289}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002290
Sami Väisänend59ca052016-06-21 16:10:00 +03002291void Context::stencilStrokePathInstanced(GLsizei numPaths,
2292 GLenum pathNameType,
2293 const void *paths,
2294 GLuint pathBase,
2295 GLint reference,
2296 GLuint mask,
2297 GLenum transformType,
2298 const GLfloat *transformValues)
2299{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002300 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002301
2302 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002303 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002304
2305 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2306 transformValues);
2307}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002308
Sami Väisänend59ca052016-06-21 16:10:00 +03002309void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2310 GLenum pathNameType,
2311 const void *paths,
2312 GLuint pathBase,
2313 GLenum fillMode,
2314 GLuint mask,
2315 GLenum coverMode,
2316 GLenum transformType,
2317 const GLfloat *transformValues)
2318{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002319 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002320
2321 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002322 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002323
2324 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2325 transformType, transformValues);
2326}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002327
Sami Väisänend59ca052016-06-21 16:10:00 +03002328void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2329 GLenum pathNameType,
2330 const void *paths,
2331 GLuint pathBase,
2332 GLint reference,
2333 GLuint mask,
2334 GLenum coverMode,
2335 GLenum transformType,
2336 const GLfloat *transformValues)
2337{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002338 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002339
2340 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002341 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002342
2343 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2344 transformType, transformValues);
2345}
2346
Sami Väisänen46eaa942016-06-29 10:26:37 +03002347void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2348{
2349 auto *programObject = getProgram(program);
2350
2351 programObject->bindFragmentInputLocation(location, name);
2352}
2353
2354void Context::programPathFragmentInputGen(GLuint program,
2355 GLint location,
2356 GLenum genMode,
2357 GLint components,
2358 const GLfloat *coeffs)
2359{
2360 auto *programObject = getProgram(program);
2361
Jamie Madillbd044ed2017-06-05 12:59:21 -04002362 programObject->pathFragmentInputGen(this, location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002363}
2364
jchen1015015f72017-03-16 13:54:21 +08002365GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2366{
jchen10fd7c3b52017-03-21 15:36:03 +08002367 const auto *programObject = getProgram(program);
jchen1015015f72017-03-16 13:54:21 +08002368 return QueryProgramResourceIndex(programObject, programInterface, name);
2369}
2370
jchen10fd7c3b52017-03-21 15:36:03 +08002371void Context::getProgramResourceName(GLuint program,
2372 GLenum programInterface,
2373 GLuint index,
2374 GLsizei bufSize,
2375 GLsizei *length,
2376 GLchar *name)
2377{
2378 const auto *programObject = getProgram(program);
2379 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2380}
2381
jchen10191381f2017-04-11 13:59:04 +08002382GLint Context::getProgramResourceLocation(GLuint program,
2383 GLenum programInterface,
2384 const GLchar *name)
2385{
2386 const auto *programObject = getProgram(program);
2387 return QueryProgramResourceLocation(programObject, programInterface, name);
2388}
2389
jchen10880683b2017-04-12 16:21:55 +08002390void Context::getProgramResourceiv(GLuint program,
2391 GLenum programInterface,
2392 GLuint index,
2393 GLsizei propCount,
2394 const GLenum *props,
2395 GLsizei bufSize,
2396 GLsizei *length,
2397 GLint *params)
2398{
2399 const auto *programObject = getProgram(program);
2400 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2401 length, params);
2402}
2403
jchen10d9cd7b72017-08-30 15:04:25 +08002404void Context::getProgramInterfaceiv(GLuint program,
2405 GLenum programInterface,
2406 GLenum pname,
2407 GLint *params)
2408{
2409 const auto *programObject = getProgram(program);
2410 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2411}
2412
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002413void Context::getProgramInterfaceivRobust(GLuint program,
2414 GLenum programInterface,
2415 GLenum pname,
2416 GLsizei bufSize,
2417 GLsizei *length,
2418 GLint *params)
2419{
2420 UNIMPLEMENTED();
2421}
2422
Jamie Madill71c88b32017-09-14 22:20:29 -04002423void Context::handleError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002424{
Geoff Langda5777c2014-07-11 09:52:58 -04002425 if (error.isError())
2426 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002427 GLenum code = error.getCode();
2428 mErrors.insert(code);
2429 if (code == GL_OUT_OF_MEMORY && getWorkarounds().loseContextOnOutOfMemory)
2430 {
2431 markContextLost();
2432 }
Geoff Lang70d0f492015-12-10 17:45:46 -05002433
Geoff Langee6884e2017-11-09 16:51:11 -05002434 ASSERT(!error.getMessage().empty());
2435 mGLState.getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
2436 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
Geoff Langda5777c2014-07-11 09:52:58 -04002437 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002438}
2439
2440// Get one of the recorded errors and clear its flag, if any.
2441// [OpenGL ES 2.0.24] section 2.5 page 13.
2442GLenum Context::getError()
2443{
Geoff Langda5777c2014-07-11 09:52:58 -04002444 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002445 {
Geoff Langda5777c2014-07-11 09:52:58 -04002446 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002447 }
Geoff Langda5777c2014-07-11 09:52:58 -04002448 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002449 {
Geoff Langda5777c2014-07-11 09:52:58 -04002450 GLenum error = *mErrors.begin();
2451 mErrors.erase(mErrors.begin());
2452 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002453 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002454}
2455
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002456// NOTE: this function should not assume that this context is current!
2457void Context::markContextLost()
2458{
2459 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002460 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002461 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002462 mContextLostForced = true;
2463 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002464 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002465}
2466
2467bool Context::isContextLost()
2468{
2469 return mContextLost;
2470}
2471
Jamie Madillfa920eb2018-01-04 11:45:50 -05002472GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002473{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002474 // Even if the application doesn't want to know about resets, we want to know
2475 // as it will allow us to skip all the calls.
2476 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002477 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002478 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002479 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002480 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002481 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002482
2483 // EXT_robustness, section 2.6: If the reset notification behavior is
2484 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2485 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2486 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002487 }
2488
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002489 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2490 // status should be returned at least once, and GL_NO_ERROR should be returned
2491 // once the device has finished resetting.
2492 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002493 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002494 ASSERT(mResetStatus == GL_NO_ERROR);
2495 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002496
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002497 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002498 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002499 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002500 }
2501 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002502 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002503 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002504 // If markContextLost was used to mark the context lost then
2505 // assume that is not recoverable, and continue to report the
2506 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002507 mResetStatus = mImplementation->getResetStatus();
2508 }
Jamie Madill893ab082014-05-16 16:56:10 -04002509
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002510 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002511}
2512
2513bool Context::isResetNotificationEnabled()
2514{
2515 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2516}
2517
Corentin Walleze3b10e82015-05-20 11:06:25 -04002518const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002519{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002520 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002521}
2522
2523EGLenum Context::getClientType() const
2524{
2525 return mClientType;
2526}
2527
2528EGLenum Context::getRenderBuffer() const
2529{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002530 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2531 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002532 {
2533 return EGL_NONE;
2534 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002535
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002536 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002537 ASSERT(backAttachment != nullptr);
2538 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002539}
2540
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002541VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002542{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002543 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002544 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2545 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002546 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002547 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2548 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002549
Jamie Madill96a483b2017-06-27 16:49:21 -04002550 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002551 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002552
2553 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002554}
2555
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002556TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002557{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002558 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002559 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2560 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002561 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002562 transformFeedback =
2563 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002564 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002565 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002566 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002567
2568 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002569}
2570
2571bool Context::isVertexArrayGenerated(GLuint vertexArray)
2572{
Jamie Madill96a483b2017-06-27 16:49:21 -04002573 ASSERT(mVertexArrayMap.contains(0));
2574 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002575}
2576
2577bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2578{
Jamie Madill96a483b2017-06-27 16:49:21 -04002579 ASSERT(mTransformFeedbackMap.contains(0));
2580 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002581}
2582
Shannon Woods53a94a82014-06-24 15:20:36 -04002583void Context::detachTexture(GLuint texture)
2584{
2585 // Simple pass-through to State's detachTexture method, as textures do not require
2586 // allocation map management either here or in the resource manager at detach time.
2587 // Zero textures are held by the Context, and we don't attempt to request them from
2588 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002589 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002590}
2591
James Darpinian4d9d4832018-03-13 12:43:28 -07002592void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002593{
Yuly Novikov5807a532015-12-03 13:01:22 -05002594 // Simple pass-through to State's detachBuffer method, since
2595 // only buffer attachments to container objects that are bound to the current context
2596 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002597
Yuly Novikov5807a532015-12-03 13:01:22 -05002598 // [OpenGL ES 3.2] section 5.1.2 page 45:
2599 // Attachments to unbound container objects, such as
2600 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2601 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002602 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002603}
2604
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002605void Context::detachFramebuffer(GLuint framebuffer)
2606{
Shannon Woods53a94a82014-06-24 15:20:36 -04002607 // Framebuffer detachment is handled by Context, because 0 is a valid
2608 // Framebuffer object, and a pointer to it must be passed from Context
2609 // to State at binding time.
2610
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002611 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002612 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2613 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2614 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002615
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002616 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002617 {
2618 bindReadFramebuffer(0);
2619 }
2620
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002621 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002622 {
2623 bindDrawFramebuffer(0);
2624 }
2625}
2626
2627void Context::detachRenderbuffer(GLuint renderbuffer)
2628{
Jamie Madilla02315b2017-02-23 14:14:47 -05002629 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002630}
2631
Jamie Madill57a89722013-07-02 11:57:03 -04002632void Context::detachVertexArray(GLuint vertexArray)
2633{
Jamie Madill77a72f62015-04-14 11:18:32 -04002634 // Vertex array detachment is handled by Context, because 0 is a valid
2635 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002636 // binding time.
2637
Jamie Madill57a89722013-07-02 11:57:03 -04002638 // [OpenGL ES 3.0.2] section 2.10 page 43:
2639 // If a vertex array object that is currently bound is deleted, the binding
2640 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002641 if (mGLState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002642 {
2643 bindVertexArray(0);
2644 }
2645}
2646
Geoff Langc8058452014-02-03 12:04:11 -05002647void Context::detachTransformFeedback(GLuint transformFeedback)
2648{
Corentin Walleza2257da2016-04-19 16:43:12 -04002649 // Transform feedback detachment is handled by Context, because 0 is a valid
2650 // transform feedback, and a pointer to it must be passed from Context to State at
2651 // binding time.
2652
2653 // The OpenGL specification doesn't mention what should happen when the currently bound
2654 // transform feedback object is deleted. Since it is a container object, we treat it like
2655 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002656 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002657 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002658 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002659 }
Geoff Langc8058452014-02-03 12:04:11 -05002660}
2661
Jamie Madilldc356042013-07-19 16:36:57 -04002662void Context::detachSampler(GLuint sampler)
2663{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002664 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002665}
2666
Yunchao Hea336b902017-08-02 16:05:21 +08002667void Context::detachProgramPipeline(GLuint pipeline)
2668{
2669 mGLState.detachProgramPipeline(this, pipeline);
2670}
2671
Jamie Madill3ef140a2017-08-26 23:11:21 -04002672void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002673{
Shaodde78e82017-05-22 14:13:27 +08002674 mGLState.setVertexAttribDivisor(this, index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002675}
2676
Jamie Madille29d1672013-07-19 16:36:57 -04002677void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2678{
Geoff Langc1984ed2016-10-07 12:41:00 -04002679 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002680 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002681 SetSamplerParameteri(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002682 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002683}
Jamie Madille29d1672013-07-19 16:36:57 -04002684
Geoff Langc1984ed2016-10-07 12:41:00 -04002685void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2686{
2687 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002688 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002689 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002690 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002691}
2692
Brandon Jones59770802018-04-02 13:18:42 -07002693void Context::samplerParameterivRobust(GLuint sampler,
2694 GLenum pname,
2695 GLsizei bufSize,
2696 const GLint *param)
2697{
2698 samplerParameteriv(sampler, pname, param);
2699}
2700
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002701void Context::samplerParameterIivRobust(GLuint sampler,
2702 GLenum pname,
2703 GLsizei bufSize,
2704 const GLint *param)
2705{
2706 UNIMPLEMENTED();
2707}
2708
2709void Context::samplerParameterIuivRobust(GLuint sampler,
2710 GLenum pname,
2711 GLsizei bufSize,
2712 const GLuint *param)
2713{
2714 UNIMPLEMENTED();
2715}
2716
Jamie Madille29d1672013-07-19 16:36:57 -04002717void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2718{
Geoff Langc1984ed2016-10-07 12:41:00 -04002719 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002720 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002721 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002722 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002723}
2724
Geoff Langc1984ed2016-10-07 12:41:00 -04002725void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002726{
Geoff Langc1984ed2016-10-07 12:41:00 -04002727 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002728 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002729 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002730 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002731}
2732
Brandon Jones59770802018-04-02 13:18:42 -07002733void Context::samplerParameterfvRobust(GLuint sampler,
2734 GLenum pname,
2735 GLsizei bufSize,
2736 const GLfloat *param)
2737{
2738 samplerParameterfv(sampler, pname, param);
2739}
2740
Geoff Langc1984ed2016-10-07 12:41:00 -04002741void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002742{
Geoff Langc1984ed2016-10-07 12:41:00 -04002743 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002744 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002745 QuerySamplerParameteriv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002746 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002747}
Jamie Madill9675b802013-07-19 16:36:59 -04002748
Brandon Jones59770802018-04-02 13:18:42 -07002749void Context::getSamplerParameterivRobust(GLuint sampler,
2750 GLenum pname,
2751 GLsizei bufSize,
2752 GLsizei *length,
2753 GLint *params)
2754{
2755 getSamplerParameteriv(sampler, pname, params);
2756}
2757
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002758void Context::getSamplerParameterIivRobust(GLuint sampler,
2759 GLenum pname,
2760 GLsizei bufSize,
2761 GLsizei *length,
2762 GLint *params)
2763{
2764 UNIMPLEMENTED();
2765}
2766
2767void Context::getSamplerParameterIuivRobust(GLuint sampler,
2768 GLenum pname,
2769 GLsizei bufSize,
2770 GLsizei *length,
2771 GLuint *params)
2772{
2773 UNIMPLEMENTED();
2774}
2775
Geoff Langc1984ed2016-10-07 12:41:00 -04002776void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2777{
2778 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002779 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002780 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002781 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002782}
2783
Brandon Jones59770802018-04-02 13:18:42 -07002784void Context::getSamplerParameterfvRobust(GLuint sampler,
2785 GLenum pname,
2786 GLsizei bufSize,
2787 GLsizei *length,
2788 GLfloat *params)
2789{
2790 getSamplerParameterfv(sampler, pname, params);
2791}
2792
Olli Etuahof0fee072016-03-30 15:11:58 +03002793void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2794{
2795 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002796 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002797}
2798
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002799void Context::initRendererString()
2800{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002801 std::ostringstream rendererString;
2802 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002803 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002804 rendererString << ")";
2805
Geoff Langcec35902014-04-16 10:52:36 -04002806 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002807}
2808
Geoff Langc339c4e2016-11-29 10:37:36 -05002809void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002810{
Geoff Langc339c4e2016-11-29 10:37:36 -05002811 const Version &clientVersion = getClientVersion();
2812
2813 std::ostringstream versionString;
2814 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2815 << ANGLE_VERSION_STRING << ")";
2816 mVersionString = MakeStaticString(versionString.str());
2817
2818 std::ostringstream shadingLanguageVersionString;
2819 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2820 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2821 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2822 << ")";
2823 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002824}
2825
Geoff Langcec35902014-04-16 10:52:36 -04002826void Context::initExtensionStrings()
2827{
Geoff Langc339c4e2016-11-29 10:37:36 -05002828 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2829 std::ostringstream combinedStringStream;
2830 std::copy(strings.begin(), strings.end(),
2831 std::ostream_iterator<const char *>(combinedStringStream, " "));
2832 return MakeStaticString(combinedStringStream.str());
2833 };
2834
2835 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002836 for (const auto &extensionString : mExtensions.getStrings())
2837 {
2838 mExtensionStrings.push_back(MakeStaticString(extensionString));
2839 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002840 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002841
Bryan Bernhart58806562017-01-05 13:09:31 -08002842 const gl::Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2843
Geoff Langc339c4e2016-11-29 10:37:36 -05002844 mRequestableExtensionStrings.clear();
2845 for (const auto &extensionInfo : GetExtensionInfoMap())
2846 {
2847 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002848 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
2849 nativeExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002850 {
2851 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2852 }
2853 }
2854 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002855}
2856
Geoff Langc339c4e2016-11-29 10:37:36 -05002857const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04002858{
Geoff Langc339c4e2016-11-29 10:37:36 -05002859 switch (name)
2860 {
2861 case GL_VENDOR:
2862 return reinterpret_cast<const GLubyte *>("Google Inc.");
2863
2864 case GL_RENDERER:
2865 return reinterpret_cast<const GLubyte *>(mRendererString);
2866
2867 case GL_VERSION:
2868 return reinterpret_cast<const GLubyte *>(mVersionString);
2869
2870 case GL_SHADING_LANGUAGE_VERSION:
2871 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
2872
2873 case GL_EXTENSIONS:
2874 return reinterpret_cast<const GLubyte *>(mExtensionString);
2875
2876 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2877 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
2878
2879 default:
2880 UNREACHABLE();
2881 return nullptr;
2882 }
Geoff Langcec35902014-04-16 10:52:36 -04002883}
2884
Geoff Langc339c4e2016-11-29 10:37:36 -05002885const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04002886{
Geoff Langc339c4e2016-11-29 10:37:36 -05002887 switch (name)
2888 {
2889 case GL_EXTENSIONS:
2890 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
2891
2892 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2893 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
2894
2895 default:
2896 UNREACHABLE();
2897 return nullptr;
2898 }
Geoff Langcec35902014-04-16 10:52:36 -04002899}
2900
2901size_t Context::getExtensionStringCount() const
2902{
2903 return mExtensionStrings.size();
2904}
2905
Geoff Lang111a99e2017-10-17 10:58:41 -04002906bool Context::isExtensionRequestable(const char *name)
2907{
2908 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2909 auto extension = extensionInfos.find(name);
2910
2911 const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2912 return extension != extensionInfos.end() && extension->second.Requestable &&
2913 nativeExtensions.*(extension->second.ExtensionsMember);
2914}
2915
Geoff Langc339c4e2016-11-29 10:37:36 -05002916void Context::requestExtension(const char *name)
2917{
2918 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2919 ASSERT(extensionInfos.find(name) != extensionInfos.end());
2920 const auto &extension = extensionInfos.at(name);
2921 ASSERT(extension.Requestable);
Geoff Lang111a99e2017-10-17 10:58:41 -04002922 ASSERT(mImplementation->getNativeExtensions().*(extension.ExtensionsMember));
Geoff Langc339c4e2016-11-29 10:37:36 -05002923
2924 if (mExtensions.*(extension.ExtensionsMember))
2925 {
2926 // Extension already enabled
2927 return;
2928 }
2929
2930 mExtensions.*(extension.ExtensionsMember) = true;
2931 updateCaps();
2932 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08002933
Jamie Madill2f348d22017-06-05 10:50:59 -04002934 // Release the shader compiler so it will be re-created with the requested extensions enabled.
2935 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04002936
Jamie Madill81c2e252017-09-09 23:32:46 -04002937 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
2938 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05002939 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04002940 for (auto &zeroTexture : mZeroTextures)
2941 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002942 if (zeroTexture.get() != nullptr)
2943 {
2944 zeroTexture->signalDirty(this, InitState::Initialized);
2945 }
Geoff Lang9aded172017-04-05 11:07:56 -04002946 }
2947
2948 mState.mFramebuffers->invalidateFramebufferComplenessCache();
Geoff Langc339c4e2016-11-29 10:37:36 -05002949}
2950
2951size_t Context::getRequestableExtensionStringCount() const
2952{
2953 return mRequestableExtensionStrings.size();
2954}
2955
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002956void Context::beginTransformFeedback(GLenum primitiveMode)
2957{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002958 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002959 ASSERT(transformFeedback != nullptr);
2960 ASSERT(!transformFeedback->isPaused());
2961
Jamie Madill6c1f6712017-02-14 19:08:04 -05002962 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002963}
2964
2965bool Context::hasActiveTransformFeedback(GLuint program) const
2966{
2967 for (auto pair : mTransformFeedbackMap)
2968 {
2969 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
2970 {
2971 return true;
2972 }
2973 }
2974 return false;
2975}
2976
Geoff Langb433e872017-10-05 14:01:47 -04002977void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit)
Geoff Lang493daf52014-07-03 13:38:44 -04002978{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002979 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04002980
Lingfeng Yang01074432018-04-16 10:19:51 -07002981 mExtensions = mImplementation->getNativeExtensions();
2982
2983 mLimitations = mImplementation->getNativeLimitations();
2984
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08002985 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
2986 if (getClientVersion() < Version(2, 0))
2987 {
2988 mCaps.maxMultitextureUnits = 4;
2989 mCaps.maxClipPlanes = 6;
2990 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07002991 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
2992 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
2993 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang01074432018-04-16 10:19:51 -07002994
2995 // Default extensions for GLES1
2996 mExtensions.pointSizeArray = true;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08002997 }
2998
Geoff Langeb66a6e2016-10-31 13:06:12 -04002999 if (getClientVersion() < Version(3, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04003000 {
3001 // Disable ES3+ extensions
Jamie Madill231c7f52017-04-26 13:45:37 -04003002 mExtensions.colorBufferFloat = false;
Geoff Langb66a9092016-05-16 15:59:14 -04003003 mExtensions.eglImageExternalEssl3 = false;
Vincent Lang25ab4512016-05-13 18:13:59 +02003004 mExtensions.textureNorm16 = false;
Martin Radev137032d2017-07-13 10:11:12 +03003005 mExtensions.multiview = false;
3006 mExtensions.maxViews = 1u;
Geoff Lang493daf52014-07-03 13:38:44 -04003007 }
3008
Jiawei Shao89be29a2017-11-06 14:36:45 +08003009 if (getClientVersion() < ES_3_1)
3010 {
3011 // Disable ES3.1+ extensions
3012 mExtensions.geometryShader = false;
3013 }
3014
Geoff Langeb66a6e2016-10-31 13:06:12 -04003015 if (getClientVersion() > Version(2, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04003016 {
3017 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
Jamie Madill231c7f52017-04-26 13:45:37 -04003018 // mExtensions.sRGB = false;
Geoff Lang493daf52014-07-03 13:38:44 -04003019 }
3020
Jamie Madill00ed7a12016-05-19 13:13:38 -04003021 // Some extensions are always available because they are implemented in the GL layer.
Jamie Madill231c7f52017-04-26 13:45:37 -04003022 mExtensions.bindUniformLocation = true;
3023 mExtensions.vertexArrayObject = true;
Geoff Langf41a7152016-09-19 15:11:17 -04003024 mExtensions.bindGeneratesResource = true;
Geoff Langfeb8c682017-02-13 16:07:35 -05003025 mExtensions.clientArrays = true;
Geoff Langc339c4e2016-11-29 10:37:36 -05003026 mExtensions.requestExtension = true;
Jamie Madill00ed7a12016-05-19 13:13:38 -04003027
3028 // Enable the no error extension if the context was created with the flag.
3029 mExtensions.noError = mSkipValidation;
3030
Corentin Wallezccab69d2017-01-27 16:57:15 -05003031 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Corentin Wallezc295e512017-01-27 17:47:50 -05003032 mExtensions.surfacelessContext = displayExtensions.surfacelessContext;
Corentin Wallezccab69d2017-01-27 16:57:15 -05003033
Geoff Lang70d0f492015-12-10 17:45:46 -05003034 // Explicitly enable GL_KHR_debug
3035 mExtensions.debug = true;
3036 mExtensions.maxDebugMessageLength = 1024;
3037 mExtensions.maxDebugLoggedMessages = 1024;
3038 mExtensions.maxDebugGroupStackDepth = 1024;
3039 mExtensions.maxLabelLength = 1024;
3040
Geoff Langff5b2d52016-09-07 11:32:23 -04003041 // Explicitly enable GL_ANGLE_robust_client_memory
3042 mExtensions.robustClientMemory = true;
3043
Jamie Madille08a1d32017-03-07 17:24:06 -05003044 // Determine robust resource init availability from EGL.
Geoff Langb433e872017-10-05 14:01:47 -04003045 mExtensions.robustResourceInitialization = robustResourceInit;
Jamie Madille08a1d32017-03-07 17:24:06 -05003046
Jiajia Qin8a7b3a02017-08-25 16:05:48 +08003047 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3048 // supports it.
3049 mExtensions.robustBufferAccessBehavior =
3050 mRobustAccess && mExtensions.robustBufferAccessBehavior;
3051
Jamie Madillc43be722017-07-13 16:22:14 -04003052 // Enable the cache control query unconditionally.
3053 mExtensions.programCacheControl = true;
3054
Geoff Lang301d1612014-07-09 10:34:37 -04003055 // Apply implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003056 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003057
Jamie Madill0f80ed82017-09-19 00:24:56 -04003058 if (getClientVersion() < ES_3_1)
3059 {
3060 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3061 }
3062 else
3063 {
3064 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3065 }
Geoff Lang301d1612014-07-09 10:34:37 -04003066
Jamie Madill0f80ed82017-09-19 00:24:56 -04003067 LimitCap(&mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
3068 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3069 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3070
3071 // Limit textures as well, so we can use fast bitsets with texture bindings.
3072 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
3073 LimitCap(&mCaps.maxVertexTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3074 LimitCap(&mCaps.maxTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003075
Jiawei Shaodb342272017-09-27 10:21:45 +08003076 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3077
Geoff Langc287ea62016-09-16 14:46:51 -04003078 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003079 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003080 for (const auto &extensionInfo : GetExtensionInfoMap())
3081 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003082 // If the user has requested that extensions start disabled and they are requestable,
3083 // disable them.
3084 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003085 {
3086 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3087 }
3088 }
3089
3090 // Generate texture caps
3091 updateCaps();
3092}
3093
3094void Context::updateCaps()
3095{
Geoff Lang900013c2014-07-07 11:32:19 -04003096 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003097 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003098
Jamie Madill7b62cf92017-11-02 15:20:49 -04003099 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003100 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003101 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003102 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003103
Geoff Lang0d8b7242015-09-09 14:56:53 -04003104 // Update the format caps based on the client version and extensions.
3105 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3106 // ES3.
3107 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003108 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003109 formatCaps.renderable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003110 formatCaps.renderable && formatInfo.renderSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003111 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003112 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003113
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003114 // OpenGL ES does not support multisampling with non-rendererable formats
3115 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Olli Etuaho50c562d2017-06-06 14:43:30 +03003116 if (!formatCaps.renderable ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003117 (getClientVersion() < ES_3_1 &&
3118 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003119 {
Geoff Langd87878e2014-09-19 15:42:59 -04003120 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003121 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003122 else
3123 {
3124 // We may have limited the max samples for some required renderbuffer formats due to
3125 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3126 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3127
3128 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3129 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3130 // exception of signed and unsigned integer formats."
3131 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3132 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3133 {
3134 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3135 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3136 }
3137
3138 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3139 if (getClientVersion() >= ES_3_1)
3140 {
3141 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3142 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3143 // the exception that the signed and unsigned integer formats are required only to
3144 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3145 // multisamples, which must be at least one."
3146 if (formatInfo.componentType == GL_INT ||
3147 formatInfo.componentType == GL_UNSIGNED_INT)
3148 {
3149 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3150 }
3151
3152 // GLES 3.1 section 19.3.1.
3153 if (formatCaps.texturable)
3154 {
3155 if (formatInfo.depthBits > 0)
3156 {
3157 mCaps.maxDepthTextureSamples =
3158 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3159 }
3160 else if (formatInfo.redBits > 0)
3161 {
3162 mCaps.maxColorTextureSamples =
3163 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3164 }
3165 }
3166 }
3167 }
Geoff Langd87878e2014-09-19 15:42:59 -04003168
3169 if (formatCaps.texturable && formatInfo.compressed)
3170 {
Geoff Langca271392017-04-05 12:30:00 -04003171 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003172 }
3173
Geoff Langca271392017-04-05 12:30:00 -04003174 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003175 }
Jamie Madill32447362017-06-28 14:53:52 -04003176
3177 // If program binary is disabled, blank out the memory cache pointer.
3178 if (!mImplementation->getNativeExtensions().getProgramBinary)
3179 {
3180 mMemoryProgramCache = nullptr;
3181 }
Corentin Walleze4477002017-12-01 14:39:58 -05003182
3183 // Compute which buffer types are allowed
3184 mValidBufferBindings.reset();
3185 mValidBufferBindings.set(BufferBinding::ElementArray);
3186 mValidBufferBindings.set(BufferBinding::Array);
3187
3188 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3189 {
3190 mValidBufferBindings.set(BufferBinding::PixelPack);
3191 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3192 }
3193
3194 if (getClientVersion() >= ES_3_0)
3195 {
3196 mValidBufferBindings.set(BufferBinding::CopyRead);
3197 mValidBufferBindings.set(BufferBinding::CopyWrite);
3198 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3199 mValidBufferBindings.set(BufferBinding::Uniform);
3200 }
3201
3202 if (getClientVersion() >= ES_3_1)
3203 {
3204 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3205 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3206 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3207 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3208 }
Geoff Lang493daf52014-07-03 13:38:44 -04003209}
3210
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003211void Context::initWorkarounds()
3212{
Jamie Madill761b02c2017-06-23 16:27:06 -04003213 // Apply back-end workarounds.
3214 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3215
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003216 // Lose the context upon out of memory error if the application is
3217 // expecting to watch for those events.
3218 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3219}
3220
Jamie Madill05b35b22017-10-03 09:01:44 -04003221Error Context::prepareForDraw()
3222{
Geoff Langa8cb2872018-03-09 16:09:40 -05003223 ANGLE_TRY(syncDirtyObjects());
Jamie Madilla59fc192017-11-02 12:57:58 -04003224
3225 if (isRobustResourceInitEnabled())
3226 {
3227 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3228 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3229 }
3230
Geoff Langa8cb2872018-03-09 16:09:40 -05003231 ANGLE_TRY(syncDirtyBits());
Geoff Langd4fff502017-09-22 11:28:28 -04003232 return NoError();
3233}
3234
3235Error Context::prepareForClear(GLbitfield mask)
3236{
Geoff Langa8cb2872018-03-09 16:09:40 -05003237 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003238 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003239 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003240 return NoError();
3241}
3242
3243Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3244{
Geoff Langa8cb2872018-03-09 16:09:40 -05003245 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003246 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3247 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003248 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003249 return NoError();
3250}
3251
Geoff Langa8cb2872018-03-09 16:09:40 -05003252Error Context::syncState()
Jamie Madill1b94d432015-08-07 13:23:23 -04003253{
Geoff Langa8cb2872018-03-09 16:09:40 -05003254 ANGLE_TRY(syncDirtyObjects());
3255 ANGLE_TRY(syncDirtyBits());
Jamie Madillbc918e72018-03-08 09:47:21 -05003256 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003257}
3258
Geoff Langa8cb2872018-03-09 16:09:40 -05003259Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003260{
Geoff Langa8cb2872018-03-09 16:09:40 -05003261 ANGLE_TRY(syncDirtyObjects(objectMask));
3262 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003263 return NoError();
3264}
3265
Geoff Langa8cb2872018-03-09 16:09:40 -05003266Error Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003267{
3268 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
3269 mImplementation->syncState(this, dirtyBits);
3270 mGLState.clearDirtyBits();
3271 return NoError();
3272}
3273
Geoff Langa8cb2872018-03-09 16:09:40 -05003274Error Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003275{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003276 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madillfe548342017-06-19 11:13:24 -04003277 mImplementation->syncState(this, dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003278 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillbc918e72018-03-08 09:47:21 -05003279 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003280}
Jamie Madillc29968b2016-01-20 11:17:23 -05003281
Geoff Langa8cb2872018-03-09 16:09:40 -05003282Error Context::syncDirtyObjects()
Geoff Langd4fff502017-09-22 11:28:28 -04003283{
3284 return mGLState.syncDirtyObjects(this);
3285}
3286
Geoff Langa8cb2872018-03-09 16:09:40 -05003287Error Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003288{
3289 return mGLState.syncDirtyObjects(this, objectMask);
3290}
3291
Jamie Madillc29968b2016-01-20 11:17:23 -05003292void Context::blitFramebuffer(GLint srcX0,
3293 GLint srcY0,
3294 GLint srcX1,
3295 GLint srcY1,
3296 GLint dstX0,
3297 GLint dstY0,
3298 GLint dstX1,
3299 GLint dstY1,
3300 GLbitfield mask,
3301 GLenum filter)
3302{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003303 if (mask == 0)
3304 {
3305 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3306 // buffers are copied.
3307 return;
3308 }
3309
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003310 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003311 ASSERT(drawFramebuffer);
3312
3313 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3314 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3315
Jamie Madillbc918e72018-03-08 09:47:21 -05003316 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003317
Jamie Madillc564c072017-06-01 12:45:42 -04003318 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003319}
Jamie Madillc29968b2016-01-20 11:17:23 -05003320
3321void Context::clear(GLbitfield mask)
3322{
Geoff Langd4fff502017-09-22 11:28:28 -04003323 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3324 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003325}
3326
3327void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3328{
Geoff Langd4fff502017-09-22 11:28:28 -04003329 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3330 ANGLE_CONTEXT_TRY(
3331 mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003332}
3333
3334void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3335{
Geoff Langd4fff502017-09-22 11:28:28 -04003336 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3337 ANGLE_CONTEXT_TRY(
3338 mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003339}
3340
3341void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3342{
Geoff Langd4fff502017-09-22 11:28:28 -04003343 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3344 ANGLE_CONTEXT_TRY(
3345 mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003346}
3347
3348void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3349{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003350 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003351 ASSERT(framebufferObject);
3352
3353 // If a buffer is not present, the clear has no effect
3354 if (framebufferObject->getDepthbuffer() == nullptr &&
3355 framebufferObject->getStencilbuffer() == nullptr)
3356 {
3357 return;
3358 }
3359
Geoff Langd4fff502017-09-22 11:28:28 -04003360 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3361 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003362}
3363
3364void Context::readPixels(GLint x,
3365 GLint y,
3366 GLsizei width,
3367 GLsizei height,
3368 GLenum format,
3369 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003370 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003371{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003372 if (width == 0 || height == 0)
3373 {
3374 return;
3375 }
3376
Jamie Madillbc918e72018-03-08 09:47:21 -05003377 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003378
Jamie Madillb6664922017-07-25 12:55:04 -04003379 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3380 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003381
3382 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003383 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003384}
3385
Brandon Jones59770802018-04-02 13:18:42 -07003386void Context::readPixelsRobust(GLint x,
3387 GLint y,
3388 GLsizei width,
3389 GLsizei height,
3390 GLenum format,
3391 GLenum type,
3392 GLsizei bufSize,
3393 GLsizei *length,
3394 GLsizei *columns,
3395 GLsizei *rows,
3396 void *pixels)
3397{
3398 readPixels(x, y, width, height, format, type, pixels);
3399}
3400
3401void Context::readnPixelsRobust(GLint x,
3402 GLint y,
3403 GLsizei width,
3404 GLsizei height,
3405 GLenum format,
3406 GLenum type,
3407 GLsizei bufSize,
3408 GLsizei *length,
3409 GLsizei *columns,
3410 GLsizei *rows,
3411 void *data)
3412{
3413 readPixels(x, y, width, height, format, type, data);
3414}
3415
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003416void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003417 GLint level,
3418 GLenum internalformat,
3419 GLint x,
3420 GLint y,
3421 GLsizei width,
3422 GLsizei height,
3423 GLint border)
3424{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003425 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003426 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003427
Jamie Madillc29968b2016-01-20 11:17:23 -05003428 Rectangle sourceArea(x, y, width, height);
3429
Jamie Madill05b35b22017-10-03 09:01:44 -04003430 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003431 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003432 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003433}
3434
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003435void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003436 GLint level,
3437 GLint xoffset,
3438 GLint yoffset,
3439 GLint x,
3440 GLint y,
3441 GLsizei width,
3442 GLsizei height)
3443{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003444 if (width == 0 || height == 0)
3445 {
3446 return;
3447 }
3448
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003449 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003450 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003451
Jamie Madillc29968b2016-01-20 11:17:23 -05003452 Offset destOffset(xoffset, yoffset, 0);
3453 Rectangle sourceArea(x, y, width, height);
3454
Jamie Madill05b35b22017-10-03 09:01:44 -04003455 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003456 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003457 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003458}
3459
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003460void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003461 GLint level,
3462 GLint xoffset,
3463 GLint yoffset,
3464 GLint zoffset,
3465 GLint x,
3466 GLint y,
3467 GLsizei width,
3468 GLsizei height)
3469{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003470 if (width == 0 || height == 0)
3471 {
3472 return;
3473 }
3474
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003475 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003476 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003477
Jamie Madillc29968b2016-01-20 11:17:23 -05003478 Offset destOffset(xoffset, yoffset, zoffset);
3479 Rectangle sourceArea(x, y, width, height);
3480
Jamie Madill05b35b22017-10-03 09:01:44 -04003481 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3482 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003483 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3484 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003485}
3486
3487void Context::framebufferTexture2D(GLenum target,
3488 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003489 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003490 GLuint texture,
3491 GLint level)
3492{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003493 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003494 ASSERT(framebuffer);
3495
3496 if (texture != 0)
3497 {
3498 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003499 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003500 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003501 }
3502 else
3503 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003504 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003505 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003506
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003507 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003508}
3509
3510void Context::framebufferRenderbuffer(GLenum target,
3511 GLenum attachment,
3512 GLenum renderbuffertarget,
3513 GLuint renderbuffer)
3514{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003515 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003516 ASSERT(framebuffer);
3517
3518 if (renderbuffer != 0)
3519 {
3520 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003521
Jamie Madillcc129372018-04-12 09:13:18 -04003522 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003523 renderbufferObject);
3524 }
3525 else
3526 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003527 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003528 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003529
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003530 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003531}
3532
3533void Context::framebufferTextureLayer(GLenum target,
3534 GLenum attachment,
3535 GLuint texture,
3536 GLint level,
3537 GLint layer)
3538{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003539 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003540 ASSERT(framebuffer);
3541
3542 if (texture != 0)
3543 {
3544 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003545 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003546 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003547 }
3548 else
3549 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003550 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003551 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003552
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003553 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003554}
3555
Brandon Jones59770802018-04-02 13:18:42 -07003556void Context::framebufferTextureMultiviewLayered(GLenum target,
3557 GLenum attachment,
3558 GLuint texture,
3559 GLint level,
3560 GLint baseViewIndex,
3561 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003562{
Martin Radev82ef7742017-08-08 17:44:58 +03003563 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3564 ASSERT(framebuffer);
3565
3566 if (texture != 0)
3567 {
3568 Texture *textureObj = getTexture(texture);
3569
Martin Radev18b75ba2017-08-15 15:50:40 +03003570 ImageIndex index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
Martin Radev82ef7742017-08-08 17:44:58 +03003571 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3572 numViews, baseViewIndex);
3573 }
3574 else
3575 {
3576 framebuffer->resetAttachment(this, attachment);
3577 }
3578
3579 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003580}
3581
Brandon Jones59770802018-04-02 13:18:42 -07003582void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3583 GLenum attachment,
3584 GLuint texture,
3585 GLint level,
3586 GLsizei numViews,
3587 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003588{
Martin Radev5dae57b2017-07-14 16:15:55 +03003589 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3590 ASSERT(framebuffer);
3591
3592 if (texture != 0)
3593 {
3594 Texture *textureObj = getTexture(texture);
3595
3596 ImageIndex index = ImageIndex::Make2D(level);
3597 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3598 textureObj, numViews, viewportOffsets);
3599 }
3600 else
3601 {
3602 framebuffer->resetAttachment(this, attachment);
3603 }
3604
3605 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003606}
3607
Jamie Madillc29968b2016-01-20 11:17:23 -05003608void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3609{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003610 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003611 ASSERT(framebuffer);
3612 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003613 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003614}
3615
3616void Context::readBuffer(GLenum mode)
3617{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003618 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003619 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003620 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003621}
3622
3623void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3624{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003625 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003626 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003627
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003628 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003629 ASSERT(framebuffer);
3630
3631 // The specification isn't clear what should be done when the framebuffer isn't complete.
3632 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003633 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003634}
3635
3636void Context::invalidateFramebuffer(GLenum target,
3637 GLsizei numAttachments,
3638 const GLenum *attachments)
3639{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003640 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003641 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003642
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003643 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003644 ASSERT(framebuffer);
3645
Jamie Madille98b1b52018-03-08 09:47:23 -05003646 bool complete = false;
3647 ANGLE_CONTEXT_TRY(framebuffer->isComplete(this, &complete));
3648 if (!complete)
Jamie Madillc29968b2016-01-20 11:17:23 -05003649 {
Jamie Madill437fa652016-05-03 15:13:24 -04003650 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003651 }
Jamie Madill437fa652016-05-03 15:13:24 -04003652
Jamie Madill4928b7c2017-06-20 12:57:39 -04003653 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003654}
3655
3656void Context::invalidateSubFramebuffer(GLenum target,
3657 GLsizei numAttachments,
3658 const GLenum *attachments,
3659 GLint x,
3660 GLint y,
3661 GLsizei width,
3662 GLsizei height)
3663{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003664 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003665 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003666
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003667 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003668 ASSERT(framebuffer);
3669
Jamie Madille98b1b52018-03-08 09:47:23 -05003670 bool complete = false;
3671 ANGLE_CONTEXT_TRY(framebuffer->isComplete(this, &complete));
3672 if (!complete)
Jamie Madillc29968b2016-01-20 11:17:23 -05003673 {
Jamie Madill437fa652016-05-03 15:13:24 -04003674 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003675 }
Jamie Madill437fa652016-05-03 15:13:24 -04003676
3677 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003678 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003679}
3680
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003681void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003682 GLint level,
3683 GLint internalformat,
3684 GLsizei width,
3685 GLsizei height,
3686 GLint border,
3687 GLenum format,
3688 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003689 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003690{
Jamie Madillbc918e72018-03-08 09:47:21 -05003691 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003692
3693 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003694 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003695 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3696 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003697}
3698
Brandon Jones59770802018-04-02 13:18:42 -07003699void Context::texImage2DRobust(TextureTarget target,
3700 GLint level,
3701 GLint internalformat,
3702 GLsizei width,
3703 GLsizei height,
3704 GLint border,
3705 GLenum format,
3706 GLenum type,
3707 GLsizei bufSize,
3708 const void *pixels)
3709{
3710 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
3711}
3712
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003713void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003714 GLint level,
3715 GLint internalformat,
3716 GLsizei width,
3717 GLsizei height,
3718 GLsizei depth,
3719 GLint border,
3720 GLenum format,
3721 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003722 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003723{
Jamie Madillbc918e72018-03-08 09:47:21 -05003724 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003725
3726 Extents size(width, height, depth);
3727 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003728 handleError(texture->setImage(this, mGLState.getUnpackState(),
3729 NonCubeTextureTypeToTarget(target), level, internalformat, size,
3730 format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003731}
3732
Brandon Jones59770802018-04-02 13:18:42 -07003733void Context::texImage3DRobust(TextureType target,
3734 GLint level,
3735 GLint internalformat,
3736 GLsizei width,
3737 GLsizei height,
3738 GLsizei depth,
3739 GLint border,
3740 GLenum format,
3741 GLenum type,
3742 GLsizei bufSize,
3743 const void *pixels)
3744{
3745 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
3746}
3747
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003748void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003749 GLint level,
3750 GLint xoffset,
3751 GLint yoffset,
3752 GLsizei width,
3753 GLsizei height,
3754 GLenum format,
3755 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003756 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003757{
3758 // Zero sized uploads are valid but no-ops
3759 if (width == 0 || height == 0)
3760 {
3761 return;
3762 }
3763
Jamie Madillbc918e72018-03-08 09:47:21 -05003764 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003765
3766 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003767 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003768 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3769 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003770}
3771
Brandon Jones59770802018-04-02 13:18:42 -07003772void Context::texSubImage2DRobust(TextureTarget target,
3773 GLint level,
3774 GLint xoffset,
3775 GLint yoffset,
3776 GLsizei width,
3777 GLsizei height,
3778 GLenum format,
3779 GLenum type,
3780 GLsizei bufSize,
3781 const void *pixels)
3782{
3783 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
3784}
3785
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003786void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003787 GLint level,
3788 GLint xoffset,
3789 GLint yoffset,
3790 GLint zoffset,
3791 GLsizei width,
3792 GLsizei height,
3793 GLsizei depth,
3794 GLenum format,
3795 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003796 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003797{
3798 // Zero sized uploads are valid but no-ops
3799 if (width == 0 || height == 0 || depth == 0)
3800 {
3801 return;
3802 }
3803
Jamie Madillbc918e72018-03-08 09:47:21 -05003804 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003805
3806 Box area(xoffset, yoffset, zoffset, width, height, depth);
3807 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003808 handleError(texture->setSubImage(this, mGLState.getUnpackState(),
3809 NonCubeTextureTypeToTarget(target), level, area, format, type,
3810 reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003811}
3812
Brandon Jones59770802018-04-02 13:18:42 -07003813void Context::texSubImage3DRobust(TextureType target,
3814 GLint level,
3815 GLint xoffset,
3816 GLint yoffset,
3817 GLint zoffset,
3818 GLsizei width,
3819 GLsizei height,
3820 GLsizei depth,
3821 GLenum format,
3822 GLenum type,
3823 GLsizei bufSize,
3824 const void *pixels)
3825{
3826 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
3827 pixels);
3828}
3829
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003830void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003831 GLint level,
3832 GLenum internalformat,
3833 GLsizei width,
3834 GLsizei height,
3835 GLint border,
3836 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003837 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003838{
Jamie Madillbc918e72018-03-08 09:47:21 -05003839 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003840
3841 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003842 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003843 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
3844 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003845 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003846}
3847
Brandon Jones59770802018-04-02 13:18:42 -07003848void Context::compressedTexImage2DRobust(TextureTarget target,
3849 GLint level,
3850 GLenum internalformat,
3851 GLsizei width,
3852 GLsizei height,
3853 GLint border,
3854 GLsizei imageSize,
3855 GLsizei dataSize,
3856 const GLvoid *data)
3857{
3858 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
3859}
3860
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003861void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003862 GLint level,
3863 GLenum internalformat,
3864 GLsizei width,
3865 GLsizei height,
3866 GLsizei depth,
3867 GLint border,
3868 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003869 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003870{
Jamie Madillbc918e72018-03-08 09:47:21 -05003871 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003872
3873 Extents size(width, height, depth);
3874 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003875 handleError(texture->setCompressedImage(
3876 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
3877 size, imageSize, reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003878}
3879
Brandon Jones59770802018-04-02 13:18:42 -07003880void Context::compressedTexImage3DRobust(TextureType target,
3881 GLint level,
3882 GLenum internalformat,
3883 GLsizei width,
3884 GLsizei height,
3885 GLsizei depth,
3886 GLint border,
3887 GLsizei imageSize,
3888 GLsizei dataSize,
3889 const GLvoid *data)
3890{
3891 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
3892 data);
3893}
3894
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003895void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003896 GLint level,
3897 GLint xoffset,
3898 GLint yoffset,
3899 GLsizei width,
3900 GLsizei height,
3901 GLenum format,
3902 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003903 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003904{
Jamie Madillbc918e72018-03-08 09:47:21 -05003905 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003906
3907 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003908 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003909 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
3910 format, imageSize,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003911 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003912}
3913
Brandon Jones59770802018-04-02 13:18:42 -07003914void Context::compressedTexSubImage2DRobust(TextureTarget target,
3915 GLint level,
3916 GLint xoffset,
3917 GLint yoffset,
3918 GLsizei width,
3919 GLsizei height,
3920 GLenum format,
3921 GLsizei imageSize,
3922 GLsizei dataSize,
3923 const GLvoid *data)
3924{
3925 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
3926 data);
3927}
3928
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003929void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003930 GLint level,
3931 GLint xoffset,
3932 GLint yoffset,
3933 GLint zoffset,
3934 GLsizei width,
3935 GLsizei height,
3936 GLsizei depth,
3937 GLenum format,
3938 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003939 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003940{
3941 // Zero sized uploads are valid but no-ops
3942 if (width == 0 || height == 0)
3943 {
3944 return;
3945 }
3946
Jamie Madillbc918e72018-03-08 09:47:21 -05003947 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003948
3949 Box area(xoffset, yoffset, zoffset, width, height, depth);
3950 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003951 handleError(texture->setCompressedSubImage(
3952 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
3953 imageSize, reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003954}
3955
Brandon Jones59770802018-04-02 13:18:42 -07003956void Context::compressedTexSubImage3DRobust(TextureType target,
3957 GLint level,
3958 GLint xoffset,
3959 GLint yoffset,
3960 GLint zoffset,
3961 GLsizei width,
3962 GLsizei height,
3963 GLsizei depth,
3964 GLenum format,
3965 GLsizei imageSize,
3966 GLsizei dataSize,
3967 const GLvoid *data)
3968{
3969 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
3970 imageSize, data);
3971}
3972
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003973void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003974{
3975 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003976 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003977}
3978
Jamie Madill007530e2017-12-28 14:27:04 -05003979void Context::copyTexture(GLuint sourceId,
3980 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05003981 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05003982 GLuint destId,
3983 GLint destLevel,
3984 GLint internalFormat,
3985 GLenum destType,
3986 GLboolean unpackFlipY,
3987 GLboolean unpackPremultiplyAlpha,
3988 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07003989{
Jamie Madillbc918e72018-03-08 09:47:21 -05003990 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07003991
3992 gl::Texture *sourceTexture = getTexture(sourceId);
3993 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05003994 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
3995 sourceLevel, ConvertToBool(unpackFlipY),
3996 ConvertToBool(unpackPremultiplyAlpha),
3997 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003998}
3999
Jamie Madill007530e2017-12-28 14:27:04 -05004000void Context::copySubTexture(GLuint sourceId,
4001 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004002 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004003 GLuint destId,
4004 GLint destLevel,
4005 GLint xoffset,
4006 GLint yoffset,
4007 GLint x,
4008 GLint y,
4009 GLsizei width,
4010 GLsizei height,
4011 GLboolean unpackFlipY,
4012 GLboolean unpackPremultiplyAlpha,
4013 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004014{
4015 // Zero sized copies are valid but no-ops
4016 if (width == 0 || height == 0)
4017 {
4018 return;
4019 }
4020
Jamie Madillbc918e72018-03-08 09:47:21 -05004021 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004022
4023 gl::Texture *sourceTexture = getTexture(sourceId);
4024 gl::Texture *destTexture = getTexture(destId);
4025 Offset offset(xoffset, yoffset, 0);
4026 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05004027 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
4028 ConvertToBool(unpackFlipY),
4029 ConvertToBool(unpackPremultiplyAlpha),
4030 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004031}
4032
Jamie Madill007530e2017-12-28 14:27:04 -05004033void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004034{
Jamie Madillbc918e72018-03-08 09:47:21 -05004035 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004036
4037 gl::Texture *sourceTexture = getTexture(sourceId);
4038 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004039 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004040}
4041
Corentin Wallez336129f2017-10-17 15:55:40 -04004042void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004043{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004044 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004045 ASSERT(buffer);
4046
Geoff Lang496c02d2016-10-20 11:38:11 -07004047 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004048}
4049
Brandon Jones59770802018-04-02 13:18:42 -07004050void Context::getBufferPointervRobust(BufferBinding target,
4051 GLenum pname,
4052 GLsizei bufSize,
4053 GLsizei *length,
4054 void **params)
4055{
4056 getBufferPointerv(target, pname, params);
4057}
4058
Corentin Wallez336129f2017-10-17 15:55:40 -04004059void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004060{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004061 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004062 ASSERT(buffer);
4063
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004064 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004065 if (error.isError())
4066 {
Jamie Madill437fa652016-05-03 15:13:24 -04004067 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004068 return nullptr;
4069 }
4070
4071 return buffer->getMapPointer();
4072}
4073
Corentin Wallez336129f2017-10-17 15:55:40 -04004074GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004075{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004076 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004077 ASSERT(buffer);
4078
4079 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004080 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004081 if (error.isError())
4082 {
Jamie Madill437fa652016-05-03 15:13:24 -04004083 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004084 return GL_FALSE;
4085 }
4086
4087 return result;
4088}
4089
Corentin Wallez336129f2017-10-17 15:55:40 -04004090void *Context::mapBufferRange(BufferBinding target,
4091 GLintptr offset,
4092 GLsizeiptr length,
4093 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004094{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004095 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004096 ASSERT(buffer);
4097
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004098 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004099 if (error.isError())
4100 {
Jamie Madill437fa652016-05-03 15:13:24 -04004101 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004102 return nullptr;
4103 }
4104
4105 return buffer->getMapPointer();
4106}
4107
Corentin Wallez336129f2017-10-17 15:55:40 -04004108void Context::flushMappedBufferRange(BufferBinding /*target*/,
4109 GLintptr /*offset*/,
4110 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004111{
4112 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4113}
4114
Jamie Madillbc918e72018-03-08 09:47:21 -05004115Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004116{
Geoff Langa8cb2872018-03-09 16:09:40 -05004117 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004118}
4119
Jamie Madillbc918e72018-03-08 09:47:21 -05004120Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004121{
Geoff Langa8cb2872018-03-09 16:09:40 -05004122 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004123}
4124
Jamie Madillbc918e72018-03-08 09:47:21 -05004125Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004126{
Geoff Langa8cb2872018-03-09 16:09:40 -05004127 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004128}
4129
Jiajia Qin5451d532017-11-16 17:16:34 +08004130void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4131{
4132 UNIMPLEMENTED();
4133}
4134
Jamie Madillc20ab272016-06-09 07:20:46 -07004135void Context::activeTexture(GLenum texture)
4136{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004137 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004138}
4139
Jamie Madill876429b2017-04-20 15:46:24 -04004140void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004141{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004142 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004143}
4144
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004145void Context::blendEquation(GLenum mode)
4146{
4147 mGLState.setBlendEquation(mode, mode);
4148}
4149
Jamie Madillc20ab272016-06-09 07:20:46 -07004150void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4151{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004152 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004153}
4154
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004155void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4156{
4157 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4158}
4159
Jamie Madillc20ab272016-06-09 07:20:46 -07004160void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4161{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004162 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004163}
4164
Jamie Madill876429b2017-04-20 15:46:24 -04004165void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004166{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004167 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004168}
4169
Jamie Madill876429b2017-04-20 15:46:24 -04004170void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004171{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004172 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004173}
4174
4175void Context::clearStencil(GLint s)
4176{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004177 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004178}
4179
4180void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4181{
Geoff Lang92019432017-11-20 13:09:34 -05004182 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4183 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004184}
4185
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004186void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004187{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004188 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004189}
4190
4191void Context::depthFunc(GLenum func)
4192{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004193 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004194}
4195
4196void Context::depthMask(GLboolean flag)
4197{
Geoff Lang92019432017-11-20 13:09:34 -05004198 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004199}
4200
Jamie Madill876429b2017-04-20 15:46:24 -04004201void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004202{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004203 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004204}
4205
4206void Context::disable(GLenum cap)
4207{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004208 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07004209}
4210
4211void Context::disableVertexAttribArray(GLuint index)
4212{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004213 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07004214}
4215
4216void Context::enable(GLenum cap)
4217{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004218 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07004219}
4220
4221void Context::enableVertexAttribArray(GLuint index)
4222{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004223 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07004224}
4225
4226void Context::frontFace(GLenum mode)
4227{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004228 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004229}
4230
4231void Context::hint(GLenum target, GLenum mode)
4232{
4233 switch (target)
4234 {
4235 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004236 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004237 break;
4238
4239 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004240 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004241 break;
4242
4243 default:
4244 UNREACHABLE();
4245 return;
4246 }
4247}
4248
4249void Context::lineWidth(GLfloat width)
4250{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004251 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004252}
4253
4254void Context::pixelStorei(GLenum pname, GLint param)
4255{
4256 switch (pname)
4257 {
4258 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004259 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004260 break;
4261
4262 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004263 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004264 break;
4265
4266 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004267 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004268 break;
4269
4270 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004271 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004272 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004273 break;
4274
4275 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004276 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004277 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004278 break;
4279
4280 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004281 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004282 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004283 break;
4284
4285 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004286 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004287 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004288 break;
4289
4290 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004291 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004292 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004293 break;
4294
4295 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004296 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004297 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004298 break;
4299
4300 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004301 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004302 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004303 break;
4304
4305 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004306 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004307 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004308 break;
4309
4310 default:
4311 UNREACHABLE();
4312 return;
4313 }
4314}
4315
4316void Context::polygonOffset(GLfloat factor, GLfloat units)
4317{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004318 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004319}
4320
Jamie Madill876429b2017-04-20 15:46:24 -04004321void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004322{
Geoff Lang92019432017-11-20 13:09:34 -05004323 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004324}
4325
Jiawei Shaodb342272017-09-27 10:21:45 +08004326void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4327{
4328 mGLState.setSampleMaskParams(maskNumber, mask);
4329}
4330
Jamie Madillc20ab272016-06-09 07:20:46 -07004331void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4332{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004333 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004334}
4335
4336void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4337{
4338 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4339 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004340 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004341 }
4342
4343 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4344 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004345 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004346 }
4347}
4348
4349void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4350{
4351 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4352 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004353 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004354 }
4355
4356 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4357 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004358 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004359 }
4360}
4361
4362void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4363{
4364 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4365 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004366 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004367 }
4368
4369 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4370 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004371 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004372 }
4373}
4374
4375void Context::vertexAttrib1f(GLuint index, GLfloat x)
4376{
4377 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004378 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004379}
4380
4381void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4382{
4383 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004384 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004385}
4386
4387void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4388{
4389 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004390 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004391}
4392
4393void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4394{
4395 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004396 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004397}
4398
4399void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4400{
4401 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004402 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004403}
4404
4405void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4406{
4407 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004408 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004409}
4410
4411void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4412{
4413 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004414 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004415}
4416
4417void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4418{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004419 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07004420}
4421
4422void Context::vertexAttribPointer(GLuint index,
4423 GLint size,
4424 GLenum type,
4425 GLboolean normalized,
4426 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004427 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004428{
Corentin Wallez336129f2017-10-17 15:55:40 -04004429 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004430 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07004431}
4432
Shao80957d92017-02-20 21:25:59 +08004433void Context::vertexAttribFormat(GLuint attribIndex,
4434 GLint size,
4435 GLenum type,
4436 GLboolean normalized,
4437 GLuint relativeOffset)
4438{
Geoff Lang92019432017-11-20 13:09:34 -05004439 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004440 relativeOffset);
4441}
4442
4443void Context::vertexAttribIFormat(GLuint attribIndex,
4444 GLint size,
4445 GLenum type,
4446 GLuint relativeOffset)
4447{
4448 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
4449}
4450
4451void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4452{
Shaodde78e82017-05-22 14:13:27 +08004453 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08004454}
4455
Jiajia Qin5451d532017-11-16 17:16:34 +08004456void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004457{
4458 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
4459}
4460
Jamie Madillc20ab272016-06-09 07:20:46 -07004461void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4462{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004463 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004464}
4465
4466void Context::vertexAttribIPointer(GLuint index,
4467 GLint size,
4468 GLenum type,
4469 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004470 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004471{
Corentin Wallez336129f2017-10-17 15:55:40 -04004472 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4473 size, type, false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07004474}
4475
4476void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4477{
4478 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004479 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004480}
4481
4482void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4483{
4484 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004485 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004486}
4487
4488void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4489{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004490 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004491}
4492
4493void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4494{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004495 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004496}
4497
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004498void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4499{
4500 const VertexAttribCurrentValueData &currentValues =
4501 getGLState().getVertexAttribCurrentValue(index);
4502 const VertexArray *vao = getGLState().getVertexArray();
4503 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4504 currentValues, pname, params);
4505}
4506
Brandon Jones59770802018-04-02 13:18:42 -07004507void Context::getVertexAttribivRobust(GLuint index,
4508 GLenum pname,
4509 GLsizei bufSize,
4510 GLsizei *length,
4511 GLint *params)
4512{
4513 getVertexAttribiv(index, pname, params);
4514}
4515
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004516void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4517{
4518 const VertexAttribCurrentValueData &currentValues =
4519 getGLState().getVertexAttribCurrentValue(index);
4520 const VertexArray *vao = getGLState().getVertexArray();
4521 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4522 currentValues, pname, params);
4523}
4524
Brandon Jones59770802018-04-02 13:18:42 -07004525void Context::getVertexAttribfvRobust(GLuint index,
4526 GLenum pname,
4527 GLsizei bufSize,
4528 GLsizei *length,
4529 GLfloat *params)
4530{
4531 getVertexAttribfv(index, pname, params);
4532}
4533
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004534void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4535{
4536 const VertexAttribCurrentValueData &currentValues =
4537 getGLState().getVertexAttribCurrentValue(index);
4538 const VertexArray *vao = getGLState().getVertexArray();
4539 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4540 currentValues, pname, params);
4541}
4542
Brandon Jones59770802018-04-02 13:18:42 -07004543void Context::getVertexAttribIivRobust(GLuint index,
4544 GLenum pname,
4545 GLsizei bufSize,
4546 GLsizei *length,
4547 GLint *params)
4548{
4549 getVertexAttribIiv(index, pname, params);
4550}
4551
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004552void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4553{
4554 const VertexAttribCurrentValueData &currentValues =
4555 getGLState().getVertexAttribCurrentValue(index);
4556 const VertexArray *vao = getGLState().getVertexArray();
4557 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4558 currentValues, pname, params);
4559}
4560
Brandon Jones59770802018-04-02 13:18:42 -07004561void Context::getVertexAttribIuivRobust(GLuint index,
4562 GLenum pname,
4563 GLsizei bufSize,
4564 GLsizei *length,
4565 GLuint *params)
4566{
4567 getVertexAttribIuiv(index, pname, params);
4568}
4569
Jamie Madill876429b2017-04-20 15:46:24 -04004570void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004571{
4572 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4573 QueryVertexAttribPointerv(attrib, pname, pointer);
4574}
4575
Brandon Jones59770802018-04-02 13:18:42 -07004576void Context::getVertexAttribPointervRobust(GLuint index,
4577 GLenum pname,
4578 GLsizei bufSize,
4579 GLsizei *length,
4580 void **pointer)
4581{
4582 getVertexAttribPointerv(index, pname, pointer);
4583}
4584
Jamie Madillc20ab272016-06-09 07:20:46 -07004585void Context::debugMessageControl(GLenum source,
4586 GLenum type,
4587 GLenum severity,
4588 GLsizei count,
4589 const GLuint *ids,
4590 GLboolean enabled)
4591{
4592 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004593 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004594 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004595}
4596
4597void Context::debugMessageInsert(GLenum source,
4598 GLenum type,
4599 GLuint id,
4600 GLenum severity,
4601 GLsizei length,
4602 const GLchar *buf)
4603{
4604 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004605 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004606}
4607
4608void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4609{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004610 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004611}
4612
4613GLuint Context::getDebugMessageLog(GLuint count,
4614 GLsizei bufSize,
4615 GLenum *sources,
4616 GLenum *types,
4617 GLuint *ids,
4618 GLenum *severities,
4619 GLsizei *lengths,
4620 GLchar *messageLog)
4621{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004622 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4623 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004624}
4625
4626void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4627{
4628 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004629 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004630 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004631}
4632
4633void Context::popDebugGroup()
4634{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004635 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004636 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004637}
4638
Corentin Wallez336129f2017-10-17 15:55:40 -04004639void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004640{
4641 Buffer *buffer = mGLState.getTargetBuffer(target);
4642 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004643 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004644}
4645
Corentin Wallez336129f2017-10-17 15:55:40 -04004646void Context::bufferSubData(BufferBinding target,
4647 GLintptr offset,
4648 GLsizeiptr size,
4649 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004650{
4651 if (data == nullptr)
4652 {
4653 return;
4654 }
4655
4656 Buffer *buffer = mGLState.getTargetBuffer(target);
4657 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004658 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004659}
4660
Jamie Madillef300b12016-10-07 15:12:09 -04004661void Context::attachShader(GLuint program, GLuint shader)
4662{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004663 Program *programObject = mState.mShaderPrograms->getProgram(program);
4664 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004665 ASSERT(programObject && shaderObject);
4666 programObject->attachShader(shaderObject);
4667}
4668
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004669const Workarounds &Context::getWorkarounds() const
4670{
4671 return mWorkarounds;
4672}
4673
Corentin Wallez336129f2017-10-17 15:55:40 -04004674void Context::copyBufferSubData(BufferBinding readTarget,
4675 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04004676 GLintptr readOffset,
4677 GLintptr writeOffset,
4678 GLsizeiptr size)
4679{
4680 // if size is zero, the copy is a successful no-op
4681 if (size == 0)
4682 {
4683 return;
4684 }
4685
4686 // TODO(jmadill): cache these.
4687 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
4688 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4689
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004690 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004691}
4692
Jamie Madill01a80ee2016-11-07 12:06:18 -05004693void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4694{
4695 Program *programObject = getProgram(program);
4696 // TODO(jmadill): Re-use this from the validation if possible.
4697 ASSERT(programObject);
4698 programObject->bindAttributeLocation(index, name);
4699}
4700
Corentin Wallez336129f2017-10-17 15:55:40 -04004701void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004702{
Corentin Wallez336129f2017-10-17 15:55:40 -04004703 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4704 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004705}
4706
Corentin Wallez336129f2017-10-17 15:55:40 -04004707void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08004708{
4709 bindBufferRange(target, index, buffer, 0, 0);
4710}
4711
Corentin Wallez336129f2017-10-17 15:55:40 -04004712void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08004713 GLuint index,
4714 GLuint buffer,
4715 GLintptr offset,
4716 GLsizeiptr size)
4717{
Corentin Wallez336129f2017-10-17 15:55:40 -04004718 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4719 mGLState.setIndexedBufferBinding(this, target, index, bufferObject, offset, size);
Jiajia Qin6eafb042016-12-27 17:04:07 +08004720}
4721
Jamie Madill01a80ee2016-11-07 12:06:18 -05004722void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4723{
4724 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4725 {
4726 bindReadFramebuffer(framebuffer);
4727 }
4728
4729 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4730 {
4731 bindDrawFramebuffer(framebuffer);
4732 }
4733}
4734
4735void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4736{
4737 ASSERT(target == GL_RENDERBUFFER);
4738 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004739 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004740 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004741}
4742
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004743void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08004744 GLsizei samples,
4745 GLenum internalformat,
4746 GLsizei width,
4747 GLsizei height,
4748 GLboolean fixedsamplelocations)
4749{
4750 Extents size(width, height, 1);
4751 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004752 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
4753 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004754}
4755
4756void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
4757{
JiangYizhou5b03f472017-01-09 10:22:53 +08004758 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
4759 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05004760 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08004761 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08004762
4763 switch (pname)
4764 {
4765 case GL_SAMPLE_POSITION:
4766 handleError(framebuffer->getSamplePosition(index, val));
4767 break;
4768 default:
4769 UNREACHABLE();
4770 }
4771}
4772
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07004773void Context::getMultisamplefvRobust(GLenum pname,
4774 GLuint index,
4775 GLsizei bufSize,
4776 GLsizei *length,
4777 GLfloat *val)
4778{
4779 UNIMPLEMENTED();
4780}
4781
Jamie Madille8fb6402017-02-14 17:56:40 -05004782void Context::renderbufferStorage(GLenum target,
4783 GLenum internalformat,
4784 GLsizei width,
4785 GLsizei height)
4786{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004787 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4788 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
4789
Jamie Madille8fb6402017-02-14 17:56:40 -05004790 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04004791 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004792}
4793
4794void Context::renderbufferStorageMultisample(GLenum target,
4795 GLsizei samples,
4796 GLenum internalformat,
4797 GLsizei width,
4798 GLsizei height)
4799{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004800 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4801 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05004802
4803 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004804 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04004805 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004806}
4807
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004808void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
4809{
Jamie Madill70b5bb02017-08-28 13:32:37 -04004810 const Sync *syncObject = getSync(sync);
Geoff Lang82483b92017-04-11 15:33:00 -04004811 handleError(QuerySynciv(syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004812}
4813
JiangYizhoue18e6392017-02-20 10:32:23 +08004814void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
4815{
4816 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4817 QueryFramebufferParameteriv(framebuffer, pname, params);
4818}
4819
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07004820void Context::getFramebufferParameterivRobust(GLenum target,
4821 GLenum pname,
4822 GLsizei bufSize,
4823 GLsizei *length,
4824 GLint *params)
4825{
4826 UNIMPLEMENTED();
4827}
4828
Jiajia Qin5451d532017-11-16 17:16:34 +08004829void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08004830{
4831 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4832 SetFramebufferParameteri(framebuffer, pname, param);
4833}
4834
Jamie Madillb3f26b92017-07-19 15:07:41 -04004835Error Context::getScratchBuffer(size_t requstedSizeBytes,
4836 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05004837{
Jamie Madillb3f26b92017-07-19 15:07:41 -04004838 if (!mScratchBuffer.get(requstedSizeBytes, scratchBufferOut))
4839 {
4840 return OutOfMemory() << "Failed to allocate internal buffer.";
4841 }
4842 return NoError();
4843}
4844
4845Error Context::getZeroFilledBuffer(size_t requstedSizeBytes,
4846 angle::MemoryBuffer **zeroBufferOut) const
4847{
4848 if (!mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0))
Jamie Madille14951e2017-03-09 18:55:16 -05004849 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004850 return OutOfMemory() << "Failed to allocate internal buffer.";
Jamie Madille14951e2017-03-09 18:55:16 -05004851 }
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004852 return NoError();
Jamie Madille14951e2017-03-09 18:55:16 -05004853}
4854
Xinghua Cao10a4d432017-11-28 14:46:26 +08004855Error Context::prepareForDispatch()
4856{
Geoff Langa8cb2872018-03-09 16:09:40 -05004857 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08004858
4859 if (isRobustResourceInitEnabled())
4860 {
4861 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
4862 }
4863
4864 return NoError();
4865}
4866
Xinghua Cao2b396592017-03-29 15:36:04 +08004867void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
4868{
4869 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
4870 {
4871 return;
4872 }
4873
Xinghua Cao10a4d432017-11-28 14:46:26 +08004874 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04004875 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08004876}
4877
Jiajia Qin5451d532017-11-16 17:16:34 +08004878void Context::dispatchComputeIndirect(GLintptr indirect)
4879{
Qin Jiajia62fcf622017-11-30 16:16:12 +08004880 ANGLE_CONTEXT_TRY(prepareForDispatch());
4881 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08004882}
4883
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004884void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08004885 GLsizei levels,
4886 GLenum internalFormat,
4887 GLsizei width,
4888 GLsizei height)
4889{
4890 Extents size(width, height, 1);
4891 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004892 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08004893}
4894
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004895void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08004896 GLsizei levels,
4897 GLenum internalFormat,
4898 GLsizei width,
4899 GLsizei height,
4900 GLsizei depth)
4901{
4902 Extents size(width, height, depth);
4903 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004904 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08004905}
4906
Jiajia Qin5451d532017-11-16 17:16:34 +08004907void Context::memoryBarrier(GLbitfield barriers)
4908{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004909 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004910}
4911
4912void Context::memoryBarrierByRegion(GLbitfield barriers)
4913{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004914 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004915}
4916
Jamie Madillc1d770e2017-04-13 17:31:24 -04004917GLenum Context::checkFramebufferStatus(GLenum target)
4918{
4919 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4920 ASSERT(framebuffer);
4921
Jamie Madille98b1b52018-03-08 09:47:23 -05004922 GLenum status = GL_NONE;
4923 Error err = framebuffer->checkStatus(this, &status);
4924 if (err.isError())
4925 {
4926 handleError(err);
4927 return 0;
4928 }
4929 return status;
Jamie Madillc1d770e2017-04-13 17:31:24 -04004930}
4931
4932void Context::compileShader(GLuint shader)
4933{
4934 Shader *shaderObject = GetValidShader(this, shader);
4935 if (!shaderObject)
4936 {
4937 return;
4938 }
4939 shaderObject->compile(this);
4940}
4941
4942void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
4943{
4944 for (int i = 0; i < n; i++)
4945 {
4946 deleteBuffer(buffers[i]);
4947 }
4948}
4949
4950void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
4951{
4952 for (int i = 0; i < n; i++)
4953 {
4954 if (framebuffers[i] != 0)
4955 {
4956 deleteFramebuffer(framebuffers[i]);
4957 }
4958 }
4959}
4960
4961void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
4962{
4963 for (int i = 0; i < n; i++)
4964 {
4965 deleteRenderbuffer(renderbuffers[i]);
4966 }
4967}
4968
4969void Context::deleteTextures(GLsizei n, const GLuint *textures)
4970{
4971 for (int i = 0; i < n; i++)
4972 {
4973 if (textures[i] != 0)
4974 {
4975 deleteTexture(textures[i]);
4976 }
4977 }
4978}
4979
4980void Context::detachShader(GLuint program, GLuint shader)
4981{
4982 Program *programObject = getProgram(program);
4983 ASSERT(programObject);
4984
4985 Shader *shaderObject = getShader(shader);
4986 ASSERT(shaderObject);
4987
4988 programObject->detachShader(this, shaderObject);
4989}
4990
4991void Context::genBuffers(GLsizei n, GLuint *buffers)
4992{
4993 for (int i = 0; i < n; i++)
4994 {
4995 buffers[i] = createBuffer();
4996 }
4997}
4998
4999void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5000{
5001 for (int i = 0; i < n; i++)
5002 {
5003 framebuffers[i] = createFramebuffer();
5004 }
5005}
5006
5007void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5008{
5009 for (int i = 0; i < n; i++)
5010 {
5011 renderbuffers[i] = createRenderbuffer();
5012 }
5013}
5014
5015void Context::genTextures(GLsizei n, GLuint *textures)
5016{
5017 for (int i = 0; i < n; i++)
5018 {
5019 textures[i] = createTexture();
5020 }
5021}
5022
5023void Context::getActiveAttrib(GLuint program,
5024 GLuint index,
5025 GLsizei bufsize,
5026 GLsizei *length,
5027 GLint *size,
5028 GLenum *type,
5029 GLchar *name)
5030{
5031 Program *programObject = getProgram(program);
5032 ASSERT(programObject);
5033 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5034}
5035
5036void Context::getActiveUniform(GLuint program,
5037 GLuint index,
5038 GLsizei bufsize,
5039 GLsizei *length,
5040 GLint *size,
5041 GLenum *type,
5042 GLchar *name)
5043{
5044 Program *programObject = getProgram(program);
5045 ASSERT(programObject);
5046 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5047}
5048
5049void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5050{
5051 Program *programObject = getProgram(program);
5052 ASSERT(programObject);
5053 programObject->getAttachedShaders(maxcount, count, shaders);
5054}
5055
5056GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5057{
5058 Program *programObject = getProgram(program);
5059 ASSERT(programObject);
5060 return programObject->getAttributeLocation(name);
5061}
5062
5063void Context::getBooleanv(GLenum pname, GLboolean *params)
5064{
5065 GLenum nativeType;
5066 unsigned int numParams = 0;
5067 getQueryParameterInfo(pname, &nativeType, &numParams);
5068
5069 if (nativeType == GL_BOOL)
5070 {
5071 getBooleanvImpl(pname, params);
5072 }
5073 else
5074 {
5075 CastStateValues(this, nativeType, pname, numParams, params);
5076 }
5077}
5078
Brandon Jones59770802018-04-02 13:18:42 -07005079void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5080{
5081 getBooleanv(pname, params);
5082}
5083
Jamie Madillc1d770e2017-04-13 17:31:24 -04005084void Context::getFloatv(GLenum pname, GLfloat *params)
5085{
5086 GLenum nativeType;
5087 unsigned int numParams = 0;
5088 getQueryParameterInfo(pname, &nativeType, &numParams);
5089
5090 if (nativeType == GL_FLOAT)
5091 {
5092 getFloatvImpl(pname, params);
5093 }
5094 else
5095 {
5096 CastStateValues(this, nativeType, pname, numParams, params);
5097 }
5098}
5099
Brandon Jones59770802018-04-02 13:18:42 -07005100void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5101{
5102 getFloatv(pname, params);
5103}
5104
Jamie Madillc1d770e2017-04-13 17:31:24 -04005105void Context::getIntegerv(GLenum pname, GLint *params)
5106{
5107 GLenum nativeType;
5108 unsigned int numParams = 0;
5109 getQueryParameterInfo(pname, &nativeType, &numParams);
5110
5111 if (nativeType == GL_INT)
5112 {
5113 getIntegervImpl(pname, params);
5114 }
5115 else
5116 {
5117 CastStateValues(this, nativeType, pname, numParams, params);
5118 }
5119}
5120
Brandon Jones59770802018-04-02 13:18:42 -07005121void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5122{
5123 getIntegerv(pname, data);
5124}
5125
Jamie Madillc1d770e2017-04-13 17:31:24 -04005126void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5127{
5128 Program *programObject = getProgram(program);
5129 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005130 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005131}
5132
Brandon Jones59770802018-04-02 13:18:42 -07005133void Context::getProgramivRobust(GLuint program,
5134 GLenum pname,
5135 GLsizei bufSize,
5136 GLsizei *length,
5137 GLint *params)
5138{
5139 getProgramiv(program, pname, params);
5140}
5141
Jiajia Qin5451d532017-11-16 17:16:34 +08005142void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5143{
5144 UNIMPLEMENTED();
5145}
5146
Jamie Madillbe849e42017-05-02 15:49:00 -04005147void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005148{
5149 Program *programObject = getProgram(program);
5150 ASSERT(programObject);
5151 programObject->getInfoLog(bufsize, length, infolog);
5152}
5153
Jiajia Qin5451d532017-11-16 17:16:34 +08005154void Context::getProgramPipelineInfoLog(GLuint pipeline,
5155 GLsizei bufSize,
5156 GLsizei *length,
5157 GLchar *infoLog)
5158{
5159 UNIMPLEMENTED();
5160}
5161
Jamie Madillc1d770e2017-04-13 17:31:24 -04005162void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5163{
5164 Shader *shaderObject = getShader(shader);
5165 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04005166 QueryShaderiv(this, shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005167}
5168
Brandon Jones59770802018-04-02 13:18:42 -07005169void Context::getShaderivRobust(GLuint shader,
5170 GLenum pname,
5171 GLsizei bufSize,
5172 GLsizei *length,
5173 GLint *params)
5174{
5175 getShaderiv(shader, pname, params);
5176}
5177
Jamie Madillc1d770e2017-04-13 17:31:24 -04005178void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5179{
5180 Shader *shaderObject = getShader(shader);
5181 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04005182 shaderObject->getInfoLog(this, bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005183}
5184
5185void Context::getShaderPrecisionFormat(GLenum shadertype,
5186 GLenum precisiontype,
5187 GLint *range,
5188 GLint *precision)
5189{
5190 // TODO(jmadill): Compute shaders.
5191
5192 switch (shadertype)
5193 {
5194 case GL_VERTEX_SHADER:
5195 switch (precisiontype)
5196 {
5197 case GL_LOW_FLOAT:
5198 mCaps.vertexLowpFloat.get(range, precision);
5199 break;
5200 case GL_MEDIUM_FLOAT:
5201 mCaps.vertexMediumpFloat.get(range, precision);
5202 break;
5203 case GL_HIGH_FLOAT:
5204 mCaps.vertexHighpFloat.get(range, precision);
5205 break;
5206
5207 case GL_LOW_INT:
5208 mCaps.vertexLowpInt.get(range, precision);
5209 break;
5210 case GL_MEDIUM_INT:
5211 mCaps.vertexMediumpInt.get(range, precision);
5212 break;
5213 case GL_HIGH_INT:
5214 mCaps.vertexHighpInt.get(range, precision);
5215 break;
5216
5217 default:
5218 UNREACHABLE();
5219 return;
5220 }
5221 break;
5222
5223 case GL_FRAGMENT_SHADER:
5224 switch (precisiontype)
5225 {
5226 case GL_LOW_FLOAT:
5227 mCaps.fragmentLowpFloat.get(range, precision);
5228 break;
5229 case GL_MEDIUM_FLOAT:
5230 mCaps.fragmentMediumpFloat.get(range, precision);
5231 break;
5232 case GL_HIGH_FLOAT:
5233 mCaps.fragmentHighpFloat.get(range, precision);
5234 break;
5235
5236 case GL_LOW_INT:
5237 mCaps.fragmentLowpInt.get(range, precision);
5238 break;
5239 case GL_MEDIUM_INT:
5240 mCaps.fragmentMediumpInt.get(range, precision);
5241 break;
5242 case GL_HIGH_INT:
5243 mCaps.fragmentHighpInt.get(range, precision);
5244 break;
5245
5246 default:
5247 UNREACHABLE();
5248 return;
5249 }
5250 break;
5251
5252 default:
5253 UNREACHABLE();
5254 return;
5255 }
5256}
5257
5258void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5259{
5260 Shader *shaderObject = getShader(shader);
5261 ASSERT(shaderObject);
5262 shaderObject->getSource(bufsize, length, source);
5263}
5264
5265void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5266{
5267 Program *programObject = getProgram(program);
5268 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005269 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005270}
5271
Brandon Jones59770802018-04-02 13:18:42 -07005272void Context::getUniformfvRobust(GLuint program,
5273 GLint location,
5274 GLsizei bufSize,
5275 GLsizei *length,
5276 GLfloat *params)
5277{
5278 getUniformfv(program, location, params);
5279}
5280
Jamie Madillc1d770e2017-04-13 17:31:24 -04005281void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5282{
5283 Program *programObject = getProgram(program);
5284 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005285 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005286}
5287
Brandon Jones59770802018-04-02 13:18:42 -07005288void Context::getUniformivRobust(GLuint program,
5289 GLint location,
5290 GLsizei bufSize,
5291 GLsizei *length,
5292 GLint *params)
5293{
5294 getUniformiv(program, location, params);
5295}
5296
Jamie Madillc1d770e2017-04-13 17:31:24 -04005297GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5298{
5299 Program *programObject = getProgram(program);
5300 ASSERT(programObject);
5301 return programObject->getUniformLocation(name);
5302}
5303
5304GLboolean Context::isBuffer(GLuint buffer)
5305{
5306 if (buffer == 0)
5307 {
5308 return GL_FALSE;
5309 }
5310
5311 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5312}
5313
5314GLboolean Context::isEnabled(GLenum cap)
5315{
5316 return mGLState.getEnableFeature(cap);
5317}
5318
5319GLboolean Context::isFramebuffer(GLuint framebuffer)
5320{
5321 if (framebuffer == 0)
5322 {
5323 return GL_FALSE;
5324 }
5325
5326 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5327}
5328
5329GLboolean Context::isProgram(GLuint program)
5330{
5331 if (program == 0)
5332 {
5333 return GL_FALSE;
5334 }
5335
5336 return (getProgram(program) ? GL_TRUE : GL_FALSE);
5337}
5338
5339GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5340{
5341 if (renderbuffer == 0)
5342 {
5343 return GL_FALSE;
5344 }
5345
5346 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5347}
5348
5349GLboolean Context::isShader(GLuint shader)
5350{
5351 if (shader == 0)
5352 {
5353 return GL_FALSE;
5354 }
5355
5356 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5357}
5358
5359GLboolean Context::isTexture(GLuint texture)
5360{
5361 if (texture == 0)
5362 {
5363 return GL_FALSE;
5364 }
5365
5366 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5367}
5368
5369void Context::linkProgram(GLuint program)
5370{
5371 Program *programObject = getProgram(program);
5372 ASSERT(programObject);
5373 handleError(programObject->link(this));
Martin Radev0abb7a22017-08-28 15:34:45 +03005374 mGLState.onProgramExecutableChange(programObject);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005375}
5376
5377void Context::releaseShaderCompiler()
5378{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005379 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005380}
5381
5382void Context::shaderBinary(GLsizei n,
5383 const GLuint *shaders,
5384 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005385 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005386 GLsizei length)
5387{
5388 // No binary shader formats are supported.
5389 UNIMPLEMENTED();
5390}
5391
5392void Context::shaderSource(GLuint shader,
5393 GLsizei count,
5394 const GLchar *const *string,
5395 const GLint *length)
5396{
5397 Shader *shaderObject = getShader(shader);
5398 ASSERT(shaderObject);
5399 shaderObject->setSource(count, string, length);
5400}
5401
5402void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5403{
5404 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5405}
5406
5407void Context::stencilMask(GLuint mask)
5408{
5409 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5410}
5411
5412void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5413{
5414 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5415}
5416
5417void Context::uniform1f(GLint location, GLfloat x)
5418{
5419 Program *program = mGLState.getProgram();
5420 program->setUniform1fv(location, 1, &x);
5421}
5422
5423void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5424{
5425 Program *program = mGLState.getProgram();
5426 program->setUniform1fv(location, count, v);
5427}
5428
5429void Context::uniform1i(GLint location, GLint x)
5430{
5431 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04005432 if (program->setUniform1iv(location, 1, &x) == Program::SetUniformResult::SamplerChanged)
5433 {
5434 mGLState.setObjectDirty(GL_PROGRAM);
5435 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005436}
5437
5438void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5439{
5440 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04005441 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
5442 {
5443 mGLState.setObjectDirty(GL_PROGRAM);
5444 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005445}
5446
5447void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5448{
5449 GLfloat xy[2] = {x, y};
5450 Program *program = mGLState.getProgram();
5451 program->setUniform2fv(location, 1, xy);
5452}
5453
5454void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5455{
5456 Program *program = mGLState.getProgram();
5457 program->setUniform2fv(location, count, v);
5458}
5459
5460void Context::uniform2i(GLint location, GLint x, GLint y)
5461{
5462 GLint xy[2] = {x, y};
5463 Program *program = mGLState.getProgram();
5464 program->setUniform2iv(location, 1, xy);
5465}
5466
5467void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5468{
5469 Program *program = mGLState.getProgram();
5470 program->setUniform2iv(location, count, v);
5471}
5472
5473void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5474{
5475 GLfloat xyz[3] = {x, y, z};
5476 Program *program = mGLState.getProgram();
5477 program->setUniform3fv(location, 1, xyz);
5478}
5479
5480void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5481{
5482 Program *program = mGLState.getProgram();
5483 program->setUniform3fv(location, count, v);
5484}
5485
5486void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5487{
5488 GLint xyz[3] = {x, y, z};
5489 Program *program = mGLState.getProgram();
5490 program->setUniform3iv(location, 1, xyz);
5491}
5492
5493void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5494{
5495 Program *program = mGLState.getProgram();
5496 program->setUniform3iv(location, count, v);
5497}
5498
5499void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5500{
5501 GLfloat xyzw[4] = {x, y, z, w};
5502 Program *program = mGLState.getProgram();
5503 program->setUniform4fv(location, 1, xyzw);
5504}
5505
5506void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5507{
5508 Program *program = mGLState.getProgram();
5509 program->setUniform4fv(location, count, v);
5510}
5511
5512void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5513{
5514 GLint xyzw[4] = {x, y, z, w};
5515 Program *program = mGLState.getProgram();
5516 program->setUniform4iv(location, 1, xyzw);
5517}
5518
5519void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5520{
5521 Program *program = mGLState.getProgram();
5522 program->setUniform4iv(location, count, v);
5523}
5524
5525void Context::uniformMatrix2fv(GLint location,
5526 GLsizei count,
5527 GLboolean transpose,
5528 const GLfloat *value)
5529{
5530 Program *program = mGLState.getProgram();
5531 program->setUniformMatrix2fv(location, count, transpose, value);
5532}
5533
5534void Context::uniformMatrix3fv(GLint location,
5535 GLsizei count,
5536 GLboolean transpose,
5537 const GLfloat *value)
5538{
5539 Program *program = mGLState.getProgram();
5540 program->setUniformMatrix3fv(location, count, transpose, value);
5541}
5542
5543void Context::uniformMatrix4fv(GLint location,
5544 GLsizei count,
5545 GLboolean transpose,
5546 const GLfloat *value)
5547{
5548 Program *program = mGLState.getProgram();
5549 program->setUniformMatrix4fv(location, count, transpose, value);
5550}
5551
5552void Context::validateProgram(GLuint program)
5553{
5554 Program *programObject = getProgram(program);
5555 ASSERT(programObject);
5556 programObject->validate(mCaps);
5557}
5558
Jiajia Qin5451d532017-11-16 17:16:34 +08005559void Context::validateProgramPipeline(GLuint pipeline)
5560{
5561 UNIMPLEMENTED();
5562}
5563
Jamie Madilld04908b2017-06-09 14:15:35 -04005564void Context::getProgramBinary(GLuint program,
5565 GLsizei bufSize,
5566 GLsizei *length,
5567 GLenum *binaryFormat,
5568 void *binary)
5569{
5570 Program *programObject = getProgram(program);
5571 ASSERT(programObject != nullptr);
5572
5573 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
5574}
5575
5576void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
5577{
5578 Program *programObject = getProgram(program);
5579 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04005580
Jamie Madilld04908b2017-06-09 14:15:35 -04005581 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
5582}
5583
Jamie Madillff325f12017-08-26 15:06:05 -04005584void Context::uniform1ui(GLint location, GLuint v0)
5585{
5586 Program *program = mGLState.getProgram();
5587 program->setUniform1uiv(location, 1, &v0);
5588}
5589
5590void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
5591{
5592 Program *program = mGLState.getProgram();
5593 const GLuint xy[] = {v0, v1};
5594 program->setUniform2uiv(location, 1, xy);
5595}
5596
5597void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
5598{
5599 Program *program = mGLState.getProgram();
5600 const GLuint xyz[] = {v0, v1, v2};
5601 program->setUniform3uiv(location, 1, xyz);
5602}
5603
5604void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
5605{
5606 Program *program = mGLState.getProgram();
5607 const GLuint xyzw[] = {v0, v1, v2, v3};
5608 program->setUniform4uiv(location, 1, xyzw);
5609}
5610
5611void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
5612{
5613 Program *program = mGLState.getProgram();
5614 program->setUniform1uiv(location, count, value);
5615}
5616void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
5617{
5618 Program *program = mGLState.getProgram();
5619 program->setUniform2uiv(location, count, value);
5620}
5621
5622void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
5623{
5624 Program *program = mGLState.getProgram();
5625 program->setUniform3uiv(location, count, value);
5626}
5627
5628void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
5629{
5630 Program *program = mGLState.getProgram();
5631 program->setUniform4uiv(location, count, value);
5632}
5633
Jamie Madillf0e04492017-08-26 15:28:42 -04005634void Context::genQueries(GLsizei n, GLuint *ids)
5635{
5636 for (GLsizei i = 0; i < n; i++)
5637 {
5638 GLuint handle = mQueryHandleAllocator.allocate();
5639 mQueryMap.assign(handle, nullptr);
5640 ids[i] = handle;
5641 }
5642}
5643
5644void Context::deleteQueries(GLsizei n, const GLuint *ids)
5645{
5646 for (int i = 0; i < n; i++)
5647 {
5648 GLuint query = ids[i];
5649
5650 Query *queryObject = nullptr;
5651 if (mQueryMap.erase(query, &queryObject))
5652 {
5653 mQueryHandleAllocator.release(query);
5654 if (queryObject)
5655 {
5656 queryObject->release(this);
5657 }
5658 }
5659 }
5660}
5661
5662GLboolean Context::isQuery(GLuint id)
5663{
5664 return (getQuery(id, false, GL_NONE) != nullptr) ? GL_TRUE : GL_FALSE;
5665}
5666
Jamie Madillc8c95812017-08-26 18:40:09 -04005667void Context::uniformMatrix2x3fv(GLint location,
5668 GLsizei count,
5669 GLboolean transpose,
5670 const GLfloat *value)
5671{
5672 Program *program = mGLState.getProgram();
5673 program->setUniformMatrix2x3fv(location, count, transpose, value);
5674}
5675
5676void Context::uniformMatrix3x2fv(GLint location,
5677 GLsizei count,
5678 GLboolean transpose,
5679 const GLfloat *value)
5680{
5681 Program *program = mGLState.getProgram();
5682 program->setUniformMatrix3x2fv(location, count, transpose, value);
5683}
5684
5685void Context::uniformMatrix2x4fv(GLint location,
5686 GLsizei count,
5687 GLboolean transpose,
5688 const GLfloat *value)
5689{
5690 Program *program = mGLState.getProgram();
5691 program->setUniformMatrix2x4fv(location, count, transpose, value);
5692}
5693
5694void Context::uniformMatrix4x2fv(GLint location,
5695 GLsizei count,
5696 GLboolean transpose,
5697 const GLfloat *value)
5698{
5699 Program *program = mGLState.getProgram();
5700 program->setUniformMatrix4x2fv(location, count, transpose, value);
5701}
5702
5703void Context::uniformMatrix3x4fv(GLint location,
5704 GLsizei count,
5705 GLboolean transpose,
5706 const GLfloat *value)
5707{
5708 Program *program = mGLState.getProgram();
5709 program->setUniformMatrix3x4fv(location, count, transpose, value);
5710}
5711
5712void Context::uniformMatrix4x3fv(GLint location,
5713 GLsizei count,
5714 GLboolean transpose,
5715 const GLfloat *value)
5716{
5717 Program *program = mGLState.getProgram();
5718 program->setUniformMatrix4x3fv(location, count, transpose, value);
5719}
5720
Jamie Madilld7576732017-08-26 18:49:50 -04005721void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
5722{
5723 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5724 {
5725 GLuint vertexArray = arrays[arrayIndex];
5726
5727 if (arrays[arrayIndex] != 0)
5728 {
5729 VertexArray *vertexArrayObject = nullptr;
5730 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
5731 {
5732 if (vertexArrayObject != nullptr)
5733 {
5734 detachVertexArray(vertexArray);
5735 vertexArrayObject->onDestroy(this);
5736 }
5737
5738 mVertexArrayHandleAllocator.release(vertexArray);
5739 }
5740 }
5741 }
5742}
5743
5744void Context::genVertexArrays(GLsizei n, GLuint *arrays)
5745{
5746 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5747 {
5748 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
5749 mVertexArrayMap.assign(vertexArray, nullptr);
5750 arrays[arrayIndex] = vertexArray;
5751 }
5752}
5753
5754bool Context::isVertexArray(GLuint array)
5755{
5756 if (array == 0)
5757 {
5758 return GL_FALSE;
5759 }
5760
5761 VertexArray *vao = getVertexArray(array);
5762 return (vao != nullptr ? GL_TRUE : GL_FALSE);
5763}
5764
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04005765void Context::endTransformFeedback()
5766{
5767 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5768 transformFeedback->end(this);
5769}
5770
5771void Context::transformFeedbackVaryings(GLuint program,
5772 GLsizei count,
5773 const GLchar *const *varyings,
5774 GLenum bufferMode)
5775{
5776 Program *programObject = getProgram(program);
5777 ASSERT(programObject);
5778 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
5779}
5780
5781void Context::getTransformFeedbackVarying(GLuint program,
5782 GLuint index,
5783 GLsizei bufSize,
5784 GLsizei *length,
5785 GLsizei *size,
5786 GLenum *type,
5787 GLchar *name)
5788{
5789 Program *programObject = getProgram(program);
5790 ASSERT(programObject);
5791 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
5792}
5793
5794void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
5795{
5796 for (int i = 0; i < n; i++)
5797 {
5798 GLuint transformFeedback = ids[i];
5799 if (transformFeedback == 0)
5800 {
5801 continue;
5802 }
5803
5804 TransformFeedback *transformFeedbackObject = nullptr;
5805 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
5806 {
5807 if (transformFeedbackObject != nullptr)
5808 {
5809 detachTransformFeedback(transformFeedback);
5810 transformFeedbackObject->release(this);
5811 }
5812
5813 mTransformFeedbackHandleAllocator.release(transformFeedback);
5814 }
5815 }
5816}
5817
5818void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
5819{
5820 for (int i = 0; i < n; i++)
5821 {
5822 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
5823 mTransformFeedbackMap.assign(transformFeedback, nullptr);
5824 ids[i] = transformFeedback;
5825 }
5826}
5827
5828bool Context::isTransformFeedback(GLuint id)
5829{
5830 if (id == 0)
5831 {
5832 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
5833 // returns FALSE
5834 return GL_FALSE;
5835 }
5836
5837 const TransformFeedback *transformFeedback = getTransformFeedback(id);
5838 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
5839}
5840
5841void Context::pauseTransformFeedback()
5842{
5843 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5844 transformFeedback->pause();
5845}
5846
5847void Context::resumeTransformFeedback()
5848{
5849 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5850 transformFeedback->resume();
5851}
5852
Jamie Madill12e957f2017-08-26 21:42:26 -04005853void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
5854{
5855 const Program *programObject = getProgram(program);
Jamie Madill54164b02017-08-28 15:17:37 -04005856 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04005857}
5858
Brandon Jones59770802018-04-02 13:18:42 -07005859void Context::getUniformuivRobust(GLuint program,
5860 GLint location,
5861 GLsizei bufSize,
5862 GLsizei *length,
5863 GLuint *params)
5864{
5865 getUniformuiv(program, location, params);
5866}
5867
Jamie Madill12e957f2017-08-26 21:42:26 -04005868GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
5869{
5870 const Program *programObject = getProgram(program);
5871 return programObject->getFragDataLocation(name);
5872}
5873
5874void Context::getUniformIndices(GLuint program,
5875 GLsizei uniformCount,
5876 const GLchar *const *uniformNames,
5877 GLuint *uniformIndices)
5878{
5879 const Program *programObject = getProgram(program);
5880 if (!programObject->isLinked())
5881 {
5882 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5883 {
5884 uniformIndices[uniformId] = GL_INVALID_INDEX;
5885 }
5886 }
5887 else
5888 {
5889 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5890 {
5891 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
5892 }
5893 }
5894}
5895
5896void Context::getActiveUniformsiv(GLuint program,
5897 GLsizei uniformCount,
5898 const GLuint *uniformIndices,
5899 GLenum pname,
5900 GLint *params)
5901{
5902 const Program *programObject = getProgram(program);
5903 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5904 {
5905 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08005906 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04005907 }
5908}
5909
5910GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
5911{
5912 const Program *programObject = getProgram(program);
5913 return programObject->getUniformBlockIndex(uniformBlockName);
5914}
5915
5916void Context::getActiveUniformBlockiv(GLuint program,
5917 GLuint uniformBlockIndex,
5918 GLenum pname,
5919 GLint *params)
5920{
5921 const Program *programObject = getProgram(program);
5922 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
5923}
5924
Brandon Jones59770802018-04-02 13:18:42 -07005925void Context::getActiveUniformBlockivRobust(GLuint program,
5926 GLuint uniformBlockIndex,
5927 GLenum pname,
5928 GLsizei bufSize,
5929 GLsizei *length,
5930 GLint *params)
5931{
5932 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
5933}
5934
Jamie Madill12e957f2017-08-26 21:42:26 -04005935void Context::getActiveUniformBlockName(GLuint program,
5936 GLuint uniformBlockIndex,
5937 GLsizei bufSize,
5938 GLsizei *length,
5939 GLchar *uniformBlockName)
5940{
5941 const Program *programObject = getProgram(program);
5942 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
5943}
5944
5945void Context::uniformBlockBinding(GLuint program,
5946 GLuint uniformBlockIndex,
5947 GLuint uniformBlockBinding)
5948{
5949 Program *programObject = getProgram(program);
5950 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
5951}
5952
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005953GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
5954{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005955 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
5956 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005957
Jamie Madill70b5bb02017-08-28 13:32:37 -04005958 Sync *syncObject = getSync(syncHandle);
5959 Error error = syncObject->set(condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005960 if (error.isError())
5961 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04005962 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005963 handleError(error);
5964 return nullptr;
5965 }
5966
Jamie Madill70b5bb02017-08-28 13:32:37 -04005967 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005968}
5969
5970GLboolean Context::isSync(GLsync sync)
5971{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005972 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005973}
5974
5975GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5976{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005977 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005978
5979 GLenum result = GL_WAIT_FAILED;
5980 handleError(syncObject->clientWait(flags, timeout, &result));
5981 return result;
5982}
5983
5984void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5985{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005986 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005987 handleError(syncObject->serverWait(flags, timeout));
5988}
5989
5990void Context::getInteger64v(GLenum pname, GLint64 *params)
5991{
5992 GLenum nativeType = GL_NONE;
5993 unsigned int numParams = 0;
5994 getQueryParameterInfo(pname, &nativeType, &numParams);
5995
5996 if (nativeType == GL_INT_64_ANGLEX)
5997 {
5998 getInteger64vImpl(pname, params);
5999 }
6000 else
6001 {
6002 CastStateValues(this, nativeType, pname, numParams, params);
6003 }
6004}
6005
Brandon Jones59770802018-04-02 13:18:42 -07006006void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6007{
6008 getInteger64v(pname, data);
6009}
6010
Corentin Wallez336129f2017-10-17 15:55:40 -04006011void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006012{
6013 Buffer *buffer = mGLState.getTargetBuffer(target);
6014 QueryBufferParameteri64v(buffer, pname, params);
6015}
6016
Brandon Jones59770802018-04-02 13:18:42 -07006017void Context::getBufferParameteri64vRobust(BufferBinding target,
6018 GLenum pname,
6019 GLsizei bufSize,
6020 GLsizei *length,
6021 GLint64 *params)
6022{
6023 getBufferParameteri64v(target, pname, params);
6024}
6025
Jamie Madill3ef140a2017-08-26 23:11:21 -04006026void Context::genSamplers(GLsizei count, GLuint *samplers)
6027{
6028 for (int i = 0; i < count; i++)
6029 {
6030 samplers[i] = mState.mSamplers->createSampler();
6031 }
6032}
6033
6034void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6035{
6036 for (int i = 0; i < count; i++)
6037 {
6038 GLuint sampler = samplers[i];
6039
6040 if (mState.mSamplers->getSampler(sampler))
6041 {
6042 detachSampler(sampler);
6043 }
6044
6045 mState.mSamplers->deleteObject(this, sampler);
6046 }
6047}
6048
6049void Context::getInternalformativ(GLenum target,
6050 GLenum internalformat,
6051 GLenum pname,
6052 GLsizei bufSize,
6053 GLint *params)
6054{
6055 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6056 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6057}
6058
Brandon Jones59770802018-04-02 13:18:42 -07006059void Context::getInternalformativRobust(GLenum target,
6060 GLenum internalformat,
6061 GLenum pname,
6062 GLsizei bufSize,
6063 GLsizei *length,
6064 GLint *params)
6065{
6066 getInternalformativ(target, internalformat, pname, bufSize, params);
6067}
6068
Jiajia Qin5451d532017-11-16 17:16:34 +08006069void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6070{
6071 programUniform1iv(program, location, 1, &v0);
6072}
6073
6074void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6075{
6076 GLint xy[2] = {v0, v1};
6077 programUniform2iv(program, location, 1, xy);
6078}
6079
6080void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6081{
6082 GLint xyz[3] = {v0, v1, v2};
6083 programUniform3iv(program, location, 1, xyz);
6084}
6085
6086void Context::programUniform4i(GLuint program,
6087 GLint location,
6088 GLint v0,
6089 GLint v1,
6090 GLint v2,
6091 GLint v3)
6092{
6093 GLint xyzw[4] = {v0, v1, v2, v3};
6094 programUniform4iv(program, location, 1, xyzw);
6095}
6096
6097void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6098{
6099 programUniform1uiv(program, location, 1, &v0);
6100}
6101
6102void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6103{
6104 GLuint xy[2] = {v0, v1};
6105 programUniform2uiv(program, location, 1, xy);
6106}
6107
6108void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6109{
6110 GLuint xyz[3] = {v0, v1, v2};
6111 programUniform3uiv(program, location, 1, xyz);
6112}
6113
6114void Context::programUniform4ui(GLuint program,
6115 GLint location,
6116 GLuint v0,
6117 GLuint v1,
6118 GLuint v2,
6119 GLuint v3)
6120{
6121 GLuint xyzw[4] = {v0, v1, v2, v3};
6122 programUniform4uiv(program, location, 1, xyzw);
6123}
6124
6125void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6126{
6127 programUniform1fv(program, location, 1, &v0);
6128}
6129
6130void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6131{
6132 GLfloat xy[2] = {v0, v1};
6133 programUniform2fv(program, location, 1, xy);
6134}
6135
6136void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6137{
6138 GLfloat xyz[3] = {v0, v1, v2};
6139 programUniform3fv(program, location, 1, xyz);
6140}
6141
6142void Context::programUniform4f(GLuint program,
6143 GLint location,
6144 GLfloat v0,
6145 GLfloat v1,
6146 GLfloat v2,
6147 GLfloat v3)
6148{
6149 GLfloat xyzw[4] = {v0, v1, v2, v3};
6150 programUniform4fv(program, location, 1, xyzw);
6151}
6152
Jamie Madill81c2e252017-09-09 23:32:46 -04006153void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6154{
6155 Program *programObject = getProgram(program);
6156 ASSERT(programObject);
6157 if (programObject->setUniform1iv(location, count, value) ==
6158 Program::SetUniformResult::SamplerChanged)
6159 {
6160 mGLState.setObjectDirty(GL_PROGRAM);
6161 }
6162}
6163
Jiajia Qin5451d532017-11-16 17:16:34 +08006164void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6165{
6166 Program *programObject = getProgram(program);
6167 ASSERT(programObject);
6168 programObject->setUniform2iv(location, count, value);
6169}
6170
6171void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6172{
6173 Program *programObject = getProgram(program);
6174 ASSERT(programObject);
6175 programObject->setUniform3iv(location, count, value);
6176}
6177
6178void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6179{
6180 Program *programObject = getProgram(program);
6181 ASSERT(programObject);
6182 programObject->setUniform4iv(location, count, value);
6183}
6184
6185void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6186{
6187 Program *programObject = getProgram(program);
6188 ASSERT(programObject);
6189 programObject->setUniform1uiv(location, count, value);
6190}
6191
6192void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6193{
6194 Program *programObject = getProgram(program);
6195 ASSERT(programObject);
6196 programObject->setUniform2uiv(location, count, value);
6197}
6198
6199void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6200{
6201 Program *programObject = getProgram(program);
6202 ASSERT(programObject);
6203 programObject->setUniform3uiv(location, count, value);
6204}
6205
6206void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6207{
6208 Program *programObject = getProgram(program);
6209 ASSERT(programObject);
6210 programObject->setUniform4uiv(location, count, value);
6211}
6212
6213void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6214{
6215 Program *programObject = getProgram(program);
6216 ASSERT(programObject);
6217 programObject->setUniform1fv(location, count, value);
6218}
6219
6220void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6221{
6222 Program *programObject = getProgram(program);
6223 ASSERT(programObject);
6224 programObject->setUniform2fv(location, count, value);
6225}
6226
6227void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6228{
6229 Program *programObject = getProgram(program);
6230 ASSERT(programObject);
6231 programObject->setUniform3fv(location, count, value);
6232}
6233
6234void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6235{
6236 Program *programObject = getProgram(program);
6237 ASSERT(programObject);
6238 programObject->setUniform4fv(location, count, value);
6239}
6240
6241void Context::programUniformMatrix2fv(GLuint program,
6242 GLint location,
6243 GLsizei count,
6244 GLboolean transpose,
6245 const GLfloat *value)
6246{
6247 Program *programObject = getProgram(program);
6248 ASSERT(programObject);
6249 programObject->setUniformMatrix2fv(location, count, transpose, value);
6250}
6251
6252void Context::programUniformMatrix3fv(GLuint program,
6253 GLint location,
6254 GLsizei count,
6255 GLboolean transpose,
6256 const GLfloat *value)
6257{
6258 Program *programObject = getProgram(program);
6259 ASSERT(programObject);
6260 programObject->setUniformMatrix3fv(location, count, transpose, value);
6261}
6262
6263void Context::programUniformMatrix4fv(GLuint program,
6264 GLint location,
6265 GLsizei count,
6266 GLboolean transpose,
6267 const GLfloat *value)
6268{
6269 Program *programObject = getProgram(program);
6270 ASSERT(programObject);
6271 programObject->setUniformMatrix4fv(location, count, transpose, value);
6272}
6273
6274void Context::programUniformMatrix2x3fv(GLuint program,
6275 GLint location,
6276 GLsizei count,
6277 GLboolean transpose,
6278 const GLfloat *value)
6279{
6280 Program *programObject = getProgram(program);
6281 ASSERT(programObject);
6282 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6283}
6284
6285void Context::programUniformMatrix3x2fv(GLuint program,
6286 GLint location,
6287 GLsizei count,
6288 GLboolean transpose,
6289 const GLfloat *value)
6290{
6291 Program *programObject = getProgram(program);
6292 ASSERT(programObject);
6293 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6294}
6295
6296void Context::programUniformMatrix2x4fv(GLuint program,
6297 GLint location,
6298 GLsizei count,
6299 GLboolean transpose,
6300 const GLfloat *value)
6301{
6302 Program *programObject = getProgram(program);
6303 ASSERT(programObject);
6304 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6305}
6306
6307void Context::programUniformMatrix4x2fv(GLuint program,
6308 GLint location,
6309 GLsizei count,
6310 GLboolean transpose,
6311 const GLfloat *value)
6312{
6313 Program *programObject = getProgram(program);
6314 ASSERT(programObject);
6315 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6316}
6317
6318void Context::programUniformMatrix3x4fv(GLuint program,
6319 GLint location,
6320 GLsizei count,
6321 GLboolean transpose,
6322 const GLfloat *value)
6323{
6324 Program *programObject = getProgram(program);
6325 ASSERT(programObject);
6326 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6327}
6328
6329void Context::programUniformMatrix4x3fv(GLuint program,
6330 GLint location,
6331 GLsizei count,
6332 GLboolean transpose,
6333 const GLfloat *value)
6334{
6335 Program *programObject = getProgram(program);
6336 ASSERT(programObject);
6337 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6338}
6339
Jamie Madill81c2e252017-09-09 23:32:46 -04006340void Context::onTextureChange(const Texture *texture)
6341{
6342 // Conservatively assume all textures are dirty.
6343 // TODO(jmadill): More fine-grained update.
6344 mGLState.setObjectDirty(GL_TEXTURE);
6345}
6346
James Darpiniane8a93c62018-01-04 18:02:24 -08006347bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6348{
6349 return mGLState.isCurrentTransformFeedback(tf);
6350}
6351bool Context::isCurrentVertexArray(const VertexArray *va) const
6352{
6353 return mGLState.isCurrentVertexArray(va);
6354}
6355
Yunchao Hea336b902017-08-02 16:05:21 +08006356void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6357{
6358 for (int i = 0; i < count; i++)
6359 {
6360 pipelines[i] = createProgramPipeline();
6361 }
6362}
6363
6364void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6365{
6366 for (int i = 0; i < count; i++)
6367 {
6368 if (pipelines[i] != 0)
6369 {
6370 deleteProgramPipeline(pipelines[i]);
6371 }
6372 }
6373}
6374
6375GLboolean Context::isProgramPipeline(GLuint pipeline)
6376{
6377 if (pipeline == 0)
6378 {
6379 return GL_FALSE;
6380 }
6381
6382 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6383}
6384
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006385void Context::finishFenceNV(GLuint fence)
6386{
6387 FenceNV *fenceObject = getFenceNV(fence);
6388
6389 ASSERT(fenceObject && fenceObject->isSet());
6390 handleError(fenceObject->finish());
6391}
6392
6393void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6394{
6395 FenceNV *fenceObject = getFenceNV(fence);
6396
6397 ASSERT(fenceObject && fenceObject->isSet());
6398
6399 switch (pname)
6400 {
6401 case GL_FENCE_STATUS_NV:
6402 {
6403 // GL_NV_fence spec:
6404 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6405 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6406 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6407 GLboolean status = GL_TRUE;
6408 if (fenceObject->getStatus() != GL_TRUE)
6409 {
6410 ANGLE_CONTEXT_TRY(fenceObject->test(&status));
6411 }
6412 *params = status;
6413 break;
6414 }
6415
6416 case GL_FENCE_CONDITION_NV:
6417 {
6418 *params = static_cast<GLint>(fenceObject->getCondition());
6419 break;
6420 }
6421
6422 default:
6423 UNREACHABLE();
6424 }
6425}
6426
6427void Context::getTranslatedShaderSource(GLuint shader,
6428 GLsizei bufsize,
6429 GLsizei *length,
6430 GLchar *source)
6431{
6432 Shader *shaderObject = getShader(shader);
6433 ASSERT(shaderObject);
6434 shaderObject->getTranslatedSourceWithDebugInfo(this, bufsize, length, source);
6435}
6436
6437void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6438{
6439 Program *programObject = getProgram(program);
6440 ASSERT(programObject);
6441
6442 programObject->getUniformfv(this, location, params);
6443}
6444
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006445void Context::getnUniformfvRobust(GLuint program,
6446 GLint location,
6447 GLsizei bufSize,
6448 GLsizei *length,
6449 GLfloat *params)
6450{
6451 UNIMPLEMENTED();
6452}
6453
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006454void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6455{
6456 Program *programObject = getProgram(program);
6457 ASSERT(programObject);
6458
6459 programObject->getUniformiv(this, location, params);
6460}
6461
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006462void Context::getnUniformivRobust(GLuint program,
6463 GLint location,
6464 GLsizei bufSize,
6465 GLsizei *length,
6466 GLint *params)
6467{
6468 UNIMPLEMENTED();
6469}
6470
6471void Context::getnUniformuivRobust(GLuint program,
6472 GLint location,
6473 GLsizei bufSize,
6474 GLsizei *length,
6475 GLuint *params)
6476{
6477 UNIMPLEMENTED();
6478}
6479
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006480GLboolean Context::isFenceNV(GLuint fence)
6481{
6482 FenceNV *fenceObject = getFenceNV(fence);
6483
6484 if (fenceObject == nullptr)
6485 {
6486 return GL_FALSE;
6487 }
6488
6489 // GL_NV_fence spec:
6490 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6491 // existing fence.
6492 return fenceObject->isSet();
6493}
6494
6495void Context::readnPixels(GLint x,
6496 GLint y,
6497 GLsizei width,
6498 GLsizei height,
6499 GLenum format,
6500 GLenum type,
6501 GLsizei bufSize,
6502 void *data)
6503{
6504 return readPixels(x, y, width, height, format, type, data);
6505}
6506
Jamie Madill007530e2017-12-28 14:27:04 -05006507void Context::setFenceNV(GLuint fence, GLenum condition)
6508{
6509 ASSERT(condition == GL_ALL_COMPLETED_NV);
6510
6511 FenceNV *fenceObject = getFenceNV(fence);
6512 ASSERT(fenceObject != nullptr);
6513 handleError(fenceObject->set(condition));
6514}
6515
6516GLboolean Context::testFenceNV(GLuint fence)
6517{
6518 FenceNV *fenceObject = getFenceNV(fence);
6519
6520 ASSERT(fenceObject != nullptr);
6521 ASSERT(fenceObject->isSet() == GL_TRUE);
6522
6523 GLboolean result = GL_TRUE;
6524 Error error = fenceObject->test(&result);
6525 if (error.isError())
6526 {
6527 handleError(error);
6528 return GL_TRUE;
6529 }
6530
6531 return result;
6532}
6533
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006534void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006535{
6536 Texture *texture = getTargetTexture(target);
6537 egl::Image *imageObject = reinterpret_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05006538 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05006539}
6540
Jamie Madillfa920eb2018-01-04 11:45:50 -05006541void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006542{
6543 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
6544 egl::Image *imageObject = reinterpret_cast<egl::Image *>(image);
6545 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
6546}
6547
Jamie Madillfa920eb2018-01-04 11:45:50 -05006548void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
6549{
6550 UNIMPLEMENTED();
6551}
6552
Jamie Madill5b772312018-03-08 20:28:32 -05006553bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
6554{
6555 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
6556 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
6557 // to the fact that it is stored internally as a float, and so would require conversion
6558 // if returned from Context::getIntegerv. Since this conversion is already implemented
6559 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
6560 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
6561 // application.
6562 switch (pname)
6563 {
6564 case GL_COMPRESSED_TEXTURE_FORMATS:
6565 {
6566 *type = GL_INT;
6567 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
6568 return true;
6569 }
6570 case GL_SHADER_BINARY_FORMATS:
6571 {
6572 *type = GL_INT;
6573 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
6574 return true;
6575 }
6576
6577 case GL_MAX_VERTEX_ATTRIBS:
6578 case GL_MAX_VERTEX_UNIFORM_VECTORS:
6579 case GL_MAX_VARYING_VECTORS:
6580 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
6581 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
6582 case GL_MAX_TEXTURE_IMAGE_UNITS:
6583 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
6584 case GL_MAX_RENDERBUFFER_SIZE:
6585 case GL_NUM_SHADER_BINARY_FORMATS:
6586 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
6587 case GL_ARRAY_BUFFER_BINDING:
6588 case GL_FRAMEBUFFER_BINDING:
6589 case GL_RENDERBUFFER_BINDING:
6590 case GL_CURRENT_PROGRAM:
6591 case GL_PACK_ALIGNMENT:
6592 case GL_UNPACK_ALIGNMENT:
6593 case GL_GENERATE_MIPMAP_HINT:
6594 case GL_RED_BITS:
6595 case GL_GREEN_BITS:
6596 case GL_BLUE_BITS:
6597 case GL_ALPHA_BITS:
6598 case GL_DEPTH_BITS:
6599 case GL_STENCIL_BITS:
6600 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
6601 case GL_CULL_FACE_MODE:
6602 case GL_FRONT_FACE:
6603 case GL_ACTIVE_TEXTURE:
6604 case GL_STENCIL_FUNC:
6605 case GL_STENCIL_VALUE_MASK:
6606 case GL_STENCIL_REF:
6607 case GL_STENCIL_FAIL:
6608 case GL_STENCIL_PASS_DEPTH_FAIL:
6609 case GL_STENCIL_PASS_DEPTH_PASS:
6610 case GL_STENCIL_BACK_FUNC:
6611 case GL_STENCIL_BACK_VALUE_MASK:
6612 case GL_STENCIL_BACK_REF:
6613 case GL_STENCIL_BACK_FAIL:
6614 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
6615 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
6616 case GL_DEPTH_FUNC:
6617 case GL_BLEND_SRC_RGB:
6618 case GL_BLEND_SRC_ALPHA:
6619 case GL_BLEND_DST_RGB:
6620 case GL_BLEND_DST_ALPHA:
6621 case GL_BLEND_EQUATION_RGB:
6622 case GL_BLEND_EQUATION_ALPHA:
6623 case GL_STENCIL_WRITEMASK:
6624 case GL_STENCIL_BACK_WRITEMASK:
6625 case GL_STENCIL_CLEAR_VALUE:
6626 case GL_SUBPIXEL_BITS:
6627 case GL_MAX_TEXTURE_SIZE:
6628 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
6629 case GL_SAMPLE_BUFFERS:
6630 case GL_SAMPLES:
6631 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
6632 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
6633 case GL_TEXTURE_BINDING_2D:
6634 case GL_TEXTURE_BINDING_CUBE_MAP:
6635 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
6636 {
6637 *type = GL_INT;
6638 *numParams = 1;
6639 return true;
6640 }
6641 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
6642 {
6643 if (!getExtensions().packReverseRowOrder)
6644 {
6645 return false;
6646 }
6647 *type = GL_INT;
6648 *numParams = 1;
6649 return true;
6650 }
6651 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
6652 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
6653 {
6654 if (!getExtensions().textureRectangle)
6655 {
6656 return false;
6657 }
6658 *type = GL_INT;
6659 *numParams = 1;
6660 return true;
6661 }
6662 case GL_MAX_DRAW_BUFFERS_EXT:
6663 case GL_MAX_COLOR_ATTACHMENTS_EXT:
6664 {
6665 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
6666 {
6667 return false;
6668 }
6669 *type = GL_INT;
6670 *numParams = 1;
6671 return true;
6672 }
6673 case GL_MAX_VIEWPORT_DIMS:
6674 {
6675 *type = GL_INT;
6676 *numParams = 2;
6677 return true;
6678 }
6679 case GL_VIEWPORT:
6680 case GL_SCISSOR_BOX:
6681 {
6682 *type = GL_INT;
6683 *numParams = 4;
6684 return true;
6685 }
6686 case GL_SHADER_COMPILER:
6687 case GL_SAMPLE_COVERAGE_INVERT:
6688 case GL_DEPTH_WRITEMASK:
6689 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
6690 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
6691 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
6692 // bool-natural
6693 case GL_SAMPLE_COVERAGE:
6694 case GL_SCISSOR_TEST:
6695 case GL_STENCIL_TEST:
6696 case GL_DEPTH_TEST:
6697 case GL_BLEND:
6698 case GL_DITHER:
6699 case GL_CONTEXT_ROBUST_ACCESS_EXT:
6700 {
6701 *type = GL_BOOL;
6702 *numParams = 1;
6703 return true;
6704 }
6705 case GL_COLOR_WRITEMASK:
6706 {
6707 *type = GL_BOOL;
6708 *numParams = 4;
6709 return true;
6710 }
6711 case GL_POLYGON_OFFSET_FACTOR:
6712 case GL_POLYGON_OFFSET_UNITS:
6713 case GL_SAMPLE_COVERAGE_VALUE:
6714 case GL_DEPTH_CLEAR_VALUE:
6715 case GL_LINE_WIDTH:
6716 {
6717 *type = GL_FLOAT;
6718 *numParams = 1;
6719 return true;
6720 }
6721 case GL_ALIASED_LINE_WIDTH_RANGE:
6722 case GL_ALIASED_POINT_SIZE_RANGE:
6723 case GL_DEPTH_RANGE:
6724 {
6725 *type = GL_FLOAT;
6726 *numParams = 2;
6727 return true;
6728 }
6729 case GL_COLOR_CLEAR_VALUE:
6730 case GL_BLEND_COLOR:
6731 {
6732 *type = GL_FLOAT;
6733 *numParams = 4;
6734 return true;
6735 }
6736 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
6737 if (!getExtensions().textureFilterAnisotropic)
6738 {
6739 return false;
6740 }
6741 *type = GL_FLOAT;
6742 *numParams = 1;
6743 return true;
6744 case GL_TIMESTAMP_EXT:
6745 if (!getExtensions().disjointTimerQuery)
6746 {
6747 return false;
6748 }
6749 *type = GL_INT_64_ANGLEX;
6750 *numParams = 1;
6751 return true;
6752 case GL_GPU_DISJOINT_EXT:
6753 if (!getExtensions().disjointTimerQuery)
6754 {
6755 return false;
6756 }
6757 *type = GL_INT;
6758 *numParams = 1;
6759 return true;
6760 case GL_COVERAGE_MODULATION_CHROMIUM:
6761 if (!getExtensions().framebufferMixedSamples)
6762 {
6763 return false;
6764 }
6765 *type = GL_INT;
6766 *numParams = 1;
6767 return true;
6768 case GL_TEXTURE_BINDING_EXTERNAL_OES:
6769 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
6770 {
6771 return false;
6772 }
6773 *type = GL_INT;
6774 *numParams = 1;
6775 return true;
6776 }
6777
6778 if (getExtensions().debug)
6779 {
6780 switch (pname)
6781 {
6782 case GL_DEBUG_LOGGED_MESSAGES:
6783 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
6784 case GL_DEBUG_GROUP_STACK_DEPTH:
6785 case GL_MAX_DEBUG_MESSAGE_LENGTH:
6786 case GL_MAX_DEBUG_LOGGED_MESSAGES:
6787 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
6788 case GL_MAX_LABEL_LENGTH:
6789 *type = GL_INT;
6790 *numParams = 1;
6791 return true;
6792
6793 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
6794 case GL_DEBUG_OUTPUT:
6795 *type = GL_BOOL;
6796 *numParams = 1;
6797 return true;
6798 }
6799 }
6800
6801 if (getExtensions().multisampleCompatibility)
6802 {
6803 switch (pname)
6804 {
6805 case GL_MULTISAMPLE_EXT:
6806 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
6807 *type = GL_BOOL;
6808 *numParams = 1;
6809 return true;
6810 }
6811 }
6812
6813 if (getExtensions().pathRendering)
6814 {
6815 switch (pname)
6816 {
6817 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
6818 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
6819 *type = GL_FLOAT;
6820 *numParams = 16;
6821 return true;
6822 }
6823 }
6824
6825 if (getExtensions().bindGeneratesResource)
6826 {
6827 switch (pname)
6828 {
6829 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
6830 *type = GL_BOOL;
6831 *numParams = 1;
6832 return true;
6833 }
6834 }
6835
6836 if (getExtensions().clientArrays)
6837 {
6838 switch (pname)
6839 {
6840 case GL_CLIENT_ARRAYS_ANGLE:
6841 *type = GL_BOOL;
6842 *numParams = 1;
6843 return true;
6844 }
6845 }
6846
6847 if (getExtensions().sRGBWriteControl)
6848 {
6849 switch (pname)
6850 {
6851 case GL_FRAMEBUFFER_SRGB_EXT:
6852 *type = GL_BOOL;
6853 *numParams = 1;
6854 return true;
6855 }
6856 }
6857
6858 if (getExtensions().robustResourceInitialization &&
6859 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
6860 {
6861 *type = GL_BOOL;
6862 *numParams = 1;
6863 return true;
6864 }
6865
6866 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
6867 {
6868 *type = GL_BOOL;
6869 *numParams = 1;
6870 return true;
6871 }
6872
6873 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
6874 switch (pname)
6875 {
6876 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
6877 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
6878 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
6879 {
6880 return false;
6881 }
6882 *type = GL_INT;
6883 *numParams = 1;
6884 return true;
6885
6886 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
6887 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
6888 {
6889 return false;
6890 }
6891 *type = GL_INT;
6892 *numParams = 1;
6893 return true;
6894
6895 case GL_PROGRAM_BINARY_FORMATS_OES:
6896 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
6897 {
6898 return false;
6899 }
6900 *type = GL_INT;
6901 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
6902 return true;
6903
6904 case GL_PACK_ROW_LENGTH:
6905 case GL_PACK_SKIP_ROWS:
6906 case GL_PACK_SKIP_PIXELS:
6907 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
6908 {
6909 return false;
6910 }
6911 *type = GL_INT;
6912 *numParams = 1;
6913 return true;
6914 case GL_UNPACK_ROW_LENGTH:
6915 case GL_UNPACK_SKIP_ROWS:
6916 case GL_UNPACK_SKIP_PIXELS:
6917 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
6918 {
6919 return false;
6920 }
6921 *type = GL_INT;
6922 *numParams = 1;
6923 return true;
6924 case GL_VERTEX_ARRAY_BINDING:
6925 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
6926 {
6927 return false;
6928 }
6929 *type = GL_INT;
6930 *numParams = 1;
6931 return true;
6932 case GL_PIXEL_PACK_BUFFER_BINDING:
6933 case GL_PIXEL_UNPACK_BUFFER_BINDING:
6934 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
6935 {
6936 return false;
6937 }
6938 *type = GL_INT;
6939 *numParams = 1;
6940 return true;
6941 case GL_MAX_SAMPLES:
6942 {
6943 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
6944 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
6945 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
6946 {
6947 return false;
6948 }
6949 *type = GL_INT;
6950 *numParams = 1;
6951 return true;
6952
6953 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
6954 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
6955 {
6956 return false;
6957 }
6958 *type = GL_INT;
6959 *numParams = 1;
6960 return true;
6961 }
6962 }
6963
6964 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
6965 {
6966 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
6967 {
6968 return false;
6969 }
6970 *type = GL_INT;
6971 *numParams = 1;
6972 return true;
6973 }
6974
6975 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
6976 {
6977 *type = GL_INT;
6978 *numParams = 1;
6979 return true;
6980 }
6981
Lingfeng Yang13b708f2018-03-21 12:14:10 -07006982 if (getClientVersion() < Version(2, 0))
6983 {
6984 switch (pname)
6985 {
6986 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07006987 case GL_CLIENT_ACTIVE_TEXTURE:
6988 case GL_MATRIX_MODE:
6989 case GL_MAX_TEXTURE_UNITS:
6990 case GL_MAX_MODELVIEW_STACK_DEPTH:
6991 case GL_MAX_PROJECTION_STACK_DEPTH:
6992 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07006993 *type = GL_INT;
6994 *numParams = 1;
6995 return true;
6996 case GL_ALPHA_TEST_REF:
6997 *type = GL_FLOAT;
6998 *numParams = 1;
6999 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007000 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007001 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007002 *type = GL_FLOAT;
7003 *numParams = 4;
7004 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007005 case GL_CURRENT_NORMAL:
7006 *type = GL_FLOAT;
7007 *numParams = 3;
7008 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007009 case GL_MODELVIEW_MATRIX:
7010 case GL_PROJECTION_MATRIX:
7011 case GL_TEXTURE_MATRIX:
7012 *type = GL_FLOAT;
7013 *numParams = 16;
7014 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007015 }
7016 }
7017
Jamie Madill5b772312018-03-08 20:28:32 -05007018 if (getClientVersion() < Version(3, 0))
7019 {
7020 return false;
7021 }
7022
7023 // Check for ES3.0+ parameter names
7024 switch (pname)
7025 {
7026 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7027 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7028 case GL_UNIFORM_BUFFER_BINDING:
7029 case GL_TRANSFORM_FEEDBACK_BINDING:
7030 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7031 case GL_COPY_READ_BUFFER_BINDING:
7032 case GL_COPY_WRITE_BUFFER_BINDING:
7033 case GL_SAMPLER_BINDING:
7034 case GL_READ_BUFFER:
7035 case GL_TEXTURE_BINDING_3D:
7036 case GL_TEXTURE_BINDING_2D_ARRAY:
7037 case GL_MAX_3D_TEXTURE_SIZE:
7038 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7039 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7040 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7041 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7042 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7043 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7044 case GL_MAX_VARYING_COMPONENTS:
7045 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7046 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7047 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7048 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7049 case GL_NUM_EXTENSIONS:
7050 case GL_MAJOR_VERSION:
7051 case GL_MINOR_VERSION:
7052 case GL_MAX_ELEMENTS_INDICES:
7053 case GL_MAX_ELEMENTS_VERTICES:
7054 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7055 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7056 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7057 case GL_UNPACK_IMAGE_HEIGHT:
7058 case GL_UNPACK_SKIP_IMAGES:
7059 {
7060 *type = GL_INT;
7061 *numParams = 1;
7062 return true;
7063 }
7064
7065 case GL_MAX_ELEMENT_INDEX:
7066 case GL_MAX_UNIFORM_BLOCK_SIZE:
7067 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7068 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7069 case GL_MAX_SERVER_WAIT_TIMEOUT:
7070 {
7071 *type = GL_INT_64_ANGLEX;
7072 *numParams = 1;
7073 return true;
7074 }
7075
7076 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7077 case GL_TRANSFORM_FEEDBACK_PAUSED:
7078 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7079 case GL_RASTERIZER_DISCARD:
7080 {
7081 *type = GL_BOOL;
7082 *numParams = 1;
7083 return true;
7084 }
7085
7086 case GL_MAX_TEXTURE_LOD_BIAS:
7087 {
7088 *type = GL_FLOAT;
7089 *numParams = 1;
7090 return true;
7091 }
7092 }
7093
7094 if (getExtensions().requestExtension)
7095 {
7096 switch (pname)
7097 {
7098 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7099 *type = GL_INT;
7100 *numParams = 1;
7101 return true;
7102 }
7103 }
7104
7105 if (getClientVersion() < Version(3, 1))
7106 {
7107 return false;
7108 }
7109
7110 switch (pname)
7111 {
7112 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7113 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7114 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7115 case GL_MAX_FRAMEBUFFER_WIDTH:
7116 case GL_MAX_FRAMEBUFFER_HEIGHT:
7117 case GL_MAX_FRAMEBUFFER_SAMPLES:
7118 case GL_MAX_SAMPLE_MASK_WORDS:
7119 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7120 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7121 case GL_MAX_INTEGER_SAMPLES:
7122 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7123 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7124 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7125 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7126 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7127 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7128 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7129 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7130 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7131 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7132 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7133 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7134 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7135 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7136 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7137 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7138 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7139 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7140 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7141 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7142 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7143 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7144 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7145 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7146 case GL_MAX_UNIFORM_LOCATIONS:
7147 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7148 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7149 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7150 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7151 case GL_MAX_IMAGE_UNITS:
7152 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7153 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7154 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7155 case GL_SHADER_STORAGE_BUFFER_BINDING:
7156 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7157 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
7158 *type = GL_INT;
7159 *numParams = 1;
7160 return true;
7161 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7162 *type = GL_INT_64_ANGLEX;
7163 *numParams = 1;
7164 return true;
7165 case GL_SAMPLE_MASK:
7166 *type = GL_BOOL;
7167 *numParams = 1;
7168 return true;
7169 }
7170
7171 if (getExtensions().geometryShader)
7172 {
7173 switch (pname)
7174 {
7175 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7176 case GL_LAYER_PROVOKING_VERTEX_EXT:
7177 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7178 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7179 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7180 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7181 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7182 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7183 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7184 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7185 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7186 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7187 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7188 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7189 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7190 *type = GL_INT;
7191 *numParams = 1;
7192 return true;
7193 }
7194 }
7195
7196 return false;
7197}
7198
7199bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7200{
7201 if (getClientVersion() < Version(3, 0))
7202 {
7203 return false;
7204 }
7205
7206 switch (target)
7207 {
7208 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7209 case GL_UNIFORM_BUFFER_BINDING:
7210 {
7211 *type = GL_INT;
7212 *numParams = 1;
7213 return true;
7214 }
7215 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7216 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7217 case GL_UNIFORM_BUFFER_START:
7218 case GL_UNIFORM_BUFFER_SIZE:
7219 {
7220 *type = GL_INT_64_ANGLEX;
7221 *numParams = 1;
7222 return true;
7223 }
7224 }
7225
7226 if (getClientVersion() < Version(3, 1))
7227 {
7228 return false;
7229 }
7230
7231 switch (target)
7232 {
7233 case GL_IMAGE_BINDING_LAYERED:
7234 {
7235 *type = GL_BOOL;
7236 *numParams = 1;
7237 return true;
7238 }
7239 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7240 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7241 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7242 case GL_SHADER_STORAGE_BUFFER_BINDING:
7243 case GL_VERTEX_BINDING_BUFFER:
7244 case GL_VERTEX_BINDING_DIVISOR:
7245 case GL_VERTEX_BINDING_OFFSET:
7246 case GL_VERTEX_BINDING_STRIDE:
7247 case GL_SAMPLE_MASK_VALUE:
7248 case GL_IMAGE_BINDING_NAME:
7249 case GL_IMAGE_BINDING_LEVEL:
7250 case GL_IMAGE_BINDING_LAYER:
7251 case GL_IMAGE_BINDING_ACCESS:
7252 case GL_IMAGE_BINDING_FORMAT:
7253 {
7254 *type = GL_INT;
7255 *numParams = 1;
7256 return true;
7257 }
7258 case GL_ATOMIC_COUNTER_BUFFER_START:
7259 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7260 case GL_SHADER_STORAGE_BUFFER_START:
7261 case GL_SHADER_STORAGE_BUFFER_SIZE:
7262 {
7263 *type = GL_INT_64_ANGLEX;
7264 *numParams = 1;
7265 return true;
7266 }
7267 }
7268
7269 return false;
7270}
7271
7272Program *Context::getProgram(GLuint handle) const
7273{
7274 return mState.mShaderPrograms->getProgram(handle);
7275}
7276
7277Shader *Context::getShader(GLuint handle) const
7278{
7279 return mState.mShaderPrograms->getShader(handle);
7280}
7281
7282bool Context::isTextureGenerated(GLuint texture) const
7283{
7284 return mState.mTextures->isHandleGenerated(texture);
7285}
7286
7287bool Context::isBufferGenerated(GLuint buffer) const
7288{
7289 return mState.mBuffers->isHandleGenerated(buffer);
7290}
7291
7292bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7293{
7294 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7295}
7296
7297bool Context::isFramebufferGenerated(GLuint framebuffer) const
7298{
7299 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7300}
7301
7302bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7303{
7304 return mState.mPipelines->isHandleGenerated(pipeline);
7305}
7306
7307bool Context::usingDisplayTextureShareGroup() const
7308{
7309 return mDisplayTextureShareGroup;
7310}
7311
7312GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7313{
7314 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7315 internalformat == GL_DEPTH_STENCIL
7316 ? GL_DEPTH24_STENCIL8
7317 : internalformat;
7318}
7319
Jamie Madillc29968b2016-01-20 11:17:23 -05007320} // namespace gl