blob: 608fc97bb5146e0ca5837c0cd4f0cb712c5f2a9b [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 Madill427064d2018-04-13 16:20:34 -04002423void Context::handleError(const Error &error) const
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!
Jamie Madill427064d2018-04-13 16:20:34 -04002457void Context::markContextLost() const
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002458{
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
Jamie Madill427064d2018-04-13 16:20:34 -04002467bool Context::isContextLost() const
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002468{
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 Madill427064d2018-04-13 16:20:34 -04003646 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003647 {
Jamie Madill437fa652016-05-03 15:13:24 -04003648 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003649 }
Jamie Madill437fa652016-05-03 15:13:24 -04003650
Jamie Madill4928b7c2017-06-20 12:57:39 -04003651 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003652}
3653
3654void Context::invalidateSubFramebuffer(GLenum target,
3655 GLsizei numAttachments,
3656 const GLenum *attachments,
3657 GLint x,
3658 GLint y,
3659 GLsizei width,
3660 GLsizei height)
3661{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003662 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003663 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003664
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003665 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003666 ASSERT(framebuffer);
3667
Jamie Madill427064d2018-04-13 16:20:34 -04003668 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003669 {
Jamie Madill437fa652016-05-03 15:13:24 -04003670 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003671 }
Jamie Madill437fa652016-05-03 15:13:24 -04003672
3673 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003674 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003675}
3676
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003677void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003678 GLint level,
3679 GLint internalformat,
3680 GLsizei width,
3681 GLsizei height,
3682 GLint border,
3683 GLenum format,
3684 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003685 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003686{
Jamie Madillbc918e72018-03-08 09:47:21 -05003687 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003688
3689 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003690 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003691 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3692 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003693}
3694
Brandon Jones59770802018-04-02 13:18:42 -07003695void Context::texImage2DRobust(TextureTarget target,
3696 GLint level,
3697 GLint internalformat,
3698 GLsizei width,
3699 GLsizei height,
3700 GLint border,
3701 GLenum format,
3702 GLenum type,
3703 GLsizei bufSize,
3704 const void *pixels)
3705{
3706 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
3707}
3708
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003709void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003710 GLint level,
3711 GLint internalformat,
3712 GLsizei width,
3713 GLsizei height,
3714 GLsizei depth,
3715 GLint border,
3716 GLenum format,
3717 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003718 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003719{
Jamie Madillbc918e72018-03-08 09:47:21 -05003720 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003721
3722 Extents size(width, height, depth);
3723 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003724 handleError(texture->setImage(this, mGLState.getUnpackState(),
3725 NonCubeTextureTypeToTarget(target), level, internalformat, size,
3726 format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003727}
3728
Brandon Jones59770802018-04-02 13:18:42 -07003729void Context::texImage3DRobust(TextureType target,
3730 GLint level,
3731 GLint internalformat,
3732 GLsizei width,
3733 GLsizei height,
3734 GLsizei depth,
3735 GLint border,
3736 GLenum format,
3737 GLenum type,
3738 GLsizei bufSize,
3739 const void *pixels)
3740{
3741 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
3742}
3743
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003744void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003745 GLint level,
3746 GLint xoffset,
3747 GLint yoffset,
3748 GLsizei width,
3749 GLsizei height,
3750 GLenum format,
3751 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003752 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003753{
3754 // Zero sized uploads are valid but no-ops
3755 if (width == 0 || height == 0)
3756 {
3757 return;
3758 }
3759
Jamie Madillbc918e72018-03-08 09:47:21 -05003760 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003761
3762 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003763 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003764 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3765 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003766}
3767
Brandon Jones59770802018-04-02 13:18:42 -07003768void Context::texSubImage2DRobust(TextureTarget target,
3769 GLint level,
3770 GLint xoffset,
3771 GLint yoffset,
3772 GLsizei width,
3773 GLsizei height,
3774 GLenum format,
3775 GLenum type,
3776 GLsizei bufSize,
3777 const void *pixels)
3778{
3779 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
3780}
3781
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003782void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003783 GLint level,
3784 GLint xoffset,
3785 GLint yoffset,
3786 GLint zoffset,
3787 GLsizei width,
3788 GLsizei height,
3789 GLsizei depth,
3790 GLenum format,
3791 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003792 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003793{
3794 // Zero sized uploads are valid but no-ops
3795 if (width == 0 || height == 0 || depth == 0)
3796 {
3797 return;
3798 }
3799
Jamie Madillbc918e72018-03-08 09:47:21 -05003800 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003801
3802 Box area(xoffset, yoffset, zoffset, width, height, depth);
3803 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003804 handleError(texture->setSubImage(this, mGLState.getUnpackState(),
3805 NonCubeTextureTypeToTarget(target), level, area, format, type,
3806 reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003807}
3808
Brandon Jones59770802018-04-02 13:18:42 -07003809void Context::texSubImage3DRobust(TextureType target,
3810 GLint level,
3811 GLint xoffset,
3812 GLint yoffset,
3813 GLint zoffset,
3814 GLsizei width,
3815 GLsizei height,
3816 GLsizei depth,
3817 GLenum format,
3818 GLenum type,
3819 GLsizei bufSize,
3820 const void *pixels)
3821{
3822 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
3823 pixels);
3824}
3825
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003826void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003827 GLint level,
3828 GLenum internalformat,
3829 GLsizei width,
3830 GLsizei height,
3831 GLint border,
3832 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003833 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003834{
Jamie Madillbc918e72018-03-08 09:47:21 -05003835 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003836
3837 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003838 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003839 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
3840 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003841 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003842}
3843
Brandon Jones59770802018-04-02 13:18:42 -07003844void Context::compressedTexImage2DRobust(TextureTarget target,
3845 GLint level,
3846 GLenum internalformat,
3847 GLsizei width,
3848 GLsizei height,
3849 GLint border,
3850 GLsizei imageSize,
3851 GLsizei dataSize,
3852 const GLvoid *data)
3853{
3854 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
3855}
3856
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003857void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003858 GLint level,
3859 GLenum internalformat,
3860 GLsizei width,
3861 GLsizei height,
3862 GLsizei depth,
3863 GLint border,
3864 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003865 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003866{
Jamie Madillbc918e72018-03-08 09:47:21 -05003867 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003868
3869 Extents size(width, height, depth);
3870 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003871 handleError(texture->setCompressedImage(
3872 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
3873 size, imageSize, reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003874}
3875
Brandon Jones59770802018-04-02 13:18:42 -07003876void Context::compressedTexImage3DRobust(TextureType target,
3877 GLint level,
3878 GLenum internalformat,
3879 GLsizei width,
3880 GLsizei height,
3881 GLsizei depth,
3882 GLint border,
3883 GLsizei imageSize,
3884 GLsizei dataSize,
3885 const GLvoid *data)
3886{
3887 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
3888 data);
3889}
3890
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003891void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003892 GLint level,
3893 GLint xoffset,
3894 GLint yoffset,
3895 GLsizei width,
3896 GLsizei height,
3897 GLenum format,
3898 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003899 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003900{
Jamie Madillbc918e72018-03-08 09:47:21 -05003901 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003902
3903 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003904 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003905 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
3906 format, imageSize,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003907 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003908}
3909
Brandon Jones59770802018-04-02 13:18:42 -07003910void Context::compressedTexSubImage2DRobust(TextureTarget target,
3911 GLint level,
3912 GLint xoffset,
3913 GLint yoffset,
3914 GLsizei width,
3915 GLsizei height,
3916 GLenum format,
3917 GLsizei imageSize,
3918 GLsizei dataSize,
3919 const GLvoid *data)
3920{
3921 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
3922 data);
3923}
3924
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003925void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003926 GLint level,
3927 GLint xoffset,
3928 GLint yoffset,
3929 GLint zoffset,
3930 GLsizei width,
3931 GLsizei height,
3932 GLsizei depth,
3933 GLenum format,
3934 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003935 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003936{
3937 // Zero sized uploads are valid but no-ops
3938 if (width == 0 || height == 0)
3939 {
3940 return;
3941 }
3942
Jamie Madillbc918e72018-03-08 09:47:21 -05003943 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003944
3945 Box area(xoffset, yoffset, zoffset, width, height, depth);
3946 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003947 handleError(texture->setCompressedSubImage(
3948 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
3949 imageSize, reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003950}
3951
Brandon Jones59770802018-04-02 13:18:42 -07003952void Context::compressedTexSubImage3DRobust(TextureType target,
3953 GLint level,
3954 GLint xoffset,
3955 GLint yoffset,
3956 GLint zoffset,
3957 GLsizei width,
3958 GLsizei height,
3959 GLsizei depth,
3960 GLenum format,
3961 GLsizei imageSize,
3962 GLsizei dataSize,
3963 const GLvoid *data)
3964{
3965 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
3966 imageSize, data);
3967}
3968
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003969void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003970{
3971 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003972 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003973}
3974
Jamie Madill007530e2017-12-28 14:27:04 -05003975void Context::copyTexture(GLuint sourceId,
3976 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05003977 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05003978 GLuint destId,
3979 GLint destLevel,
3980 GLint internalFormat,
3981 GLenum destType,
3982 GLboolean unpackFlipY,
3983 GLboolean unpackPremultiplyAlpha,
3984 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07003985{
Jamie Madillbc918e72018-03-08 09:47:21 -05003986 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07003987
3988 gl::Texture *sourceTexture = getTexture(sourceId);
3989 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05003990 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
3991 sourceLevel, ConvertToBool(unpackFlipY),
3992 ConvertToBool(unpackPremultiplyAlpha),
3993 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003994}
3995
Jamie Madill007530e2017-12-28 14:27:04 -05003996void Context::copySubTexture(GLuint sourceId,
3997 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05003998 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05003999 GLuint destId,
4000 GLint destLevel,
4001 GLint xoffset,
4002 GLint yoffset,
4003 GLint x,
4004 GLint y,
4005 GLsizei width,
4006 GLsizei height,
4007 GLboolean unpackFlipY,
4008 GLboolean unpackPremultiplyAlpha,
4009 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004010{
4011 // Zero sized copies are valid but no-ops
4012 if (width == 0 || height == 0)
4013 {
4014 return;
4015 }
4016
Jamie Madillbc918e72018-03-08 09:47:21 -05004017 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004018
4019 gl::Texture *sourceTexture = getTexture(sourceId);
4020 gl::Texture *destTexture = getTexture(destId);
4021 Offset offset(xoffset, yoffset, 0);
4022 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05004023 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
4024 ConvertToBool(unpackFlipY),
4025 ConvertToBool(unpackPremultiplyAlpha),
4026 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004027}
4028
Jamie Madill007530e2017-12-28 14:27:04 -05004029void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004030{
Jamie Madillbc918e72018-03-08 09:47:21 -05004031 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004032
4033 gl::Texture *sourceTexture = getTexture(sourceId);
4034 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004035 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004036}
4037
Corentin Wallez336129f2017-10-17 15:55:40 -04004038void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004039{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004040 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004041 ASSERT(buffer);
4042
Geoff Lang496c02d2016-10-20 11:38:11 -07004043 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004044}
4045
Brandon Jones59770802018-04-02 13:18:42 -07004046void Context::getBufferPointervRobust(BufferBinding target,
4047 GLenum pname,
4048 GLsizei bufSize,
4049 GLsizei *length,
4050 void **params)
4051{
4052 getBufferPointerv(target, pname, params);
4053}
4054
Corentin Wallez336129f2017-10-17 15:55:40 -04004055void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004056{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004057 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004058 ASSERT(buffer);
4059
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004060 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004061 if (error.isError())
4062 {
Jamie Madill437fa652016-05-03 15:13:24 -04004063 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004064 return nullptr;
4065 }
4066
4067 return buffer->getMapPointer();
4068}
4069
Corentin Wallez336129f2017-10-17 15:55:40 -04004070GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004071{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004072 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004073 ASSERT(buffer);
4074
4075 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004076 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004077 if (error.isError())
4078 {
Jamie Madill437fa652016-05-03 15:13:24 -04004079 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004080 return GL_FALSE;
4081 }
4082
4083 return result;
4084}
4085
Corentin Wallez336129f2017-10-17 15:55:40 -04004086void *Context::mapBufferRange(BufferBinding target,
4087 GLintptr offset,
4088 GLsizeiptr length,
4089 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004090{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004091 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004092 ASSERT(buffer);
4093
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004094 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004095 if (error.isError())
4096 {
Jamie Madill437fa652016-05-03 15:13:24 -04004097 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004098 return nullptr;
4099 }
4100
4101 return buffer->getMapPointer();
4102}
4103
Corentin Wallez336129f2017-10-17 15:55:40 -04004104void Context::flushMappedBufferRange(BufferBinding /*target*/,
4105 GLintptr /*offset*/,
4106 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004107{
4108 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4109}
4110
Jamie Madillbc918e72018-03-08 09:47:21 -05004111Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004112{
Geoff Langa8cb2872018-03-09 16:09:40 -05004113 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004114}
4115
Jamie Madillbc918e72018-03-08 09:47:21 -05004116Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004117{
Geoff Langa8cb2872018-03-09 16:09:40 -05004118 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004119}
4120
Jamie Madillbc918e72018-03-08 09:47:21 -05004121Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004122{
Geoff Langa8cb2872018-03-09 16:09:40 -05004123 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004124}
4125
Jiajia Qin5451d532017-11-16 17:16:34 +08004126void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4127{
4128 UNIMPLEMENTED();
4129}
4130
Jamie Madillc20ab272016-06-09 07:20:46 -07004131void Context::activeTexture(GLenum texture)
4132{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004133 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004134}
4135
Jamie Madill876429b2017-04-20 15:46:24 -04004136void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004137{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004138 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004139}
4140
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004141void Context::blendEquation(GLenum mode)
4142{
4143 mGLState.setBlendEquation(mode, mode);
4144}
4145
Jamie Madillc20ab272016-06-09 07:20:46 -07004146void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4147{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004148 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004149}
4150
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004151void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4152{
4153 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4154}
4155
Jamie Madillc20ab272016-06-09 07:20:46 -07004156void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4157{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004158 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004159}
4160
Jamie Madill876429b2017-04-20 15:46:24 -04004161void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004162{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004163 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004164}
4165
Jamie Madill876429b2017-04-20 15:46:24 -04004166void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004167{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004168 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004169}
4170
4171void Context::clearStencil(GLint s)
4172{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004173 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004174}
4175
4176void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4177{
Geoff Lang92019432017-11-20 13:09:34 -05004178 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4179 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004180}
4181
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004182void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004183{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004184 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004185}
4186
4187void Context::depthFunc(GLenum func)
4188{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004189 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004190}
4191
4192void Context::depthMask(GLboolean flag)
4193{
Geoff Lang92019432017-11-20 13:09:34 -05004194 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004195}
4196
Jamie Madill876429b2017-04-20 15:46:24 -04004197void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004198{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004199 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004200}
4201
4202void Context::disable(GLenum cap)
4203{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004204 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07004205}
4206
4207void Context::disableVertexAttribArray(GLuint index)
4208{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004209 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07004210}
4211
4212void Context::enable(GLenum cap)
4213{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004214 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07004215}
4216
4217void Context::enableVertexAttribArray(GLuint index)
4218{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004219 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07004220}
4221
4222void Context::frontFace(GLenum mode)
4223{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004224 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004225}
4226
4227void Context::hint(GLenum target, GLenum mode)
4228{
4229 switch (target)
4230 {
4231 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004232 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004233 break;
4234
4235 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004236 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004237 break;
4238
4239 default:
4240 UNREACHABLE();
4241 return;
4242 }
4243}
4244
4245void Context::lineWidth(GLfloat width)
4246{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004247 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004248}
4249
4250void Context::pixelStorei(GLenum pname, GLint param)
4251{
4252 switch (pname)
4253 {
4254 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004255 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004256 break;
4257
4258 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004259 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004260 break;
4261
4262 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004263 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004264 break;
4265
4266 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004267 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004268 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004269 break;
4270
4271 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004272 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004273 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004274 break;
4275
4276 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004277 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004278 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004279 break;
4280
4281 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004282 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004283 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004284 break;
4285
4286 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004287 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004288 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004289 break;
4290
4291 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004292 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004293 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004294 break;
4295
4296 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004297 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004298 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004299 break;
4300
4301 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004302 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004303 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004304 break;
4305
4306 default:
4307 UNREACHABLE();
4308 return;
4309 }
4310}
4311
4312void Context::polygonOffset(GLfloat factor, GLfloat units)
4313{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004314 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004315}
4316
Jamie Madill876429b2017-04-20 15:46:24 -04004317void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004318{
Geoff Lang92019432017-11-20 13:09:34 -05004319 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004320}
4321
Jiawei Shaodb342272017-09-27 10:21:45 +08004322void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4323{
4324 mGLState.setSampleMaskParams(maskNumber, mask);
4325}
4326
Jamie Madillc20ab272016-06-09 07:20:46 -07004327void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4328{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004329 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004330}
4331
4332void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4333{
4334 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4335 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004336 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004337 }
4338
4339 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4340 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004341 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004342 }
4343}
4344
4345void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4346{
4347 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4348 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004349 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004350 }
4351
4352 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4353 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004354 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004355 }
4356}
4357
4358void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4359{
4360 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4361 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004362 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004363 }
4364
4365 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4366 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004367 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004368 }
4369}
4370
4371void Context::vertexAttrib1f(GLuint index, GLfloat x)
4372{
4373 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004374 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004375}
4376
4377void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4378{
4379 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004380 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004381}
4382
4383void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4384{
4385 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004386 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004387}
4388
4389void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4390{
4391 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004392 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004393}
4394
4395void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4396{
4397 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004398 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004399}
4400
4401void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4402{
4403 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004404 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004405}
4406
4407void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4408{
4409 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004410 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004411}
4412
4413void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4414{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004415 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07004416}
4417
4418void Context::vertexAttribPointer(GLuint index,
4419 GLint size,
4420 GLenum type,
4421 GLboolean normalized,
4422 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004423 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004424{
Corentin Wallez336129f2017-10-17 15:55:40 -04004425 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004426 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07004427}
4428
Shao80957d92017-02-20 21:25:59 +08004429void Context::vertexAttribFormat(GLuint attribIndex,
4430 GLint size,
4431 GLenum type,
4432 GLboolean normalized,
4433 GLuint relativeOffset)
4434{
Geoff Lang92019432017-11-20 13:09:34 -05004435 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004436 relativeOffset);
4437}
4438
4439void Context::vertexAttribIFormat(GLuint attribIndex,
4440 GLint size,
4441 GLenum type,
4442 GLuint relativeOffset)
4443{
4444 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
4445}
4446
4447void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4448{
Shaodde78e82017-05-22 14:13:27 +08004449 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08004450}
4451
Jiajia Qin5451d532017-11-16 17:16:34 +08004452void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004453{
4454 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
4455}
4456
Jamie Madillc20ab272016-06-09 07:20:46 -07004457void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4458{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004459 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004460}
4461
4462void Context::vertexAttribIPointer(GLuint index,
4463 GLint size,
4464 GLenum type,
4465 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004466 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004467{
Corentin Wallez336129f2017-10-17 15:55:40 -04004468 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4469 size, type, false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07004470}
4471
4472void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4473{
4474 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004475 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004476}
4477
4478void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4479{
4480 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004481 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004482}
4483
4484void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4485{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004486 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004487}
4488
4489void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4490{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004491 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004492}
4493
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004494void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4495{
4496 const VertexAttribCurrentValueData &currentValues =
4497 getGLState().getVertexAttribCurrentValue(index);
4498 const VertexArray *vao = getGLState().getVertexArray();
4499 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4500 currentValues, pname, params);
4501}
4502
Brandon Jones59770802018-04-02 13:18:42 -07004503void Context::getVertexAttribivRobust(GLuint index,
4504 GLenum pname,
4505 GLsizei bufSize,
4506 GLsizei *length,
4507 GLint *params)
4508{
4509 getVertexAttribiv(index, pname, params);
4510}
4511
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004512void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4513{
4514 const VertexAttribCurrentValueData &currentValues =
4515 getGLState().getVertexAttribCurrentValue(index);
4516 const VertexArray *vao = getGLState().getVertexArray();
4517 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4518 currentValues, pname, params);
4519}
4520
Brandon Jones59770802018-04-02 13:18:42 -07004521void Context::getVertexAttribfvRobust(GLuint index,
4522 GLenum pname,
4523 GLsizei bufSize,
4524 GLsizei *length,
4525 GLfloat *params)
4526{
4527 getVertexAttribfv(index, pname, params);
4528}
4529
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004530void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4531{
4532 const VertexAttribCurrentValueData &currentValues =
4533 getGLState().getVertexAttribCurrentValue(index);
4534 const VertexArray *vao = getGLState().getVertexArray();
4535 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4536 currentValues, pname, params);
4537}
4538
Brandon Jones59770802018-04-02 13:18:42 -07004539void Context::getVertexAttribIivRobust(GLuint index,
4540 GLenum pname,
4541 GLsizei bufSize,
4542 GLsizei *length,
4543 GLint *params)
4544{
4545 getVertexAttribIiv(index, pname, params);
4546}
4547
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004548void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4549{
4550 const VertexAttribCurrentValueData &currentValues =
4551 getGLState().getVertexAttribCurrentValue(index);
4552 const VertexArray *vao = getGLState().getVertexArray();
4553 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4554 currentValues, pname, params);
4555}
4556
Brandon Jones59770802018-04-02 13:18:42 -07004557void Context::getVertexAttribIuivRobust(GLuint index,
4558 GLenum pname,
4559 GLsizei bufSize,
4560 GLsizei *length,
4561 GLuint *params)
4562{
4563 getVertexAttribIuiv(index, pname, params);
4564}
4565
Jamie Madill876429b2017-04-20 15:46:24 -04004566void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004567{
4568 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4569 QueryVertexAttribPointerv(attrib, pname, pointer);
4570}
4571
Brandon Jones59770802018-04-02 13:18:42 -07004572void Context::getVertexAttribPointervRobust(GLuint index,
4573 GLenum pname,
4574 GLsizei bufSize,
4575 GLsizei *length,
4576 void **pointer)
4577{
4578 getVertexAttribPointerv(index, pname, pointer);
4579}
4580
Jamie Madillc20ab272016-06-09 07:20:46 -07004581void Context::debugMessageControl(GLenum source,
4582 GLenum type,
4583 GLenum severity,
4584 GLsizei count,
4585 const GLuint *ids,
4586 GLboolean enabled)
4587{
4588 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004589 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004590 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004591}
4592
4593void Context::debugMessageInsert(GLenum source,
4594 GLenum type,
4595 GLuint id,
4596 GLenum severity,
4597 GLsizei length,
4598 const GLchar *buf)
4599{
4600 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004601 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004602}
4603
4604void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4605{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004606 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004607}
4608
4609GLuint Context::getDebugMessageLog(GLuint count,
4610 GLsizei bufSize,
4611 GLenum *sources,
4612 GLenum *types,
4613 GLuint *ids,
4614 GLenum *severities,
4615 GLsizei *lengths,
4616 GLchar *messageLog)
4617{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004618 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4619 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004620}
4621
4622void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4623{
4624 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004625 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004626 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004627}
4628
4629void Context::popDebugGroup()
4630{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004631 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004632 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004633}
4634
Corentin Wallez336129f2017-10-17 15:55:40 -04004635void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004636{
4637 Buffer *buffer = mGLState.getTargetBuffer(target);
4638 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004639 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004640}
4641
Corentin Wallez336129f2017-10-17 15:55:40 -04004642void Context::bufferSubData(BufferBinding target,
4643 GLintptr offset,
4644 GLsizeiptr size,
4645 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004646{
4647 if (data == nullptr)
4648 {
4649 return;
4650 }
4651
4652 Buffer *buffer = mGLState.getTargetBuffer(target);
4653 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004654 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004655}
4656
Jamie Madillef300b12016-10-07 15:12:09 -04004657void Context::attachShader(GLuint program, GLuint shader)
4658{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004659 Program *programObject = mState.mShaderPrograms->getProgram(program);
4660 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004661 ASSERT(programObject && shaderObject);
4662 programObject->attachShader(shaderObject);
4663}
4664
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004665const Workarounds &Context::getWorkarounds() const
4666{
4667 return mWorkarounds;
4668}
4669
Corentin Wallez336129f2017-10-17 15:55:40 -04004670void Context::copyBufferSubData(BufferBinding readTarget,
4671 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04004672 GLintptr readOffset,
4673 GLintptr writeOffset,
4674 GLsizeiptr size)
4675{
4676 // if size is zero, the copy is a successful no-op
4677 if (size == 0)
4678 {
4679 return;
4680 }
4681
4682 // TODO(jmadill): cache these.
4683 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
4684 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4685
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004686 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004687}
4688
Jamie Madill01a80ee2016-11-07 12:06:18 -05004689void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4690{
4691 Program *programObject = getProgram(program);
4692 // TODO(jmadill): Re-use this from the validation if possible.
4693 ASSERT(programObject);
4694 programObject->bindAttributeLocation(index, name);
4695}
4696
Corentin Wallez336129f2017-10-17 15:55:40 -04004697void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004698{
Corentin Wallez336129f2017-10-17 15:55:40 -04004699 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4700 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004701}
4702
Corentin Wallez336129f2017-10-17 15:55:40 -04004703void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08004704{
4705 bindBufferRange(target, index, buffer, 0, 0);
4706}
4707
Corentin Wallez336129f2017-10-17 15:55:40 -04004708void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08004709 GLuint index,
4710 GLuint buffer,
4711 GLintptr offset,
4712 GLsizeiptr size)
4713{
Corentin Wallez336129f2017-10-17 15:55:40 -04004714 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4715 mGLState.setIndexedBufferBinding(this, target, index, bufferObject, offset, size);
Jiajia Qin6eafb042016-12-27 17:04:07 +08004716}
4717
Jamie Madill01a80ee2016-11-07 12:06:18 -05004718void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4719{
4720 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4721 {
4722 bindReadFramebuffer(framebuffer);
4723 }
4724
4725 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4726 {
4727 bindDrawFramebuffer(framebuffer);
4728 }
4729}
4730
4731void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4732{
4733 ASSERT(target == GL_RENDERBUFFER);
4734 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004735 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004736 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004737}
4738
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004739void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08004740 GLsizei samples,
4741 GLenum internalformat,
4742 GLsizei width,
4743 GLsizei height,
4744 GLboolean fixedsamplelocations)
4745{
4746 Extents size(width, height, 1);
4747 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004748 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
4749 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004750}
4751
4752void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
4753{
JiangYizhou5b03f472017-01-09 10:22:53 +08004754 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
4755 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05004756 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08004757 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08004758
4759 switch (pname)
4760 {
4761 case GL_SAMPLE_POSITION:
4762 handleError(framebuffer->getSamplePosition(index, val));
4763 break;
4764 default:
4765 UNREACHABLE();
4766 }
4767}
4768
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07004769void Context::getMultisamplefvRobust(GLenum pname,
4770 GLuint index,
4771 GLsizei bufSize,
4772 GLsizei *length,
4773 GLfloat *val)
4774{
4775 UNIMPLEMENTED();
4776}
4777
Jamie Madille8fb6402017-02-14 17:56:40 -05004778void Context::renderbufferStorage(GLenum target,
4779 GLenum internalformat,
4780 GLsizei width,
4781 GLsizei height)
4782{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004783 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4784 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
4785
Jamie Madille8fb6402017-02-14 17:56:40 -05004786 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04004787 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004788}
4789
4790void Context::renderbufferStorageMultisample(GLenum target,
4791 GLsizei samples,
4792 GLenum internalformat,
4793 GLsizei width,
4794 GLsizei height)
4795{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004796 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4797 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05004798
4799 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004800 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04004801 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004802}
4803
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004804void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
4805{
Jamie Madill70b5bb02017-08-28 13:32:37 -04004806 const Sync *syncObject = getSync(sync);
Geoff Lang82483b92017-04-11 15:33:00 -04004807 handleError(QuerySynciv(syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004808}
4809
JiangYizhoue18e6392017-02-20 10:32:23 +08004810void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
4811{
4812 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4813 QueryFramebufferParameteriv(framebuffer, pname, params);
4814}
4815
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07004816void Context::getFramebufferParameterivRobust(GLenum target,
4817 GLenum pname,
4818 GLsizei bufSize,
4819 GLsizei *length,
4820 GLint *params)
4821{
4822 UNIMPLEMENTED();
4823}
4824
Jiajia Qin5451d532017-11-16 17:16:34 +08004825void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08004826{
4827 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4828 SetFramebufferParameteri(framebuffer, pname, param);
4829}
4830
Jamie Madillb3f26b92017-07-19 15:07:41 -04004831Error Context::getScratchBuffer(size_t requstedSizeBytes,
4832 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05004833{
Jamie Madillb3f26b92017-07-19 15:07:41 -04004834 if (!mScratchBuffer.get(requstedSizeBytes, scratchBufferOut))
4835 {
4836 return OutOfMemory() << "Failed to allocate internal buffer.";
4837 }
4838 return NoError();
4839}
4840
4841Error Context::getZeroFilledBuffer(size_t requstedSizeBytes,
4842 angle::MemoryBuffer **zeroBufferOut) const
4843{
4844 if (!mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0))
Jamie Madille14951e2017-03-09 18:55:16 -05004845 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004846 return OutOfMemory() << "Failed to allocate internal buffer.";
Jamie Madille14951e2017-03-09 18:55:16 -05004847 }
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004848 return NoError();
Jamie Madille14951e2017-03-09 18:55:16 -05004849}
4850
Xinghua Cao10a4d432017-11-28 14:46:26 +08004851Error Context::prepareForDispatch()
4852{
Geoff Langa8cb2872018-03-09 16:09:40 -05004853 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08004854
4855 if (isRobustResourceInitEnabled())
4856 {
4857 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
4858 }
4859
4860 return NoError();
4861}
4862
Xinghua Cao2b396592017-03-29 15:36:04 +08004863void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
4864{
4865 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
4866 {
4867 return;
4868 }
4869
Xinghua Cao10a4d432017-11-28 14:46:26 +08004870 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04004871 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08004872}
4873
Jiajia Qin5451d532017-11-16 17:16:34 +08004874void Context::dispatchComputeIndirect(GLintptr indirect)
4875{
Qin Jiajia62fcf622017-11-30 16:16:12 +08004876 ANGLE_CONTEXT_TRY(prepareForDispatch());
4877 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08004878}
4879
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004880void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08004881 GLsizei levels,
4882 GLenum internalFormat,
4883 GLsizei width,
4884 GLsizei height)
4885{
4886 Extents size(width, height, 1);
4887 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004888 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08004889}
4890
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004891void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08004892 GLsizei levels,
4893 GLenum internalFormat,
4894 GLsizei width,
4895 GLsizei height,
4896 GLsizei depth)
4897{
4898 Extents size(width, height, depth);
4899 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004900 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08004901}
4902
Jiajia Qin5451d532017-11-16 17:16:34 +08004903void Context::memoryBarrier(GLbitfield barriers)
4904{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004905 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004906}
4907
4908void Context::memoryBarrierByRegion(GLbitfield barriers)
4909{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004910 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004911}
4912
Jamie Madillc1d770e2017-04-13 17:31:24 -04004913GLenum Context::checkFramebufferStatus(GLenum target)
4914{
4915 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4916 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04004917 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004918}
4919
4920void Context::compileShader(GLuint shader)
4921{
4922 Shader *shaderObject = GetValidShader(this, shader);
4923 if (!shaderObject)
4924 {
4925 return;
4926 }
4927 shaderObject->compile(this);
4928}
4929
4930void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
4931{
4932 for (int i = 0; i < n; i++)
4933 {
4934 deleteBuffer(buffers[i]);
4935 }
4936}
4937
4938void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
4939{
4940 for (int i = 0; i < n; i++)
4941 {
4942 if (framebuffers[i] != 0)
4943 {
4944 deleteFramebuffer(framebuffers[i]);
4945 }
4946 }
4947}
4948
4949void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
4950{
4951 for (int i = 0; i < n; i++)
4952 {
4953 deleteRenderbuffer(renderbuffers[i]);
4954 }
4955}
4956
4957void Context::deleteTextures(GLsizei n, const GLuint *textures)
4958{
4959 for (int i = 0; i < n; i++)
4960 {
4961 if (textures[i] != 0)
4962 {
4963 deleteTexture(textures[i]);
4964 }
4965 }
4966}
4967
4968void Context::detachShader(GLuint program, GLuint shader)
4969{
4970 Program *programObject = getProgram(program);
4971 ASSERT(programObject);
4972
4973 Shader *shaderObject = getShader(shader);
4974 ASSERT(shaderObject);
4975
4976 programObject->detachShader(this, shaderObject);
4977}
4978
4979void Context::genBuffers(GLsizei n, GLuint *buffers)
4980{
4981 for (int i = 0; i < n; i++)
4982 {
4983 buffers[i] = createBuffer();
4984 }
4985}
4986
4987void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
4988{
4989 for (int i = 0; i < n; i++)
4990 {
4991 framebuffers[i] = createFramebuffer();
4992 }
4993}
4994
4995void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
4996{
4997 for (int i = 0; i < n; i++)
4998 {
4999 renderbuffers[i] = createRenderbuffer();
5000 }
5001}
5002
5003void Context::genTextures(GLsizei n, GLuint *textures)
5004{
5005 for (int i = 0; i < n; i++)
5006 {
5007 textures[i] = createTexture();
5008 }
5009}
5010
5011void Context::getActiveAttrib(GLuint program,
5012 GLuint index,
5013 GLsizei bufsize,
5014 GLsizei *length,
5015 GLint *size,
5016 GLenum *type,
5017 GLchar *name)
5018{
5019 Program *programObject = getProgram(program);
5020 ASSERT(programObject);
5021 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5022}
5023
5024void Context::getActiveUniform(GLuint program,
5025 GLuint index,
5026 GLsizei bufsize,
5027 GLsizei *length,
5028 GLint *size,
5029 GLenum *type,
5030 GLchar *name)
5031{
5032 Program *programObject = getProgram(program);
5033 ASSERT(programObject);
5034 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5035}
5036
5037void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5038{
5039 Program *programObject = getProgram(program);
5040 ASSERT(programObject);
5041 programObject->getAttachedShaders(maxcount, count, shaders);
5042}
5043
5044GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5045{
5046 Program *programObject = getProgram(program);
5047 ASSERT(programObject);
5048 return programObject->getAttributeLocation(name);
5049}
5050
5051void Context::getBooleanv(GLenum pname, GLboolean *params)
5052{
5053 GLenum nativeType;
5054 unsigned int numParams = 0;
5055 getQueryParameterInfo(pname, &nativeType, &numParams);
5056
5057 if (nativeType == GL_BOOL)
5058 {
5059 getBooleanvImpl(pname, params);
5060 }
5061 else
5062 {
5063 CastStateValues(this, nativeType, pname, numParams, params);
5064 }
5065}
5066
Brandon Jones59770802018-04-02 13:18:42 -07005067void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5068{
5069 getBooleanv(pname, params);
5070}
5071
Jamie Madillc1d770e2017-04-13 17:31:24 -04005072void Context::getFloatv(GLenum pname, GLfloat *params)
5073{
5074 GLenum nativeType;
5075 unsigned int numParams = 0;
5076 getQueryParameterInfo(pname, &nativeType, &numParams);
5077
5078 if (nativeType == GL_FLOAT)
5079 {
5080 getFloatvImpl(pname, params);
5081 }
5082 else
5083 {
5084 CastStateValues(this, nativeType, pname, numParams, params);
5085 }
5086}
5087
Brandon Jones59770802018-04-02 13:18:42 -07005088void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5089{
5090 getFloatv(pname, params);
5091}
5092
Jamie Madillc1d770e2017-04-13 17:31:24 -04005093void Context::getIntegerv(GLenum pname, GLint *params)
5094{
5095 GLenum nativeType;
5096 unsigned int numParams = 0;
5097 getQueryParameterInfo(pname, &nativeType, &numParams);
5098
5099 if (nativeType == GL_INT)
5100 {
5101 getIntegervImpl(pname, params);
5102 }
5103 else
5104 {
5105 CastStateValues(this, nativeType, pname, numParams, params);
5106 }
5107}
5108
Brandon Jones59770802018-04-02 13:18:42 -07005109void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5110{
5111 getIntegerv(pname, data);
5112}
5113
Jamie Madillc1d770e2017-04-13 17:31:24 -04005114void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5115{
5116 Program *programObject = getProgram(program);
5117 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005118 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005119}
5120
Brandon Jones59770802018-04-02 13:18:42 -07005121void Context::getProgramivRobust(GLuint program,
5122 GLenum pname,
5123 GLsizei bufSize,
5124 GLsizei *length,
5125 GLint *params)
5126{
5127 getProgramiv(program, pname, params);
5128}
5129
Jiajia Qin5451d532017-11-16 17:16:34 +08005130void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5131{
5132 UNIMPLEMENTED();
5133}
5134
Jamie Madillbe849e42017-05-02 15:49:00 -04005135void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005136{
5137 Program *programObject = getProgram(program);
5138 ASSERT(programObject);
5139 programObject->getInfoLog(bufsize, length, infolog);
5140}
5141
Jiajia Qin5451d532017-11-16 17:16:34 +08005142void Context::getProgramPipelineInfoLog(GLuint pipeline,
5143 GLsizei bufSize,
5144 GLsizei *length,
5145 GLchar *infoLog)
5146{
5147 UNIMPLEMENTED();
5148}
5149
Jamie Madillc1d770e2017-04-13 17:31:24 -04005150void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5151{
5152 Shader *shaderObject = getShader(shader);
5153 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04005154 QueryShaderiv(this, shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005155}
5156
Brandon Jones59770802018-04-02 13:18:42 -07005157void Context::getShaderivRobust(GLuint shader,
5158 GLenum pname,
5159 GLsizei bufSize,
5160 GLsizei *length,
5161 GLint *params)
5162{
5163 getShaderiv(shader, pname, params);
5164}
5165
Jamie Madillc1d770e2017-04-13 17:31:24 -04005166void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5167{
5168 Shader *shaderObject = getShader(shader);
5169 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04005170 shaderObject->getInfoLog(this, bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005171}
5172
5173void Context::getShaderPrecisionFormat(GLenum shadertype,
5174 GLenum precisiontype,
5175 GLint *range,
5176 GLint *precision)
5177{
5178 // TODO(jmadill): Compute shaders.
5179
5180 switch (shadertype)
5181 {
5182 case GL_VERTEX_SHADER:
5183 switch (precisiontype)
5184 {
5185 case GL_LOW_FLOAT:
5186 mCaps.vertexLowpFloat.get(range, precision);
5187 break;
5188 case GL_MEDIUM_FLOAT:
5189 mCaps.vertexMediumpFloat.get(range, precision);
5190 break;
5191 case GL_HIGH_FLOAT:
5192 mCaps.vertexHighpFloat.get(range, precision);
5193 break;
5194
5195 case GL_LOW_INT:
5196 mCaps.vertexLowpInt.get(range, precision);
5197 break;
5198 case GL_MEDIUM_INT:
5199 mCaps.vertexMediumpInt.get(range, precision);
5200 break;
5201 case GL_HIGH_INT:
5202 mCaps.vertexHighpInt.get(range, precision);
5203 break;
5204
5205 default:
5206 UNREACHABLE();
5207 return;
5208 }
5209 break;
5210
5211 case GL_FRAGMENT_SHADER:
5212 switch (precisiontype)
5213 {
5214 case GL_LOW_FLOAT:
5215 mCaps.fragmentLowpFloat.get(range, precision);
5216 break;
5217 case GL_MEDIUM_FLOAT:
5218 mCaps.fragmentMediumpFloat.get(range, precision);
5219 break;
5220 case GL_HIGH_FLOAT:
5221 mCaps.fragmentHighpFloat.get(range, precision);
5222 break;
5223
5224 case GL_LOW_INT:
5225 mCaps.fragmentLowpInt.get(range, precision);
5226 break;
5227 case GL_MEDIUM_INT:
5228 mCaps.fragmentMediumpInt.get(range, precision);
5229 break;
5230 case GL_HIGH_INT:
5231 mCaps.fragmentHighpInt.get(range, precision);
5232 break;
5233
5234 default:
5235 UNREACHABLE();
5236 return;
5237 }
5238 break;
5239
5240 default:
5241 UNREACHABLE();
5242 return;
5243 }
5244}
5245
5246void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5247{
5248 Shader *shaderObject = getShader(shader);
5249 ASSERT(shaderObject);
5250 shaderObject->getSource(bufsize, length, source);
5251}
5252
5253void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5254{
5255 Program *programObject = getProgram(program);
5256 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005257 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005258}
5259
Brandon Jones59770802018-04-02 13:18:42 -07005260void Context::getUniformfvRobust(GLuint program,
5261 GLint location,
5262 GLsizei bufSize,
5263 GLsizei *length,
5264 GLfloat *params)
5265{
5266 getUniformfv(program, location, params);
5267}
5268
Jamie Madillc1d770e2017-04-13 17:31:24 -04005269void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5270{
5271 Program *programObject = getProgram(program);
5272 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005273 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005274}
5275
Brandon Jones59770802018-04-02 13:18:42 -07005276void Context::getUniformivRobust(GLuint program,
5277 GLint location,
5278 GLsizei bufSize,
5279 GLsizei *length,
5280 GLint *params)
5281{
5282 getUniformiv(program, location, params);
5283}
5284
Jamie Madillc1d770e2017-04-13 17:31:24 -04005285GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5286{
5287 Program *programObject = getProgram(program);
5288 ASSERT(programObject);
5289 return programObject->getUniformLocation(name);
5290}
5291
5292GLboolean Context::isBuffer(GLuint buffer)
5293{
5294 if (buffer == 0)
5295 {
5296 return GL_FALSE;
5297 }
5298
5299 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5300}
5301
5302GLboolean Context::isEnabled(GLenum cap)
5303{
5304 return mGLState.getEnableFeature(cap);
5305}
5306
5307GLboolean Context::isFramebuffer(GLuint framebuffer)
5308{
5309 if (framebuffer == 0)
5310 {
5311 return GL_FALSE;
5312 }
5313
5314 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5315}
5316
5317GLboolean Context::isProgram(GLuint program)
5318{
5319 if (program == 0)
5320 {
5321 return GL_FALSE;
5322 }
5323
5324 return (getProgram(program) ? GL_TRUE : GL_FALSE);
5325}
5326
5327GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5328{
5329 if (renderbuffer == 0)
5330 {
5331 return GL_FALSE;
5332 }
5333
5334 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5335}
5336
5337GLboolean Context::isShader(GLuint shader)
5338{
5339 if (shader == 0)
5340 {
5341 return GL_FALSE;
5342 }
5343
5344 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5345}
5346
5347GLboolean Context::isTexture(GLuint texture)
5348{
5349 if (texture == 0)
5350 {
5351 return GL_FALSE;
5352 }
5353
5354 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5355}
5356
5357void Context::linkProgram(GLuint program)
5358{
5359 Program *programObject = getProgram(program);
5360 ASSERT(programObject);
5361 handleError(programObject->link(this));
Martin Radev0abb7a22017-08-28 15:34:45 +03005362 mGLState.onProgramExecutableChange(programObject);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005363}
5364
5365void Context::releaseShaderCompiler()
5366{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005367 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005368}
5369
5370void Context::shaderBinary(GLsizei n,
5371 const GLuint *shaders,
5372 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005373 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005374 GLsizei length)
5375{
5376 // No binary shader formats are supported.
5377 UNIMPLEMENTED();
5378}
5379
5380void Context::shaderSource(GLuint shader,
5381 GLsizei count,
5382 const GLchar *const *string,
5383 const GLint *length)
5384{
5385 Shader *shaderObject = getShader(shader);
5386 ASSERT(shaderObject);
5387 shaderObject->setSource(count, string, length);
5388}
5389
5390void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5391{
5392 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5393}
5394
5395void Context::stencilMask(GLuint mask)
5396{
5397 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5398}
5399
5400void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5401{
5402 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5403}
5404
5405void Context::uniform1f(GLint location, GLfloat x)
5406{
5407 Program *program = mGLState.getProgram();
5408 program->setUniform1fv(location, 1, &x);
5409}
5410
5411void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5412{
5413 Program *program = mGLState.getProgram();
5414 program->setUniform1fv(location, count, v);
5415}
5416
5417void Context::uniform1i(GLint location, GLint x)
5418{
5419 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04005420 if (program->setUniform1iv(location, 1, &x) == Program::SetUniformResult::SamplerChanged)
5421 {
5422 mGLState.setObjectDirty(GL_PROGRAM);
5423 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005424}
5425
5426void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5427{
5428 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04005429 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
5430 {
5431 mGLState.setObjectDirty(GL_PROGRAM);
5432 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005433}
5434
5435void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5436{
5437 GLfloat xy[2] = {x, y};
5438 Program *program = mGLState.getProgram();
5439 program->setUniform2fv(location, 1, xy);
5440}
5441
5442void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5443{
5444 Program *program = mGLState.getProgram();
5445 program->setUniform2fv(location, count, v);
5446}
5447
5448void Context::uniform2i(GLint location, GLint x, GLint y)
5449{
5450 GLint xy[2] = {x, y};
5451 Program *program = mGLState.getProgram();
5452 program->setUniform2iv(location, 1, xy);
5453}
5454
5455void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5456{
5457 Program *program = mGLState.getProgram();
5458 program->setUniform2iv(location, count, v);
5459}
5460
5461void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5462{
5463 GLfloat xyz[3] = {x, y, z};
5464 Program *program = mGLState.getProgram();
5465 program->setUniform3fv(location, 1, xyz);
5466}
5467
5468void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5469{
5470 Program *program = mGLState.getProgram();
5471 program->setUniform3fv(location, count, v);
5472}
5473
5474void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5475{
5476 GLint xyz[3] = {x, y, z};
5477 Program *program = mGLState.getProgram();
5478 program->setUniform3iv(location, 1, xyz);
5479}
5480
5481void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5482{
5483 Program *program = mGLState.getProgram();
5484 program->setUniform3iv(location, count, v);
5485}
5486
5487void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5488{
5489 GLfloat xyzw[4] = {x, y, z, w};
5490 Program *program = mGLState.getProgram();
5491 program->setUniform4fv(location, 1, xyzw);
5492}
5493
5494void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5495{
5496 Program *program = mGLState.getProgram();
5497 program->setUniform4fv(location, count, v);
5498}
5499
5500void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5501{
5502 GLint xyzw[4] = {x, y, z, w};
5503 Program *program = mGLState.getProgram();
5504 program->setUniform4iv(location, 1, xyzw);
5505}
5506
5507void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5508{
5509 Program *program = mGLState.getProgram();
5510 program->setUniform4iv(location, count, v);
5511}
5512
5513void Context::uniformMatrix2fv(GLint location,
5514 GLsizei count,
5515 GLboolean transpose,
5516 const GLfloat *value)
5517{
5518 Program *program = mGLState.getProgram();
5519 program->setUniformMatrix2fv(location, count, transpose, value);
5520}
5521
5522void Context::uniformMatrix3fv(GLint location,
5523 GLsizei count,
5524 GLboolean transpose,
5525 const GLfloat *value)
5526{
5527 Program *program = mGLState.getProgram();
5528 program->setUniformMatrix3fv(location, count, transpose, value);
5529}
5530
5531void Context::uniformMatrix4fv(GLint location,
5532 GLsizei count,
5533 GLboolean transpose,
5534 const GLfloat *value)
5535{
5536 Program *program = mGLState.getProgram();
5537 program->setUniformMatrix4fv(location, count, transpose, value);
5538}
5539
5540void Context::validateProgram(GLuint program)
5541{
5542 Program *programObject = getProgram(program);
5543 ASSERT(programObject);
5544 programObject->validate(mCaps);
5545}
5546
Jiajia Qin5451d532017-11-16 17:16:34 +08005547void Context::validateProgramPipeline(GLuint pipeline)
5548{
5549 UNIMPLEMENTED();
5550}
5551
Jamie Madilld04908b2017-06-09 14:15:35 -04005552void Context::getProgramBinary(GLuint program,
5553 GLsizei bufSize,
5554 GLsizei *length,
5555 GLenum *binaryFormat,
5556 void *binary)
5557{
5558 Program *programObject = getProgram(program);
5559 ASSERT(programObject != nullptr);
5560
5561 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
5562}
5563
5564void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
5565{
5566 Program *programObject = getProgram(program);
5567 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04005568
Jamie Madilld04908b2017-06-09 14:15:35 -04005569 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
5570}
5571
Jamie Madillff325f12017-08-26 15:06:05 -04005572void Context::uniform1ui(GLint location, GLuint v0)
5573{
5574 Program *program = mGLState.getProgram();
5575 program->setUniform1uiv(location, 1, &v0);
5576}
5577
5578void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
5579{
5580 Program *program = mGLState.getProgram();
5581 const GLuint xy[] = {v0, v1};
5582 program->setUniform2uiv(location, 1, xy);
5583}
5584
5585void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
5586{
5587 Program *program = mGLState.getProgram();
5588 const GLuint xyz[] = {v0, v1, v2};
5589 program->setUniform3uiv(location, 1, xyz);
5590}
5591
5592void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
5593{
5594 Program *program = mGLState.getProgram();
5595 const GLuint xyzw[] = {v0, v1, v2, v3};
5596 program->setUniform4uiv(location, 1, xyzw);
5597}
5598
5599void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
5600{
5601 Program *program = mGLState.getProgram();
5602 program->setUniform1uiv(location, count, value);
5603}
5604void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
5605{
5606 Program *program = mGLState.getProgram();
5607 program->setUniform2uiv(location, count, value);
5608}
5609
5610void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
5611{
5612 Program *program = mGLState.getProgram();
5613 program->setUniform3uiv(location, count, value);
5614}
5615
5616void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
5617{
5618 Program *program = mGLState.getProgram();
5619 program->setUniform4uiv(location, count, value);
5620}
5621
Jamie Madillf0e04492017-08-26 15:28:42 -04005622void Context::genQueries(GLsizei n, GLuint *ids)
5623{
5624 for (GLsizei i = 0; i < n; i++)
5625 {
5626 GLuint handle = mQueryHandleAllocator.allocate();
5627 mQueryMap.assign(handle, nullptr);
5628 ids[i] = handle;
5629 }
5630}
5631
5632void Context::deleteQueries(GLsizei n, const GLuint *ids)
5633{
5634 for (int i = 0; i < n; i++)
5635 {
5636 GLuint query = ids[i];
5637
5638 Query *queryObject = nullptr;
5639 if (mQueryMap.erase(query, &queryObject))
5640 {
5641 mQueryHandleAllocator.release(query);
5642 if (queryObject)
5643 {
5644 queryObject->release(this);
5645 }
5646 }
5647 }
5648}
5649
5650GLboolean Context::isQuery(GLuint id)
5651{
5652 return (getQuery(id, false, GL_NONE) != nullptr) ? GL_TRUE : GL_FALSE;
5653}
5654
Jamie Madillc8c95812017-08-26 18:40:09 -04005655void Context::uniformMatrix2x3fv(GLint location,
5656 GLsizei count,
5657 GLboolean transpose,
5658 const GLfloat *value)
5659{
5660 Program *program = mGLState.getProgram();
5661 program->setUniformMatrix2x3fv(location, count, transpose, value);
5662}
5663
5664void Context::uniformMatrix3x2fv(GLint location,
5665 GLsizei count,
5666 GLboolean transpose,
5667 const GLfloat *value)
5668{
5669 Program *program = mGLState.getProgram();
5670 program->setUniformMatrix3x2fv(location, count, transpose, value);
5671}
5672
5673void Context::uniformMatrix2x4fv(GLint location,
5674 GLsizei count,
5675 GLboolean transpose,
5676 const GLfloat *value)
5677{
5678 Program *program = mGLState.getProgram();
5679 program->setUniformMatrix2x4fv(location, count, transpose, value);
5680}
5681
5682void Context::uniformMatrix4x2fv(GLint location,
5683 GLsizei count,
5684 GLboolean transpose,
5685 const GLfloat *value)
5686{
5687 Program *program = mGLState.getProgram();
5688 program->setUniformMatrix4x2fv(location, count, transpose, value);
5689}
5690
5691void Context::uniformMatrix3x4fv(GLint location,
5692 GLsizei count,
5693 GLboolean transpose,
5694 const GLfloat *value)
5695{
5696 Program *program = mGLState.getProgram();
5697 program->setUniformMatrix3x4fv(location, count, transpose, value);
5698}
5699
5700void Context::uniformMatrix4x3fv(GLint location,
5701 GLsizei count,
5702 GLboolean transpose,
5703 const GLfloat *value)
5704{
5705 Program *program = mGLState.getProgram();
5706 program->setUniformMatrix4x3fv(location, count, transpose, value);
5707}
5708
Jamie Madilld7576732017-08-26 18:49:50 -04005709void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
5710{
5711 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5712 {
5713 GLuint vertexArray = arrays[arrayIndex];
5714
5715 if (arrays[arrayIndex] != 0)
5716 {
5717 VertexArray *vertexArrayObject = nullptr;
5718 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
5719 {
5720 if (vertexArrayObject != nullptr)
5721 {
5722 detachVertexArray(vertexArray);
5723 vertexArrayObject->onDestroy(this);
5724 }
5725
5726 mVertexArrayHandleAllocator.release(vertexArray);
5727 }
5728 }
5729 }
5730}
5731
5732void Context::genVertexArrays(GLsizei n, GLuint *arrays)
5733{
5734 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5735 {
5736 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
5737 mVertexArrayMap.assign(vertexArray, nullptr);
5738 arrays[arrayIndex] = vertexArray;
5739 }
5740}
5741
5742bool Context::isVertexArray(GLuint array)
5743{
5744 if (array == 0)
5745 {
5746 return GL_FALSE;
5747 }
5748
5749 VertexArray *vao = getVertexArray(array);
5750 return (vao != nullptr ? GL_TRUE : GL_FALSE);
5751}
5752
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04005753void Context::endTransformFeedback()
5754{
5755 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5756 transformFeedback->end(this);
5757}
5758
5759void Context::transformFeedbackVaryings(GLuint program,
5760 GLsizei count,
5761 const GLchar *const *varyings,
5762 GLenum bufferMode)
5763{
5764 Program *programObject = getProgram(program);
5765 ASSERT(programObject);
5766 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
5767}
5768
5769void Context::getTransformFeedbackVarying(GLuint program,
5770 GLuint index,
5771 GLsizei bufSize,
5772 GLsizei *length,
5773 GLsizei *size,
5774 GLenum *type,
5775 GLchar *name)
5776{
5777 Program *programObject = getProgram(program);
5778 ASSERT(programObject);
5779 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
5780}
5781
5782void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
5783{
5784 for (int i = 0; i < n; i++)
5785 {
5786 GLuint transformFeedback = ids[i];
5787 if (transformFeedback == 0)
5788 {
5789 continue;
5790 }
5791
5792 TransformFeedback *transformFeedbackObject = nullptr;
5793 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
5794 {
5795 if (transformFeedbackObject != nullptr)
5796 {
5797 detachTransformFeedback(transformFeedback);
5798 transformFeedbackObject->release(this);
5799 }
5800
5801 mTransformFeedbackHandleAllocator.release(transformFeedback);
5802 }
5803 }
5804}
5805
5806void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
5807{
5808 for (int i = 0; i < n; i++)
5809 {
5810 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
5811 mTransformFeedbackMap.assign(transformFeedback, nullptr);
5812 ids[i] = transformFeedback;
5813 }
5814}
5815
5816bool Context::isTransformFeedback(GLuint id)
5817{
5818 if (id == 0)
5819 {
5820 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
5821 // returns FALSE
5822 return GL_FALSE;
5823 }
5824
5825 const TransformFeedback *transformFeedback = getTransformFeedback(id);
5826 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
5827}
5828
5829void Context::pauseTransformFeedback()
5830{
5831 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5832 transformFeedback->pause();
5833}
5834
5835void Context::resumeTransformFeedback()
5836{
5837 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5838 transformFeedback->resume();
5839}
5840
Jamie Madill12e957f2017-08-26 21:42:26 -04005841void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
5842{
5843 const Program *programObject = getProgram(program);
Jamie Madill54164b02017-08-28 15:17:37 -04005844 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04005845}
5846
Brandon Jones59770802018-04-02 13:18:42 -07005847void Context::getUniformuivRobust(GLuint program,
5848 GLint location,
5849 GLsizei bufSize,
5850 GLsizei *length,
5851 GLuint *params)
5852{
5853 getUniformuiv(program, location, params);
5854}
5855
Jamie Madill12e957f2017-08-26 21:42:26 -04005856GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
5857{
5858 const Program *programObject = getProgram(program);
5859 return programObject->getFragDataLocation(name);
5860}
5861
5862void Context::getUniformIndices(GLuint program,
5863 GLsizei uniformCount,
5864 const GLchar *const *uniformNames,
5865 GLuint *uniformIndices)
5866{
5867 const Program *programObject = getProgram(program);
5868 if (!programObject->isLinked())
5869 {
5870 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5871 {
5872 uniformIndices[uniformId] = GL_INVALID_INDEX;
5873 }
5874 }
5875 else
5876 {
5877 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5878 {
5879 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
5880 }
5881 }
5882}
5883
5884void Context::getActiveUniformsiv(GLuint program,
5885 GLsizei uniformCount,
5886 const GLuint *uniformIndices,
5887 GLenum pname,
5888 GLint *params)
5889{
5890 const Program *programObject = getProgram(program);
5891 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5892 {
5893 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08005894 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04005895 }
5896}
5897
5898GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
5899{
5900 const Program *programObject = getProgram(program);
5901 return programObject->getUniformBlockIndex(uniformBlockName);
5902}
5903
5904void Context::getActiveUniformBlockiv(GLuint program,
5905 GLuint uniformBlockIndex,
5906 GLenum pname,
5907 GLint *params)
5908{
5909 const Program *programObject = getProgram(program);
5910 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
5911}
5912
Brandon Jones59770802018-04-02 13:18:42 -07005913void Context::getActiveUniformBlockivRobust(GLuint program,
5914 GLuint uniformBlockIndex,
5915 GLenum pname,
5916 GLsizei bufSize,
5917 GLsizei *length,
5918 GLint *params)
5919{
5920 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
5921}
5922
Jamie Madill12e957f2017-08-26 21:42:26 -04005923void Context::getActiveUniformBlockName(GLuint program,
5924 GLuint uniformBlockIndex,
5925 GLsizei bufSize,
5926 GLsizei *length,
5927 GLchar *uniformBlockName)
5928{
5929 const Program *programObject = getProgram(program);
5930 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
5931}
5932
5933void Context::uniformBlockBinding(GLuint program,
5934 GLuint uniformBlockIndex,
5935 GLuint uniformBlockBinding)
5936{
5937 Program *programObject = getProgram(program);
5938 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
5939}
5940
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005941GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
5942{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005943 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
5944 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005945
Jamie Madill70b5bb02017-08-28 13:32:37 -04005946 Sync *syncObject = getSync(syncHandle);
5947 Error error = syncObject->set(condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005948 if (error.isError())
5949 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04005950 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005951 handleError(error);
5952 return nullptr;
5953 }
5954
Jamie Madill70b5bb02017-08-28 13:32:37 -04005955 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005956}
5957
5958GLboolean Context::isSync(GLsync sync)
5959{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005960 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005961}
5962
5963GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5964{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005965 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005966
5967 GLenum result = GL_WAIT_FAILED;
5968 handleError(syncObject->clientWait(flags, timeout, &result));
5969 return result;
5970}
5971
5972void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5973{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005974 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005975 handleError(syncObject->serverWait(flags, timeout));
5976}
5977
5978void Context::getInteger64v(GLenum pname, GLint64 *params)
5979{
5980 GLenum nativeType = GL_NONE;
5981 unsigned int numParams = 0;
5982 getQueryParameterInfo(pname, &nativeType, &numParams);
5983
5984 if (nativeType == GL_INT_64_ANGLEX)
5985 {
5986 getInteger64vImpl(pname, params);
5987 }
5988 else
5989 {
5990 CastStateValues(this, nativeType, pname, numParams, params);
5991 }
5992}
5993
Brandon Jones59770802018-04-02 13:18:42 -07005994void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
5995{
5996 getInteger64v(pname, data);
5997}
5998
Corentin Wallez336129f2017-10-17 15:55:40 -04005999void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006000{
6001 Buffer *buffer = mGLState.getTargetBuffer(target);
6002 QueryBufferParameteri64v(buffer, pname, params);
6003}
6004
Brandon Jones59770802018-04-02 13:18:42 -07006005void Context::getBufferParameteri64vRobust(BufferBinding target,
6006 GLenum pname,
6007 GLsizei bufSize,
6008 GLsizei *length,
6009 GLint64 *params)
6010{
6011 getBufferParameteri64v(target, pname, params);
6012}
6013
Jamie Madill3ef140a2017-08-26 23:11:21 -04006014void Context::genSamplers(GLsizei count, GLuint *samplers)
6015{
6016 for (int i = 0; i < count; i++)
6017 {
6018 samplers[i] = mState.mSamplers->createSampler();
6019 }
6020}
6021
6022void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6023{
6024 for (int i = 0; i < count; i++)
6025 {
6026 GLuint sampler = samplers[i];
6027
6028 if (mState.mSamplers->getSampler(sampler))
6029 {
6030 detachSampler(sampler);
6031 }
6032
6033 mState.mSamplers->deleteObject(this, sampler);
6034 }
6035}
6036
6037void Context::getInternalformativ(GLenum target,
6038 GLenum internalformat,
6039 GLenum pname,
6040 GLsizei bufSize,
6041 GLint *params)
6042{
6043 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6044 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6045}
6046
Brandon Jones59770802018-04-02 13:18:42 -07006047void Context::getInternalformativRobust(GLenum target,
6048 GLenum internalformat,
6049 GLenum pname,
6050 GLsizei bufSize,
6051 GLsizei *length,
6052 GLint *params)
6053{
6054 getInternalformativ(target, internalformat, pname, bufSize, params);
6055}
6056
Jiajia Qin5451d532017-11-16 17:16:34 +08006057void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6058{
6059 programUniform1iv(program, location, 1, &v0);
6060}
6061
6062void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6063{
6064 GLint xy[2] = {v0, v1};
6065 programUniform2iv(program, location, 1, xy);
6066}
6067
6068void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6069{
6070 GLint xyz[3] = {v0, v1, v2};
6071 programUniform3iv(program, location, 1, xyz);
6072}
6073
6074void Context::programUniform4i(GLuint program,
6075 GLint location,
6076 GLint v0,
6077 GLint v1,
6078 GLint v2,
6079 GLint v3)
6080{
6081 GLint xyzw[4] = {v0, v1, v2, v3};
6082 programUniform4iv(program, location, 1, xyzw);
6083}
6084
6085void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6086{
6087 programUniform1uiv(program, location, 1, &v0);
6088}
6089
6090void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6091{
6092 GLuint xy[2] = {v0, v1};
6093 programUniform2uiv(program, location, 1, xy);
6094}
6095
6096void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6097{
6098 GLuint xyz[3] = {v0, v1, v2};
6099 programUniform3uiv(program, location, 1, xyz);
6100}
6101
6102void Context::programUniform4ui(GLuint program,
6103 GLint location,
6104 GLuint v0,
6105 GLuint v1,
6106 GLuint v2,
6107 GLuint v3)
6108{
6109 GLuint xyzw[4] = {v0, v1, v2, v3};
6110 programUniform4uiv(program, location, 1, xyzw);
6111}
6112
6113void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6114{
6115 programUniform1fv(program, location, 1, &v0);
6116}
6117
6118void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6119{
6120 GLfloat xy[2] = {v0, v1};
6121 programUniform2fv(program, location, 1, xy);
6122}
6123
6124void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6125{
6126 GLfloat xyz[3] = {v0, v1, v2};
6127 programUniform3fv(program, location, 1, xyz);
6128}
6129
6130void Context::programUniform4f(GLuint program,
6131 GLint location,
6132 GLfloat v0,
6133 GLfloat v1,
6134 GLfloat v2,
6135 GLfloat v3)
6136{
6137 GLfloat xyzw[4] = {v0, v1, v2, v3};
6138 programUniform4fv(program, location, 1, xyzw);
6139}
6140
Jamie Madill81c2e252017-09-09 23:32:46 -04006141void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6142{
6143 Program *programObject = getProgram(program);
6144 ASSERT(programObject);
6145 if (programObject->setUniform1iv(location, count, value) ==
6146 Program::SetUniformResult::SamplerChanged)
6147 {
6148 mGLState.setObjectDirty(GL_PROGRAM);
6149 }
6150}
6151
Jiajia Qin5451d532017-11-16 17:16:34 +08006152void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6153{
6154 Program *programObject = getProgram(program);
6155 ASSERT(programObject);
6156 programObject->setUniform2iv(location, count, value);
6157}
6158
6159void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6160{
6161 Program *programObject = getProgram(program);
6162 ASSERT(programObject);
6163 programObject->setUniform3iv(location, count, value);
6164}
6165
6166void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6167{
6168 Program *programObject = getProgram(program);
6169 ASSERT(programObject);
6170 programObject->setUniform4iv(location, count, value);
6171}
6172
6173void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6174{
6175 Program *programObject = getProgram(program);
6176 ASSERT(programObject);
6177 programObject->setUniform1uiv(location, count, value);
6178}
6179
6180void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6181{
6182 Program *programObject = getProgram(program);
6183 ASSERT(programObject);
6184 programObject->setUniform2uiv(location, count, value);
6185}
6186
6187void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6188{
6189 Program *programObject = getProgram(program);
6190 ASSERT(programObject);
6191 programObject->setUniform3uiv(location, count, value);
6192}
6193
6194void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6195{
6196 Program *programObject = getProgram(program);
6197 ASSERT(programObject);
6198 programObject->setUniform4uiv(location, count, value);
6199}
6200
6201void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6202{
6203 Program *programObject = getProgram(program);
6204 ASSERT(programObject);
6205 programObject->setUniform1fv(location, count, value);
6206}
6207
6208void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6209{
6210 Program *programObject = getProgram(program);
6211 ASSERT(programObject);
6212 programObject->setUniform2fv(location, count, value);
6213}
6214
6215void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6216{
6217 Program *programObject = getProgram(program);
6218 ASSERT(programObject);
6219 programObject->setUniform3fv(location, count, value);
6220}
6221
6222void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6223{
6224 Program *programObject = getProgram(program);
6225 ASSERT(programObject);
6226 programObject->setUniform4fv(location, count, value);
6227}
6228
6229void Context::programUniformMatrix2fv(GLuint program,
6230 GLint location,
6231 GLsizei count,
6232 GLboolean transpose,
6233 const GLfloat *value)
6234{
6235 Program *programObject = getProgram(program);
6236 ASSERT(programObject);
6237 programObject->setUniformMatrix2fv(location, count, transpose, value);
6238}
6239
6240void Context::programUniformMatrix3fv(GLuint program,
6241 GLint location,
6242 GLsizei count,
6243 GLboolean transpose,
6244 const GLfloat *value)
6245{
6246 Program *programObject = getProgram(program);
6247 ASSERT(programObject);
6248 programObject->setUniformMatrix3fv(location, count, transpose, value);
6249}
6250
6251void Context::programUniformMatrix4fv(GLuint program,
6252 GLint location,
6253 GLsizei count,
6254 GLboolean transpose,
6255 const GLfloat *value)
6256{
6257 Program *programObject = getProgram(program);
6258 ASSERT(programObject);
6259 programObject->setUniformMatrix4fv(location, count, transpose, value);
6260}
6261
6262void Context::programUniformMatrix2x3fv(GLuint program,
6263 GLint location,
6264 GLsizei count,
6265 GLboolean transpose,
6266 const GLfloat *value)
6267{
6268 Program *programObject = getProgram(program);
6269 ASSERT(programObject);
6270 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6271}
6272
6273void Context::programUniformMatrix3x2fv(GLuint program,
6274 GLint location,
6275 GLsizei count,
6276 GLboolean transpose,
6277 const GLfloat *value)
6278{
6279 Program *programObject = getProgram(program);
6280 ASSERT(programObject);
6281 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6282}
6283
6284void Context::programUniformMatrix2x4fv(GLuint program,
6285 GLint location,
6286 GLsizei count,
6287 GLboolean transpose,
6288 const GLfloat *value)
6289{
6290 Program *programObject = getProgram(program);
6291 ASSERT(programObject);
6292 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6293}
6294
6295void Context::programUniformMatrix4x2fv(GLuint program,
6296 GLint location,
6297 GLsizei count,
6298 GLboolean transpose,
6299 const GLfloat *value)
6300{
6301 Program *programObject = getProgram(program);
6302 ASSERT(programObject);
6303 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6304}
6305
6306void Context::programUniformMatrix3x4fv(GLuint program,
6307 GLint location,
6308 GLsizei count,
6309 GLboolean transpose,
6310 const GLfloat *value)
6311{
6312 Program *programObject = getProgram(program);
6313 ASSERT(programObject);
6314 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6315}
6316
6317void Context::programUniformMatrix4x3fv(GLuint program,
6318 GLint location,
6319 GLsizei count,
6320 GLboolean transpose,
6321 const GLfloat *value)
6322{
6323 Program *programObject = getProgram(program);
6324 ASSERT(programObject);
6325 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6326}
6327
Jamie Madill81c2e252017-09-09 23:32:46 -04006328void Context::onTextureChange(const Texture *texture)
6329{
6330 // Conservatively assume all textures are dirty.
6331 // TODO(jmadill): More fine-grained update.
6332 mGLState.setObjectDirty(GL_TEXTURE);
6333}
6334
James Darpiniane8a93c62018-01-04 18:02:24 -08006335bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6336{
6337 return mGLState.isCurrentTransformFeedback(tf);
6338}
6339bool Context::isCurrentVertexArray(const VertexArray *va) const
6340{
6341 return mGLState.isCurrentVertexArray(va);
6342}
6343
Yunchao Hea336b902017-08-02 16:05:21 +08006344void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6345{
6346 for (int i = 0; i < count; i++)
6347 {
6348 pipelines[i] = createProgramPipeline();
6349 }
6350}
6351
6352void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6353{
6354 for (int i = 0; i < count; i++)
6355 {
6356 if (pipelines[i] != 0)
6357 {
6358 deleteProgramPipeline(pipelines[i]);
6359 }
6360 }
6361}
6362
6363GLboolean Context::isProgramPipeline(GLuint pipeline)
6364{
6365 if (pipeline == 0)
6366 {
6367 return GL_FALSE;
6368 }
6369
6370 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6371}
6372
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006373void Context::finishFenceNV(GLuint fence)
6374{
6375 FenceNV *fenceObject = getFenceNV(fence);
6376
6377 ASSERT(fenceObject && fenceObject->isSet());
6378 handleError(fenceObject->finish());
6379}
6380
6381void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6382{
6383 FenceNV *fenceObject = getFenceNV(fence);
6384
6385 ASSERT(fenceObject && fenceObject->isSet());
6386
6387 switch (pname)
6388 {
6389 case GL_FENCE_STATUS_NV:
6390 {
6391 // GL_NV_fence spec:
6392 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6393 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6394 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6395 GLboolean status = GL_TRUE;
6396 if (fenceObject->getStatus() != GL_TRUE)
6397 {
6398 ANGLE_CONTEXT_TRY(fenceObject->test(&status));
6399 }
6400 *params = status;
6401 break;
6402 }
6403
6404 case GL_FENCE_CONDITION_NV:
6405 {
6406 *params = static_cast<GLint>(fenceObject->getCondition());
6407 break;
6408 }
6409
6410 default:
6411 UNREACHABLE();
6412 }
6413}
6414
6415void Context::getTranslatedShaderSource(GLuint shader,
6416 GLsizei bufsize,
6417 GLsizei *length,
6418 GLchar *source)
6419{
6420 Shader *shaderObject = getShader(shader);
6421 ASSERT(shaderObject);
6422 shaderObject->getTranslatedSourceWithDebugInfo(this, bufsize, length, source);
6423}
6424
6425void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6426{
6427 Program *programObject = getProgram(program);
6428 ASSERT(programObject);
6429
6430 programObject->getUniformfv(this, location, params);
6431}
6432
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006433void Context::getnUniformfvRobust(GLuint program,
6434 GLint location,
6435 GLsizei bufSize,
6436 GLsizei *length,
6437 GLfloat *params)
6438{
6439 UNIMPLEMENTED();
6440}
6441
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006442void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6443{
6444 Program *programObject = getProgram(program);
6445 ASSERT(programObject);
6446
6447 programObject->getUniformiv(this, location, params);
6448}
6449
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006450void Context::getnUniformivRobust(GLuint program,
6451 GLint location,
6452 GLsizei bufSize,
6453 GLsizei *length,
6454 GLint *params)
6455{
6456 UNIMPLEMENTED();
6457}
6458
6459void Context::getnUniformuivRobust(GLuint program,
6460 GLint location,
6461 GLsizei bufSize,
6462 GLsizei *length,
6463 GLuint *params)
6464{
6465 UNIMPLEMENTED();
6466}
6467
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006468GLboolean Context::isFenceNV(GLuint fence)
6469{
6470 FenceNV *fenceObject = getFenceNV(fence);
6471
6472 if (fenceObject == nullptr)
6473 {
6474 return GL_FALSE;
6475 }
6476
6477 // GL_NV_fence spec:
6478 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6479 // existing fence.
6480 return fenceObject->isSet();
6481}
6482
6483void Context::readnPixels(GLint x,
6484 GLint y,
6485 GLsizei width,
6486 GLsizei height,
6487 GLenum format,
6488 GLenum type,
6489 GLsizei bufSize,
6490 void *data)
6491{
6492 return readPixels(x, y, width, height, format, type, data);
6493}
6494
Jamie Madill007530e2017-12-28 14:27:04 -05006495void Context::setFenceNV(GLuint fence, GLenum condition)
6496{
6497 ASSERT(condition == GL_ALL_COMPLETED_NV);
6498
6499 FenceNV *fenceObject = getFenceNV(fence);
6500 ASSERT(fenceObject != nullptr);
6501 handleError(fenceObject->set(condition));
6502}
6503
6504GLboolean Context::testFenceNV(GLuint fence)
6505{
6506 FenceNV *fenceObject = getFenceNV(fence);
6507
6508 ASSERT(fenceObject != nullptr);
6509 ASSERT(fenceObject->isSet() == GL_TRUE);
6510
6511 GLboolean result = GL_TRUE;
6512 Error error = fenceObject->test(&result);
6513 if (error.isError())
6514 {
6515 handleError(error);
6516 return GL_TRUE;
6517 }
6518
6519 return result;
6520}
6521
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006522void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006523{
6524 Texture *texture = getTargetTexture(target);
6525 egl::Image *imageObject = reinterpret_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05006526 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05006527}
6528
Jamie Madillfa920eb2018-01-04 11:45:50 -05006529void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006530{
6531 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
6532 egl::Image *imageObject = reinterpret_cast<egl::Image *>(image);
6533 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
6534}
6535
Jamie Madillfa920eb2018-01-04 11:45:50 -05006536void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
6537{
6538 UNIMPLEMENTED();
6539}
6540
Jamie Madill5b772312018-03-08 20:28:32 -05006541bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
6542{
6543 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
6544 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
6545 // to the fact that it is stored internally as a float, and so would require conversion
6546 // if returned from Context::getIntegerv. Since this conversion is already implemented
6547 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
6548 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
6549 // application.
6550 switch (pname)
6551 {
6552 case GL_COMPRESSED_TEXTURE_FORMATS:
6553 {
6554 *type = GL_INT;
6555 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
6556 return true;
6557 }
6558 case GL_SHADER_BINARY_FORMATS:
6559 {
6560 *type = GL_INT;
6561 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
6562 return true;
6563 }
6564
6565 case GL_MAX_VERTEX_ATTRIBS:
6566 case GL_MAX_VERTEX_UNIFORM_VECTORS:
6567 case GL_MAX_VARYING_VECTORS:
6568 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
6569 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
6570 case GL_MAX_TEXTURE_IMAGE_UNITS:
6571 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
6572 case GL_MAX_RENDERBUFFER_SIZE:
6573 case GL_NUM_SHADER_BINARY_FORMATS:
6574 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
6575 case GL_ARRAY_BUFFER_BINDING:
6576 case GL_FRAMEBUFFER_BINDING:
6577 case GL_RENDERBUFFER_BINDING:
6578 case GL_CURRENT_PROGRAM:
6579 case GL_PACK_ALIGNMENT:
6580 case GL_UNPACK_ALIGNMENT:
6581 case GL_GENERATE_MIPMAP_HINT:
6582 case GL_RED_BITS:
6583 case GL_GREEN_BITS:
6584 case GL_BLUE_BITS:
6585 case GL_ALPHA_BITS:
6586 case GL_DEPTH_BITS:
6587 case GL_STENCIL_BITS:
6588 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
6589 case GL_CULL_FACE_MODE:
6590 case GL_FRONT_FACE:
6591 case GL_ACTIVE_TEXTURE:
6592 case GL_STENCIL_FUNC:
6593 case GL_STENCIL_VALUE_MASK:
6594 case GL_STENCIL_REF:
6595 case GL_STENCIL_FAIL:
6596 case GL_STENCIL_PASS_DEPTH_FAIL:
6597 case GL_STENCIL_PASS_DEPTH_PASS:
6598 case GL_STENCIL_BACK_FUNC:
6599 case GL_STENCIL_BACK_VALUE_MASK:
6600 case GL_STENCIL_BACK_REF:
6601 case GL_STENCIL_BACK_FAIL:
6602 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
6603 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
6604 case GL_DEPTH_FUNC:
6605 case GL_BLEND_SRC_RGB:
6606 case GL_BLEND_SRC_ALPHA:
6607 case GL_BLEND_DST_RGB:
6608 case GL_BLEND_DST_ALPHA:
6609 case GL_BLEND_EQUATION_RGB:
6610 case GL_BLEND_EQUATION_ALPHA:
6611 case GL_STENCIL_WRITEMASK:
6612 case GL_STENCIL_BACK_WRITEMASK:
6613 case GL_STENCIL_CLEAR_VALUE:
6614 case GL_SUBPIXEL_BITS:
6615 case GL_MAX_TEXTURE_SIZE:
6616 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
6617 case GL_SAMPLE_BUFFERS:
6618 case GL_SAMPLES:
6619 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
6620 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
6621 case GL_TEXTURE_BINDING_2D:
6622 case GL_TEXTURE_BINDING_CUBE_MAP:
6623 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
6624 {
6625 *type = GL_INT;
6626 *numParams = 1;
6627 return true;
6628 }
6629 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
6630 {
6631 if (!getExtensions().packReverseRowOrder)
6632 {
6633 return false;
6634 }
6635 *type = GL_INT;
6636 *numParams = 1;
6637 return true;
6638 }
6639 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
6640 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
6641 {
6642 if (!getExtensions().textureRectangle)
6643 {
6644 return false;
6645 }
6646 *type = GL_INT;
6647 *numParams = 1;
6648 return true;
6649 }
6650 case GL_MAX_DRAW_BUFFERS_EXT:
6651 case GL_MAX_COLOR_ATTACHMENTS_EXT:
6652 {
6653 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
6654 {
6655 return false;
6656 }
6657 *type = GL_INT;
6658 *numParams = 1;
6659 return true;
6660 }
6661 case GL_MAX_VIEWPORT_DIMS:
6662 {
6663 *type = GL_INT;
6664 *numParams = 2;
6665 return true;
6666 }
6667 case GL_VIEWPORT:
6668 case GL_SCISSOR_BOX:
6669 {
6670 *type = GL_INT;
6671 *numParams = 4;
6672 return true;
6673 }
6674 case GL_SHADER_COMPILER:
6675 case GL_SAMPLE_COVERAGE_INVERT:
6676 case GL_DEPTH_WRITEMASK:
6677 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
6678 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
6679 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
6680 // bool-natural
6681 case GL_SAMPLE_COVERAGE:
6682 case GL_SCISSOR_TEST:
6683 case GL_STENCIL_TEST:
6684 case GL_DEPTH_TEST:
6685 case GL_BLEND:
6686 case GL_DITHER:
6687 case GL_CONTEXT_ROBUST_ACCESS_EXT:
6688 {
6689 *type = GL_BOOL;
6690 *numParams = 1;
6691 return true;
6692 }
6693 case GL_COLOR_WRITEMASK:
6694 {
6695 *type = GL_BOOL;
6696 *numParams = 4;
6697 return true;
6698 }
6699 case GL_POLYGON_OFFSET_FACTOR:
6700 case GL_POLYGON_OFFSET_UNITS:
6701 case GL_SAMPLE_COVERAGE_VALUE:
6702 case GL_DEPTH_CLEAR_VALUE:
6703 case GL_LINE_WIDTH:
6704 {
6705 *type = GL_FLOAT;
6706 *numParams = 1;
6707 return true;
6708 }
6709 case GL_ALIASED_LINE_WIDTH_RANGE:
6710 case GL_ALIASED_POINT_SIZE_RANGE:
6711 case GL_DEPTH_RANGE:
6712 {
6713 *type = GL_FLOAT;
6714 *numParams = 2;
6715 return true;
6716 }
6717 case GL_COLOR_CLEAR_VALUE:
6718 case GL_BLEND_COLOR:
6719 {
6720 *type = GL_FLOAT;
6721 *numParams = 4;
6722 return true;
6723 }
6724 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
6725 if (!getExtensions().textureFilterAnisotropic)
6726 {
6727 return false;
6728 }
6729 *type = GL_FLOAT;
6730 *numParams = 1;
6731 return true;
6732 case GL_TIMESTAMP_EXT:
6733 if (!getExtensions().disjointTimerQuery)
6734 {
6735 return false;
6736 }
6737 *type = GL_INT_64_ANGLEX;
6738 *numParams = 1;
6739 return true;
6740 case GL_GPU_DISJOINT_EXT:
6741 if (!getExtensions().disjointTimerQuery)
6742 {
6743 return false;
6744 }
6745 *type = GL_INT;
6746 *numParams = 1;
6747 return true;
6748 case GL_COVERAGE_MODULATION_CHROMIUM:
6749 if (!getExtensions().framebufferMixedSamples)
6750 {
6751 return false;
6752 }
6753 *type = GL_INT;
6754 *numParams = 1;
6755 return true;
6756 case GL_TEXTURE_BINDING_EXTERNAL_OES:
6757 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
6758 {
6759 return false;
6760 }
6761 *type = GL_INT;
6762 *numParams = 1;
6763 return true;
6764 }
6765
6766 if (getExtensions().debug)
6767 {
6768 switch (pname)
6769 {
6770 case GL_DEBUG_LOGGED_MESSAGES:
6771 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
6772 case GL_DEBUG_GROUP_STACK_DEPTH:
6773 case GL_MAX_DEBUG_MESSAGE_LENGTH:
6774 case GL_MAX_DEBUG_LOGGED_MESSAGES:
6775 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
6776 case GL_MAX_LABEL_LENGTH:
6777 *type = GL_INT;
6778 *numParams = 1;
6779 return true;
6780
6781 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
6782 case GL_DEBUG_OUTPUT:
6783 *type = GL_BOOL;
6784 *numParams = 1;
6785 return true;
6786 }
6787 }
6788
6789 if (getExtensions().multisampleCompatibility)
6790 {
6791 switch (pname)
6792 {
6793 case GL_MULTISAMPLE_EXT:
6794 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
6795 *type = GL_BOOL;
6796 *numParams = 1;
6797 return true;
6798 }
6799 }
6800
6801 if (getExtensions().pathRendering)
6802 {
6803 switch (pname)
6804 {
6805 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
6806 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
6807 *type = GL_FLOAT;
6808 *numParams = 16;
6809 return true;
6810 }
6811 }
6812
6813 if (getExtensions().bindGeneratesResource)
6814 {
6815 switch (pname)
6816 {
6817 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
6818 *type = GL_BOOL;
6819 *numParams = 1;
6820 return true;
6821 }
6822 }
6823
6824 if (getExtensions().clientArrays)
6825 {
6826 switch (pname)
6827 {
6828 case GL_CLIENT_ARRAYS_ANGLE:
6829 *type = GL_BOOL;
6830 *numParams = 1;
6831 return true;
6832 }
6833 }
6834
6835 if (getExtensions().sRGBWriteControl)
6836 {
6837 switch (pname)
6838 {
6839 case GL_FRAMEBUFFER_SRGB_EXT:
6840 *type = GL_BOOL;
6841 *numParams = 1;
6842 return true;
6843 }
6844 }
6845
6846 if (getExtensions().robustResourceInitialization &&
6847 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
6848 {
6849 *type = GL_BOOL;
6850 *numParams = 1;
6851 return true;
6852 }
6853
6854 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
6855 {
6856 *type = GL_BOOL;
6857 *numParams = 1;
6858 return true;
6859 }
6860
6861 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
6862 switch (pname)
6863 {
6864 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
6865 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
6866 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
6867 {
6868 return false;
6869 }
6870 *type = GL_INT;
6871 *numParams = 1;
6872 return true;
6873
6874 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
6875 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
6876 {
6877 return false;
6878 }
6879 *type = GL_INT;
6880 *numParams = 1;
6881 return true;
6882
6883 case GL_PROGRAM_BINARY_FORMATS_OES:
6884 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
6885 {
6886 return false;
6887 }
6888 *type = GL_INT;
6889 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
6890 return true;
6891
6892 case GL_PACK_ROW_LENGTH:
6893 case GL_PACK_SKIP_ROWS:
6894 case GL_PACK_SKIP_PIXELS:
6895 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
6896 {
6897 return false;
6898 }
6899 *type = GL_INT;
6900 *numParams = 1;
6901 return true;
6902 case GL_UNPACK_ROW_LENGTH:
6903 case GL_UNPACK_SKIP_ROWS:
6904 case GL_UNPACK_SKIP_PIXELS:
6905 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
6906 {
6907 return false;
6908 }
6909 *type = GL_INT;
6910 *numParams = 1;
6911 return true;
6912 case GL_VERTEX_ARRAY_BINDING:
6913 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
6914 {
6915 return false;
6916 }
6917 *type = GL_INT;
6918 *numParams = 1;
6919 return true;
6920 case GL_PIXEL_PACK_BUFFER_BINDING:
6921 case GL_PIXEL_UNPACK_BUFFER_BINDING:
6922 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
6923 {
6924 return false;
6925 }
6926 *type = GL_INT;
6927 *numParams = 1;
6928 return true;
6929 case GL_MAX_SAMPLES:
6930 {
6931 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
6932 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
6933 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
6934 {
6935 return false;
6936 }
6937 *type = GL_INT;
6938 *numParams = 1;
6939 return true;
6940
6941 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
6942 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
6943 {
6944 return false;
6945 }
6946 *type = GL_INT;
6947 *numParams = 1;
6948 return true;
6949 }
6950 }
6951
6952 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
6953 {
6954 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
6955 {
6956 return false;
6957 }
6958 *type = GL_INT;
6959 *numParams = 1;
6960 return true;
6961 }
6962
6963 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
6964 {
6965 *type = GL_INT;
6966 *numParams = 1;
6967 return true;
6968 }
6969
Lingfeng Yang13b708f2018-03-21 12:14:10 -07006970 if (getClientVersion() < Version(2, 0))
6971 {
6972 switch (pname)
6973 {
6974 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07006975 case GL_CLIENT_ACTIVE_TEXTURE:
6976 case GL_MATRIX_MODE:
6977 case GL_MAX_TEXTURE_UNITS:
6978 case GL_MAX_MODELVIEW_STACK_DEPTH:
6979 case GL_MAX_PROJECTION_STACK_DEPTH:
6980 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07006981 *type = GL_INT;
6982 *numParams = 1;
6983 return true;
6984 case GL_ALPHA_TEST_REF:
6985 *type = GL_FLOAT;
6986 *numParams = 1;
6987 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07006988 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07006989 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07006990 *type = GL_FLOAT;
6991 *numParams = 4;
6992 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07006993 case GL_CURRENT_NORMAL:
6994 *type = GL_FLOAT;
6995 *numParams = 3;
6996 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07006997 case GL_MODELVIEW_MATRIX:
6998 case GL_PROJECTION_MATRIX:
6999 case GL_TEXTURE_MATRIX:
7000 *type = GL_FLOAT;
7001 *numParams = 16;
7002 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007003 }
7004 }
7005
Jamie Madill5b772312018-03-08 20:28:32 -05007006 if (getClientVersion() < Version(3, 0))
7007 {
7008 return false;
7009 }
7010
7011 // Check for ES3.0+ parameter names
7012 switch (pname)
7013 {
7014 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7015 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7016 case GL_UNIFORM_BUFFER_BINDING:
7017 case GL_TRANSFORM_FEEDBACK_BINDING:
7018 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7019 case GL_COPY_READ_BUFFER_BINDING:
7020 case GL_COPY_WRITE_BUFFER_BINDING:
7021 case GL_SAMPLER_BINDING:
7022 case GL_READ_BUFFER:
7023 case GL_TEXTURE_BINDING_3D:
7024 case GL_TEXTURE_BINDING_2D_ARRAY:
7025 case GL_MAX_3D_TEXTURE_SIZE:
7026 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7027 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7028 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7029 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7030 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7031 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7032 case GL_MAX_VARYING_COMPONENTS:
7033 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7034 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7035 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7036 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7037 case GL_NUM_EXTENSIONS:
7038 case GL_MAJOR_VERSION:
7039 case GL_MINOR_VERSION:
7040 case GL_MAX_ELEMENTS_INDICES:
7041 case GL_MAX_ELEMENTS_VERTICES:
7042 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7043 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7044 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7045 case GL_UNPACK_IMAGE_HEIGHT:
7046 case GL_UNPACK_SKIP_IMAGES:
7047 {
7048 *type = GL_INT;
7049 *numParams = 1;
7050 return true;
7051 }
7052
7053 case GL_MAX_ELEMENT_INDEX:
7054 case GL_MAX_UNIFORM_BLOCK_SIZE:
7055 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7056 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7057 case GL_MAX_SERVER_WAIT_TIMEOUT:
7058 {
7059 *type = GL_INT_64_ANGLEX;
7060 *numParams = 1;
7061 return true;
7062 }
7063
7064 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7065 case GL_TRANSFORM_FEEDBACK_PAUSED:
7066 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7067 case GL_RASTERIZER_DISCARD:
7068 {
7069 *type = GL_BOOL;
7070 *numParams = 1;
7071 return true;
7072 }
7073
7074 case GL_MAX_TEXTURE_LOD_BIAS:
7075 {
7076 *type = GL_FLOAT;
7077 *numParams = 1;
7078 return true;
7079 }
7080 }
7081
7082 if (getExtensions().requestExtension)
7083 {
7084 switch (pname)
7085 {
7086 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7087 *type = GL_INT;
7088 *numParams = 1;
7089 return true;
7090 }
7091 }
7092
7093 if (getClientVersion() < Version(3, 1))
7094 {
7095 return false;
7096 }
7097
7098 switch (pname)
7099 {
7100 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7101 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7102 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7103 case GL_MAX_FRAMEBUFFER_WIDTH:
7104 case GL_MAX_FRAMEBUFFER_HEIGHT:
7105 case GL_MAX_FRAMEBUFFER_SAMPLES:
7106 case GL_MAX_SAMPLE_MASK_WORDS:
7107 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7108 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7109 case GL_MAX_INTEGER_SAMPLES:
7110 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7111 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7112 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7113 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7114 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7115 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7116 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7117 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7118 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7119 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7120 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7121 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7122 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7123 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7124 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7125 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7126 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7127 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7128 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7129 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7130 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7131 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7132 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7133 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7134 case GL_MAX_UNIFORM_LOCATIONS:
7135 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7136 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7137 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7138 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7139 case GL_MAX_IMAGE_UNITS:
7140 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7141 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7142 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7143 case GL_SHADER_STORAGE_BUFFER_BINDING:
7144 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7145 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
7146 *type = GL_INT;
7147 *numParams = 1;
7148 return true;
7149 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7150 *type = GL_INT_64_ANGLEX;
7151 *numParams = 1;
7152 return true;
7153 case GL_SAMPLE_MASK:
7154 *type = GL_BOOL;
7155 *numParams = 1;
7156 return true;
7157 }
7158
7159 if (getExtensions().geometryShader)
7160 {
7161 switch (pname)
7162 {
7163 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7164 case GL_LAYER_PROVOKING_VERTEX_EXT:
7165 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7166 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7167 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7168 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7169 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7170 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7171 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7172 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7173 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7174 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7175 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7176 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7177 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7178 *type = GL_INT;
7179 *numParams = 1;
7180 return true;
7181 }
7182 }
7183
7184 return false;
7185}
7186
7187bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7188{
7189 if (getClientVersion() < Version(3, 0))
7190 {
7191 return false;
7192 }
7193
7194 switch (target)
7195 {
7196 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7197 case GL_UNIFORM_BUFFER_BINDING:
7198 {
7199 *type = GL_INT;
7200 *numParams = 1;
7201 return true;
7202 }
7203 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7204 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7205 case GL_UNIFORM_BUFFER_START:
7206 case GL_UNIFORM_BUFFER_SIZE:
7207 {
7208 *type = GL_INT_64_ANGLEX;
7209 *numParams = 1;
7210 return true;
7211 }
7212 }
7213
7214 if (getClientVersion() < Version(3, 1))
7215 {
7216 return false;
7217 }
7218
7219 switch (target)
7220 {
7221 case GL_IMAGE_BINDING_LAYERED:
7222 {
7223 *type = GL_BOOL;
7224 *numParams = 1;
7225 return true;
7226 }
7227 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7228 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7229 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7230 case GL_SHADER_STORAGE_BUFFER_BINDING:
7231 case GL_VERTEX_BINDING_BUFFER:
7232 case GL_VERTEX_BINDING_DIVISOR:
7233 case GL_VERTEX_BINDING_OFFSET:
7234 case GL_VERTEX_BINDING_STRIDE:
7235 case GL_SAMPLE_MASK_VALUE:
7236 case GL_IMAGE_BINDING_NAME:
7237 case GL_IMAGE_BINDING_LEVEL:
7238 case GL_IMAGE_BINDING_LAYER:
7239 case GL_IMAGE_BINDING_ACCESS:
7240 case GL_IMAGE_BINDING_FORMAT:
7241 {
7242 *type = GL_INT;
7243 *numParams = 1;
7244 return true;
7245 }
7246 case GL_ATOMIC_COUNTER_BUFFER_START:
7247 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7248 case GL_SHADER_STORAGE_BUFFER_START:
7249 case GL_SHADER_STORAGE_BUFFER_SIZE:
7250 {
7251 *type = GL_INT_64_ANGLEX;
7252 *numParams = 1;
7253 return true;
7254 }
7255 }
7256
7257 return false;
7258}
7259
7260Program *Context::getProgram(GLuint handle) const
7261{
7262 return mState.mShaderPrograms->getProgram(handle);
7263}
7264
7265Shader *Context::getShader(GLuint handle) const
7266{
7267 return mState.mShaderPrograms->getShader(handle);
7268}
7269
7270bool Context::isTextureGenerated(GLuint texture) const
7271{
7272 return mState.mTextures->isHandleGenerated(texture);
7273}
7274
7275bool Context::isBufferGenerated(GLuint buffer) const
7276{
7277 return mState.mBuffers->isHandleGenerated(buffer);
7278}
7279
7280bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7281{
7282 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7283}
7284
7285bool Context::isFramebufferGenerated(GLuint framebuffer) const
7286{
7287 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7288}
7289
7290bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7291{
7292 return mState.mPipelines->isHandleGenerated(pipeline);
7293}
7294
7295bool Context::usingDisplayTextureShareGroup() const
7296{
7297 return mDisplayTextureShareGroup;
7298}
7299
7300GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7301{
7302 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7303 internalformat == GL_DEPTH_STENCIL
7304 ? GL_DEPTH24_STENCIL8
7305 : internalformat;
7306}
7307
Jamie Madillc29968b2016-01-20 11:17:23 -05007308} // namespace gl