blob: 132271c326f2664493396dfbe7cabba7578609bb [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 Langb0f917f2017-12-05 13:41:54 -0500353 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400354 {
355 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500356 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800357 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400358 }
359
Geoff Langb0f917f2017-12-05 13:41:54 -0500360 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400361 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500362 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800363 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400364 }
365
Jamie Madill4928b7c2017-06-20 12:57:39 -0400366 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500367
Jamie Madill57a89722013-07-02 11:57:03 -0400368 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000369
Geoff Langeb66a6e2016-10-31 13:06:12 -0400370 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400371 {
372 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
373 // In the initial state, a default transform feedback object is bound and treated as
374 // a transform feedback object with a name of zero. That object is bound any time
375 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400376 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400377 }
Geoff Langc8058452014-02-03 12:04:11 -0500378
Corentin Wallez336129f2017-10-17 15:55:40 -0400379 for (auto type : angle::AllEnums<BufferBinding>())
380 {
381 bindBuffer(type, 0);
382 }
383
384 bindRenderbuffer(GL_RENDERBUFFER, 0);
385
386 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
387 {
388 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
389 }
390
Jamie Madillad9f24e2016-02-12 09:27:24 -0500391 // Initialize dirty bit masks
Jamie Madillc67323a2017-11-02 23:11:41 -0400392 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500393 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500394 // No dirty objects.
395
396 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400397 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500398 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500399 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
400
401 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
402 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
403 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
404 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
405 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
406 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
407 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
408 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
409 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
410 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
411 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
412 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
413
414 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
415 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700416 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500417 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
418 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400419
Xinghua Cao10a4d432017-11-28 14:46:26 +0800420 // TODO(xinghua.cao@intel.com): add other dirty bits and dirty objects.
421 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
422 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
423 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
424 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
425 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800426 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800427 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800428
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400429 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000430}
431
Jamie Madill4928b7c2017-06-20 12:57:39 -0400432egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000433{
Jamie Madille7b3fe22018-04-05 09:42:46 -0400434 // Delete the Surface first to trigger a finish() in Vulkan.
435 SafeDelete(mSurfacelessFramebuffer);
436
437 ANGLE_TRY(releaseSurface(display));
438
Corentin Wallez80b24112015-08-25 16:41:57 -0400439 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000440 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400441 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000442 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400443 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000444
Corentin Wallez80b24112015-08-25 16:41:57 -0400445 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000446 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400447 if (query.second != nullptr)
448 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400449 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400450 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000451 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400452 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000453
Corentin Wallez80b24112015-08-25 16:41:57 -0400454 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400455 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400456 if (vertexArray.second)
457 {
458 vertexArray.second->onDestroy(this);
459 }
Jamie Madill57a89722013-07-02 11:57:03 -0400460 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400461 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400462
Corentin Wallez80b24112015-08-25 16:41:57 -0400463 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500464 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500465 if (transformFeedback.second != nullptr)
466 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500467 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500468 }
Geoff Langc8058452014-02-03 12:04:11 -0500469 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400470 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500471
Jamie Madill5b772312018-03-08 20:28:32 -0500472 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400473 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800474 if (zeroTexture.get() != nullptr)
475 {
476 ANGLE_TRY(zeroTexture->onDestroy(this));
477 zeroTexture.set(this, nullptr);
478 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400479 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000480
Jamie Madill2f348d22017-06-05 10:50:59 -0400481 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500482
Jamie Madill4928b7c2017-06-20 12:57:39 -0400483 mGLState.reset(this);
484
Jamie Madill6c1f6712017-02-14 19:08:04 -0500485 mState.mBuffers->release(this);
486 mState.mShaderPrograms->release(this);
487 mState.mTextures->release(this);
488 mState.mRenderbuffers->release(this);
489 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400490 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500491 mState.mPaths->release(this);
492 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800493 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400494
Jamie Madill76e471e2017-10-21 09:56:01 -0400495 mImplementation->onDestroy(this);
496
Jamie Madill4928b7c2017-06-20 12:57:39 -0400497 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000498}
499
Jamie Madill70ee0f62017-02-06 16:04:20 -0500500Context::~Context()
501{
502}
503
Jamie Madill4928b7c2017-06-20 12:57:39 -0400504egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000505{
Jamie Madill61e16b42017-06-19 11:13:23 -0400506 mCurrentDisplay = display;
507
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000508 if (!mHasBeenCurrent)
509 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000510 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500511 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400512 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000513
Corentin Wallezc295e512017-01-27 17:47:50 -0500514 int width = 0;
515 int height = 0;
516 if (surface != nullptr)
517 {
518 width = surface->getWidth();
519 height = surface->getHeight();
520 }
521
522 mGLState.setViewportParams(0, 0, width, height);
523 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000524
525 mHasBeenCurrent = true;
526 }
527
Jamie Madill1b94d432015-08-07 13:23:23 -0400528 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700529 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400530 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400531
Jamie Madill4928b7c2017-06-20 12:57:39 -0400532 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500533
534 Framebuffer *newDefault = nullptr;
535 if (surface != nullptr)
536 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400537 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500538 mCurrentSurface = surface;
539 newDefault = surface->getDefaultFramebuffer();
540 }
541 else
542 {
543 if (mSurfacelessFramebuffer == nullptr)
544 {
545 mSurfacelessFramebuffer = new Framebuffer(mImplementation.get());
546 }
547
548 newDefault = mSurfacelessFramebuffer;
549 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000550
Corentin Wallez37c39792015-08-20 14:19:46 -0400551 // Update default framebuffer, the binding of the previous default
552 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400553 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700554 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400555 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700556 mGLState.setReadFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400557 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700558 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400559 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700560 mGLState.setDrawFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400561 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500562 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400563 }
Ian Ewell292f0052016-02-04 10:37:32 -0500564
565 // Notify the renderer of a context switch
Jamie Madill4928b7c2017-06-20 12:57:39 -0400566 mImplementation->onMakeCurrent(this);
567 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000568}
569
Jamie Madill4928b7c2017-06-20 12:57:39 -0400570egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400571{
Corentin Wallez37c39792015-08-20 14:19:46 -0400572 // Remove the default framebuffer
Corentin Wallezc295e512017-01-27 17:47:50 -0500573 Framebuffer *currentDefault = nullptr;
574 if (mCurrentSurface != nullptr)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400575 {
Corentin Wallezc295e512017-01-27 17:47:50 -0500576 currentDefault = mCurrentSurface->getDefaultFramebuffer();
577 }
578 else if (mSurfacelessFramebuffer != nullptr)
579 {
580 currentDefault = mSurfacelessFramebuffer;
Corentin Wallez51706ea2015-08-07 14:39:22 -0400581 }
582
Corentin Wallezc295e512017-01-27 17:47:50 -0500583 if (mGLState.getReadFramebuffer() == currentDefault)
584 {
585 mGLState.setReadFramebufferBinding(nullptr);
586 }
587 if (mGLState.getDrawFramebuffer() == currentDefault)
588 {
589 mGLState.setDrawFramebufferBinding(nullptr);
590 }
591 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
592
593 if (mCurrentSurface)
594 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400595 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500596 mCurrentSurface = nullptr;
597 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400598
599 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400600}
601
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000602GLuint Context::createBuffer()
603{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500604 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000605}
606
607GLuint Context::createProgram()
608{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500609 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000610}
611
Jiawei Shao385b3e02018-03-21 09:43:28 +0800612GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000613{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500614 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000615}
616
617GLuint Context::createTexture()
618{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500619 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000620}
621
622GLuint Context::createRenderbuffer()
623{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500624 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000625}
626
Brandon Jones59770802018-04-02 13:18:42 -0700627GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300628{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500629 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300630 if (resultOrError.isError())
631 {
632 handleError(resultOrError.getError());
633 return 0;
634 }
635 return resultOrError.getResult();
636}
637
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000638// Returns an unused framebuffer name
639GLuint Context::createFramebuffer()
640{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500641 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000642}
643
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500644void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000645{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500646 for (int i = 0; i < n; i++)
647 {
648 GLuint handle = mFenceNVHandleAllocator.allocate();
649 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
650 fences[i] = handle;
651 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000652}
653
Yunchao Hea336b902017-08-02 16:05:21 +0800654GLuint Context::createProgramPipeline()
655{
656 return mState.mPipelines->createProgramPipeline();
657}
658
Jiawei Shao385b3e02018-03-21 09:43:28 +0800659GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800660{
661 UNIMPLEMENTED();
662 return 0u;
663}
664
James Darpinian4d9d4832018-03-13 12:43:28 -0700665void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000666{
James Darpinian4d9d4832018-03-13 12:43:28 -0700667 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
668 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000669 {
670 detachBuffer(buffer);
671 }
Jamie Madill893ab082014-05-16 16:56:10 -0400672
James Darpinian4d9d4832018-03-13 12:43:28 -0700673 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000674}
675
676void Context::deleteShader(GLuint shader)
677{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500678 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000679}
680
681void Context::deleteProgram(GLuint program)
682{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500683 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000684}
685
686void Context::deleteTexture(GLuint texture)
687{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500688 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000689 {
690 detachTexture(texture);
691 }
692
Jamie Madill6c1f6712017-02-14 19:08:04 -0500693 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000694}
695
696void Context::deleteRenderbuffer(GLuint renderbuffer)
697{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500698 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000699 {
700 detachRenderbuffer(renderbuffer);
701 }
Jamie Madill893ab082014-05-16 16:56:10 -0400702
Jamie Madill6c1f6712017-02-14 19:08:04 -0500703 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000704}
705
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400706void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400707{
708 // The spec specifies the underlying Fence object is not deleted until all current
709 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
710 // and since our API is currently designed for being called from a single thread, we can delete
711 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400712 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400713}
714
Yunchao Hea336b902017-08-02 16:05:21 +0800715void Context::deleteProgramPipeline(GLuint pipeline)
716{
717 if (mState.mPipelines->getProgramPipeline(pipeline))
718 {
719 detachProgramPipeline(pipeline);
720 }
721
722 mState.mPipelines->deleteObject(this, pipeline);
723}
724
Sami Väisänene45e53b2016-05-25 10:36:04 +0300725void Context::deletePaths(GLuint first, GLsizei range)
726{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500727 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300728}
729
Brandon Jones59770802018-04-02 13:18:42 -0700730bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300731{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500732 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300733 if (pathObj == nullptr)
734 return false;
735
736 return pathObj->hasPathData();
737}
738
Brandon Jones59770802018-04-02 13:18:42 -0700739bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300740{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500741 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300742}
743
Brandon Jones59770802018-04-02 13:18:42 -0700744void Context::pathCommands(GLuint path,
745 GLsizei numCommands,
746 const GLubyte *commands,
747 GLsizei numCoords,
748 GLenum coordType,
749 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300750{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500751 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300752
753 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
754}
755
Jamie Madill007530e2017-12-28 14:27:04 -0500756void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300757{
Jamie Madill007530e2017-12-28 14:27:04 -0500758 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300759
760 switch (pname)
761 {
762 case GL_PATH_STROKE_WIDTH_CHROMIUM:
763 pathObj->setStrokeWidth(value);
764 break;
765 case GL_PATH_END_CAPS_CHROMIUM:
766 pathObj->setEndCaps(static_cast<GLenum>(value));
767 break;
768 case GL_PATH_JOIN_STYLE_CHROMIUM:
769 pathObj->setJoinStyle(static_cast<GLenum>(value));
770 break;
771 case GL_PATH_MITER_LIMIT_CHROMIUM:
772 pathObj->setMiterLimit(value);
773 break;
774 case GL_PATH_STROKE_BOUND_CHROMIUM:
775 pathObj->setStrokeBound(value);
776 break;
777 default:
778 UNREACHABLE();
779 break;
780 }
781}
782
Jamie Madill007530e2017-12-28 14:27:04 -0500783void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300784{
Jamie Madill007530e2017-12-28 14:27:04 -0500785 // TODO(jmadill): Should use proper clamping/casting.
786 pathParameterf(path, pname, static_cast<GLfloat>(value));
787}
788
789void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
790{
791 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300792
793 switch (pname)
794 {
795 case GL_PATH_STROKE_WIDTH_CHROMIUM:
796 *value = pathObj->getStrokeWidth();
797 break;
798 case GL_PATH_END_CAPS_CHROMIUM:
799 *value = static_cast<GLfloat>(pathObj->getEndCaps());
800 break;
801 case GL_PATH_JOIN_STYLE_CHROMIUM:
802 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
803 break;
804 case GL_PATH_MITER_LIMIT_CHROMIUM:
805 *value = pathObj->getMiterLimit();
806 break;
807 case GL_PATH_STROKE_BOUND_CHROMIUM:
808 *value = pathObj->getStrokeBound();
809 break;
810 default:
811 UNREACHABLE();
812 break;
813 }
814}
815
Jamie Madill007530e2017-12-28 14:27:04 -0500816void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
817{
818 GLfloat val = 0.0f;
819 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
820 if (value)
821 *value = static_cast<GLint>(val);
822}
823
Brandon Jones59770802018-04-02 13:18:42 -0700824void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300825{
826 mGLState.setPathStencilFunc(func, ref, mask);
827}
828
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000829void Context::deleteFramebuffer(GLuint framebuffer)
830{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500831 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000832 {
833 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000834 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500835
Jamie Madill6c1f6712017-02-14 19:08:04 -0500836 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000837}
838
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500839void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000840{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500841 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000842 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500843 GLuint fence = fences[i];
844
845 FenceNV *fenceObject = nullptr;
846 if (mFenceNVMap.erase(fence, &fenceObject))
847 {
848 mFenceNVHandleAllocator.release(fence);
849 delete fenceObject;
850 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000851 }
852}
853
Geoff Lang70d0f492015-12-10 17:45:46 -0500854Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000855{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500856 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000857}
858
Jamie Madill570f7c82014-07-03 10:38:54 -0400859Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000860{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500861 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000862}
863
Geoff Lang70d0f492015-12-10 17:45:46 -0500864Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000865{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500866 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000867}
868
Jamie Madill70b5bb02017-08-28 13:32:37 -0400869Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400870{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400871 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400872}
873
Jamie Madill57a89722013-07-02 11:57:03 -0400874VertexArray *Context::getVertexArray(GLuint handle) const
875{
Jamie Madill96a483b2017-06-27 16:49:21 -0400876 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400877}
878
Jamie Madilldc356042013-07-19 16:36:57 -0400879Sampler *Context::getSampler(GLuint handle) const
880{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500881 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400882}
883
Geoff Langc8058452014-02-03 12:04:11 -0500884TransformFeedback *Context::getTransformFeedback(GLuint handle) const
885{
Jamie Madill96a483b2017-06-27 16:49:21 -0400886 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500887}
888
Yunchao Hea336b902017-08-02 16:05:21 +0800889ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
890{
891 return mState.mPipelines->getProgramPipeline(handle);
892}
893
Geoff Lang70d0f492015-12-10 17:45:46 -0500894LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
895{
896 switch (identifier)
897 {
898 case GL_BUFFER:
899 return getBuffer(name);
900 case GL_SHADER:
901 return getShader(name);
902 case GL_PROGRAM:
903 return getProgram(name);
904 case GL_VERTEX_ARRAY:
905 return getVertexArray(name);
906 case GL_QUERY:
907 return getQuery(name);
908 case GL_TRANSFORM_FEEDBACK:
909 return getTransformFeedback(name);
910 case GL_SAMPLER:
911 return getSampler(name);
912 case GL_TEXTURE:
913 return getTexture(name);
914 case GL_RENDERBUFFER:
915 return getRenderbuffer(name);
916 case GL_FRAMEBUFFER:
917 return getFramebuffer(name);
918 default:
919 UNREACHABLE();
920 return nullptr;
921 }
922}
923
924LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
925{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400926 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -0500927}
928
Martin Radev9d901792016-07-15 15:58:58 +0300929void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
930{
931 LabeledObject *object = getLabeledObject(identifier, name);
932 ASSERT(object != nullptr);
933
934 std::string labelName = GetObjectLabelFromPointer(length, label);
935 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -0400936
937 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
938 // specified object is active until we do this.
939 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +0300940}
941
942void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
943{
944 LabeledObject *object = getLabeledObjectFromPtr(ptr);
945 ASSERT(object != nullptr);
946
947 std::string labelName = GetObjectLabelFromPointer(length, label);
948 object->setLabel(labelName);
949}
950
951void Context::getObjectLabel(GLenum identifier,
952 GLuint name,
953 GLsizei bufSize,
954 GLsizei *length,
955 GLchar *label) const
956{
957 LabeledObject *object = getLabeledObject(identifier, name);
958 ASSERT(object != nullptr);
959
960 const std::string &objectLabel = object->getLabel();
961 GetObjectLabelBase(objectLabel, bufSize, length, label);
962}
963
964void Context::getObjectPtrLabel(const void *ptr,
965 GLsizei bufSize,
966 GLsizei *length,
967 GLchar *label) const
968{
969 LabeledObject *object = getLabeledObjectFromPtr(ptr);
970 ASSERT(object != nullptr);
971
972 const std::string &objectLabel = object->getLabel();
973 GetObjectLabelBase(objectLabel, bufSize, length, label);
974}
975
Jamie Madilldc356042013-07-19 16:36:57 -0400976bool Context::isSampler(GLuint samplerName) const
977{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500978 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -0400979}
980
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800981void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000982{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500983 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000984
Jamie Madilldedd7b92014-11-05 16:30:36 -0500985 if (handle == 0)
986 {
987 texture = mZeroTextures[target].get();
988 }
989 else
990 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500991 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500992 }
993
994 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400995 mGLState.setSamplerTexture(this, target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000996}
997
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500998void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000999{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001000 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1001 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001002 mGLState.setReadFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001003}
1004
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001005void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001006{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001007 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1008 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001009 mGLState.setDrawFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001010}
1011
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001012void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001013{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001014 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001015 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -04001016}
1017
Shao80957d92017-02-20 21:25:59 +08001018void Context::bindVertexBuffer(GLuint bindingIndex,
1019 GLuint bufferHandle,
1020 GLintptr offset,
1021 GLsizei stride)
1022{
1023 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001024 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +08001025}
1026
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001027void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001028{
Geoff Lang76b10c92014-09-05 16:28:14 -04001029 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001030 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001031 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001032 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001033}
1034
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001035void Context::bindImageTexture(GLuint unit,
1036 GLuint texture,
1037 GLint level,
1038 GLboolean layered,
1039 GLint layer,
1040 GLenum access,
1041 GLenum format)
1042{
1043 Texture *tex = mState.mTextures->getTexture(texture);
1044 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1045}
1046
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001047void Context::useProgram(GLuint program)
1048{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001049 mGLState.setProgram(this, getProgram(program));
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001050}
1051
Jiajia Qin5451d532017-11-16 17:16:34 +08001052void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1053{
1054 UNIMPLEMENTED();
1055}
1056
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001057void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001058{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001059 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001060 TransformFeedback *transformFeedback =
1061 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001062 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001063}
1064
Yunchao Hea336b902017-08-02 16:05:21 +08001065void Context::bindProgramPipeline(GLuint pipelineHandle)
1066{
1067 ProgramPipeline *pipeline =
1068 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1069 mGLState.setProgramPipelineBinding(this, pipeline);
1070}
1071
Corentin Wallezad3ae902018-03-09 13:40:42 -05001072void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001073{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001074 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001075 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001076
Geoff Lang5aad9672014-09-08 11:10:42 -04001077 // begin query
Jamie Madillf0e04492017-08-26 15:28:42 -04001078 ANGLE_CONTEXT_TRY(queryObject->begin());
Geoff Lang5aad9672014-09-08 11:10:42 -04001079
1080 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001081 mGLState.setActiveQuery(this, target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001082}
1083
Corentin Wallezad3ae902018-03-09 13:40:42 -05001084void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001085{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001086 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001087 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001088
Jamie Madillf0e04492017-08-26 15:28:42 -04001089 handleError(queryObject->end());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001090
Geoff Lang5aad9672014-09-08 11:10:42 -04001091 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001092 mGLState.setActiveQuery(this, target, nullptr);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001093}
1094
Corentin Wallezad3ae902018-03-09 13:40:42 -05001095void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001096{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001097 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001098
1099 Query *queryObject = getQuery(id, true, target);
1100 ASSERT(queryObject);
1101
Jamie Madillf0e04492017-08-26 15:28:42 -04001102 handleError(queryObject->queryCounter());
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001103}
1104
Corentin Wallezad3ae902018-03-09 13:40:42 -05001105void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001106{
1107 switch (pname)
1108 {
1109 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001110 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001111 break;
1112 case GL_QUERY_COUNTER_BITS_EXT:
1113 switch (target)
1114 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001115 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001116 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1117 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001118 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001119 params[0] = getExtensions().queryCounterBitsTimestamp;
1120 break;
1121 default:
1122 UNREACHABLE();
1123 params[0] = 0;
1124 break;
1125 }
1126 break;
1127 default:
1128 UNREACHABLE();
1129 return;
1130 }
1131}
1132
Corentin Wallezad3ae902018-03-09 13:40:42 -05001133void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001134 GLenum pname,
1135 GLsizei bufSize,
1136 GLsizei *length,
1137 GLint *params)
1138{
1139 getQueryiv(target, pname, params);
1140}
1141
Geoff Lang2186c382016-10-14 10:54:54 -04001142void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001143{
Geoff Lang2186c382016-10-14 10:54:54 -04001144 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001145}
1146
Brandon Jones59770802018-04-02 13:18:42 -07001147void Context::getQueryObjectivRobust(GLuint id,
1148 GLenum pname,
1149 GLsizei bufSize,
1150 GLsizei *length,
1151 GLint *params)
1152{
1153 getQueryObjectiv(id, pname, params);
1154}
1155
Geoff Lang2186c382016-10-14 10:54:54 -04001156void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001157{
Geoff Lang2186c382016-10-14 10:54:54 -04001158 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001159}
1160
Brandon Jones59770802018-04-02 13:18:42 -07001161void Context::getQueryObjectuivRobust(GLuint id,
1162 GLenum pname,
1163 GLsizei bufSize,
1164 GLsizei *length,
1165 GLuint *params)
1166{
1167 getQueryObjectuiv(id, pname, params);
1168}
1169
Geoff Lang2186c382016-10-14 10:54:54 -04001170void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001171{
Geoff Lang2186c382016-10-14 10:54:54 -04001172 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001173}
1174
Brandon Jones59770802018-04-02 13:18:42 -07001175void Context::getQueryObjecti64vRobust(GLuint id,
1176 GLenum pname,
1177 GLsizei bufSize,
1178 GLsizei *length,
1179 GLint64 *params)
1180{
1181 getQueryObjecti64v(id, pname, params);
1182}
1183
Geoff Lang2186c382016-10-14 10:54:54 -04001184void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001185{
Geoff Lang2186c382016-10-14 10:54:54 -04001186 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001187}
1188
Brandon Jones59770802018-04-02 13:18:42 -07001189void Context::getQueryObjectui64vRobust(GLuint id,
1190 GLenum pname,
1191 GLsizei bufSize,
1192 GLsizei *length,
1193 GLuint64 *params)
1194{
1195 getQueryObjectui64v(id, pname, params);
1196}
1197
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001198Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001199{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001200 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001201}
1202
Jamie Madill2f348d22017-06-05 10:50:59 -04001203FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001204{
Jamie Madill96a483b2017-06-27 16:49:21 -04001205 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001206}
1207
Corentin Wallezad3ae902018-03-09 13:40:42 -05001208Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001209{
Jamie Madill96a483b2017-06-27 16:49:21 -04001210 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001211 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001212 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001213 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001214
1215 Query *query = mQueryMap.query(handle);
1216 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001217 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001218 ASSERT(type != QueryType::InvalidEnum);
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;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001668 // GLES1 emulation: Vertex attribute queries
1669 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1670 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1671 case GL_COLOR_ARRAY_BUFFER_BINDING:
1672 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1673 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1674 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1675 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1676 break;
1677 case GL_VERTEX_ARRAY_STRIDE:
1678 case GL_NORMAL_ARRAY_STRIDE:
1679 case GL_COLOR_ARRAY_STRIDE:
1680 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1681 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1682 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1683 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1684 break;
1685 case GL_VERTEX_ARRAY_SIZE:
1686 case GL_COLOR_ARRAY_SIZE:
1687 case GL_TEXTURE_COORD_ARRAY_SIZE:
1688 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1689 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1690 break;
1691 case GL_VERTEX_ARRAY_TYPE:
1692 case GL_COLOR_ARRAY_TYPE:
1693 case GL_NORMAL_ARRAY_TYPE:
1694 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1695 case GL_TEXTURE_COORD_ARRAY_TYPE:
1696 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1697 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1698 break;
1699
Jamie Madill231c7f52017-04-26 13:45:37 -04001700 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001701 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001702 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001703 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001704}
1705
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001706void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001707{
Shannon Woods53a94a82014-06-24 15:20:36 -04001708 // Queries about context capabilities and maximums are answered by Context.
1709 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001710 switch (pname)
1711 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001712 case GL_MAX_ELEMENT_INDEX:
1713 *params = mCaps.maxElementIndex;
1714 break;
1715 case GL_MAX_UNIFORM_BLOCK_SIZE:
1716 *params = mCaps.maxUniformBlockSize;
1717 break;
1718 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
1719 *params = mCaps.maxCombinedVertexUniformComponents;
1720 break;
1721 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
1722 *params = mCaps.maxCombinedFragmentUniformComponents;
1723 break;
1724 case GL_MAX_SERVER_WAIT_TIMEOUT:
1725 *params = mCaps.maxServerWaitTimeout;
1726 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001727
Jamie Madill231c7f52017-04-26 13:45:37 -04001728 // GL_EXT_disjoint_timer_query
1729 case GL_TIMESTAMP_EXT:
1730 *params = mImplementation->getTimestamp();
1731 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001732
Jamie Madill231c7f52017-04-26 13:45:37 -04001733 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1734 *params = mCaps.maxShaderStorageBlockSize;
1735 break;
1736 default:
1737 UNREACHABLE();
1738 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001739 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001740}
1741
Geoff Lang70d0f492015-12-10 17:45:46 -05001742void Context::getPointerv(GLenum pname, void **params) const
1743{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001744 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001745}
1746
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001747void Context::getPointervRobustANGLERobust(GLenum pname,
1748 GLsizei bufSize,
1749 GLsizei *length,
1750 void **params)
1751{
1752 UNIMPLEMENTED();
1753}
1754
Martin Radev66fb8202016-07-28 11:45:20 +03001755void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001756{
Shannon Woods53a94a82014-06-24 15:20:36 -04001757 // Queries about context capabilities and maximums are answered by Context.
1758 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001759
1760 GLenum nativeType;
1761 unsigned int numParams;
1762 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1763 ASSERT(queryStatus);
1764
1765 if (nativeType == GL_INT)
1766 {
1767 switch (target)
1768 {
1769 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1770 ASSERT(index < 3u);
1771 *data = mCaps.maxComputeWorkGroupCount[index];
1772 break;
1773 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1774 ASSERT(index < 3u);
1775 *data = mCaps.maxComputeWorkGroupSize[index];
1776 break;
1777 default:
1778 mGLState.getIntegeri_v(target, index, data);
1779 }
1780 }
1781 else
1782 {
1783 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1784 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001785}
1786
Brandon Jones59770802018-04-02 13:18:42 -07001787void Context::getIntegeri_vRobust(GLenum target,
1788 GLuint index,
1789 GLsizei bufSize,
1790 GLsizei *length,
1791 GLint *data)
1792{
1793 getIntegeri_v(target, index, data);
1794}
1795
Martin Radev66fb8202016-07-28 11:45:20 +03001796void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001797{
Shannon Woods53a94a82014-06-24 15:20:36 -04001798 // Queries about context capabilities and maximums are answered by Context.
1799 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001800
1801 GLenum nativeType;
1802 unsigned int numParams;
1803 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1804 ASSERT(queryStatus);
1805
1806 if (nativeType == GL_INT_64_ANGLEX)
1807 {
1808 mGLState.getInteger64i_v(target, index, data);
1809 }
1810 else
1811 {
1812 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1813 }
1814}
1815
Brandon Jones59770802018-04-02 13:18:42 -07001816void Context::getInteger64i_vRobust(GLenum target,
1817 GLuint index,
1818 GLsizei bufSize,
1819 GLsizei *length,
1820 GLint64 *data)
1821{
1822 getInteger64i_v(target, index, data);
1823}
1824
Martin Radev66fb8202016-07-28 11:45:20 +03001825void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1826{
1827 // Queries about context capabilities and maximums are answered by Context.
1828 // Queries about current GL state values are answered by State.
1829
1830 GLenum nativeType;
1831 unsigned int numParams;
1832 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1833 ASSERT(queryStatus);
1834
1835 if (nativeType == GL_BOOL)
1836 {
1837 mGLState.getBooleani_v(target, index, data);
1838 }
1839 else
1840 {
1841 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1842 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001843}
1844
Brandon Jones59770802018-04-02 13:18:42 -07001845void Context::getBooleani_vRobust(GLenum target,
1846 GLuint index,
1847 GLsizei bufSize,
1848 GLsizei *length,
1849 GLboolean *data)
1850{
1851 getBooleani_v(target, index, data);
1852}
1853
Corentin Wallez336129f2017-10-17 15:55:40 -04001854void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001855{
1856 Buffer *buffer = mGLState.getTargetBuffer(target);
1857 QueryBufferParameteriv(buffer, pname, params);
1858}
1859
Brandon Jones59770802018-04-02 13:18:42 -07001860void Context::getBufferParameterivRobust(BufferBinding target,
1861 GLenum pname,
1862 GLsizei bufSize,
1863 GLsizei *length,
1864 GLint *params)
1865{
1866 getBufferParameteriv(target, pname, params);
1867}
1868
He Yunchao010e4db2017-03-03 14:22:06 +08001869void Context::getFramebufferAttachmentParameteriv(GLenum target,
1870 GLenum attachment,
1871 GLenum pname,
1872 GLint *params)
1873{
1874 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08001875 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08001876}
1877
Brandon Jones59770802018-04-02 13:18:42 -07001878void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
1879 GLenum attachment,
1880 GLenum pname,
1881 GLsizei bufSize,
1882 GLsizei *length,
1883 GLint *params)
1884{
1885 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
1886}
1887
He Yunchao010e4db2017-03-03 14:22:06 +08001888void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
1889{
1890 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
1891 QueryRenderbufferiv(this, renderbuffer, pname, params);
1892}
1893
Brandon Jones59770802018-04-02 13:18:42 -07001894void Context::getRenderbufferParameterivRobust(GLenum target,
1895 GLenum pname,
1896 GLsizei bufSize,
1897 GLsizei *length,
1898 GLint *params)
1899{
1900 getRenderbufferParameteriv(target, pname, params);
1901}
1902
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001903void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001904{
1905 Texture *texture = getTargetTexture(target);
1906 QueryTexParameterfv(texture, pname, params);
1907}
1908
Brandon Jones59770802018-04-02 13:18:42 -07001909void Context::getTexParameterfvRobust(TextureType target,
1910 GLenum pname,
1911 GLsizei bufSize,
1912 GLsizei *length,
1913 GLfloat *params)
1914{
1915 getTexParameterfv(target, pname, params);
1916}
1917
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001918void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001919{
1920 Texture *texture = getTargetTexture(target);
1921 QueryTexParameteriv(texture, pname, params);
1922}
Jiajia Qin5451d532017-11-16 17:16:34 +08001923
Brandon Jones59770802018-04-02 13:18:42 -07001924void Context::getTexParameterivRobust(TextureType target,
1925 GLenum pname,
1926 GLsizei bufSize,
1927 GLsizei *length,
1928 GLint *params)
1929{
1930 getTexParameteriv(target, pname, params);
1931}
1932
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001933void Context::getTexParameterIivRobust(TextureType target,
1934 GLenum pname,
1935 GLsizei bufSize,
1936 GLsizei *length,
1937 GLint *params)
1938{
1939 UNIMPLEMENTED();
1940}
1941
1942void Context::getTexParameterIuivRobust(TextureType target,
1943 GLenum pname,
1944 GLsizei bufSize,
1945 GLsizei *length,
1946 GLuint *params)
1947{
1948 UNIMPLEMENTED();
1949}
1950
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001951void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08001952{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001953 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05001954 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08001955}
1956
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001957void Context::getTexLevelParameterivRobust(TextureTarget target,
1958 GLint level,
1959 GLenum pname,
1960 GLsizei bufSize,
1961 GLsizei *length,
1962 GLint *params)
1963{
1964 UNIMPLEMENTED();
1965}
1966
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001967void Context::getTexLevelParameterfv(TextureTarget target,
1968 GLint level,
1969 GLenum pname,
1970 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08001971{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001972 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05001973 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08001974}
1975
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001976void Context::getTexLevelParameterfvRobust(TextureTarget target,
1977 GLint level,
1978 GLenum pname,
1979 GLsizei bufSize,
1980 GLsizei *length,
1981 GLfloat *params)
1982{
1983 UNIMPLEMENTED();
1984}
1985
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001986void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08001987{
1988 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001989 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001990 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001991}
1992
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001993void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001994{
1995 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001996 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001997 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001998}
1999
Brandon Jones59770802018-04-02 13:18:42 -07002000void Context::texParameterfvRobust(TextureType target,
2001 GLenum pname,
2002 GLsizei bufSize,
2003 const GLfloat *params)
2004{
2005 texParameterfv(target, pname, params);
2006}
2007
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002008void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002009{
2010 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002011 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002012 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002013}
2014
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002015void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002016{
2017 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002018 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002019 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002020}
2021
Brandon Jones59770802018-04-02 13:18:42 -07002022void Context::texParameterivRobust(TextureType target,
2023 GLenum pname,
2024 GLsizei bufSize,
2025 const GLint *params)
2026{
2027 texParameteriv(target, pname, params);
2028}
2029
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002030void Context::texParameterIivRobust(TextureType target,
2031 GLenum pname,
2032 GLsizei bufSize,
2033 const GLint *params)
2034{
2035 UNIMPLEMENTED();
2036}
2037
2038void Context::texParameterIuivRobust(TextureType target,
2039 GLenum pname,
2040 GLsizei bufSize,
2041 const GLuint *params)
2042{
2043 UNIMPLEMENTED();
2044}
2045
Jamie Madill675fe712016-12-19 13:07:54 -05002046void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002047{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002048 // No-op if zero count
2049 if (count == 0)
2050 {
2051 return;
2052 }
2053
Jamie Madill05b35b22017-10-03 09:01:44 -04002054 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002055 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002056 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002057}
2058
Jamie Madill675fe712016-12-19 13:07:54 -05002059void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002060{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002061 // No-op if zero count
2062 if (count == 0 || instanceCount == 0)
2063 {
2064 return;
2065 }
2066
Jamie Madill05b35b22017-10-03 09:01:44 -04002067 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002068 ANGLE_CONTEXT_TRY(
2069 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002070 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2071 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002072}
2073
Jamie Madill876429b2017-04-20 15:46:24 -04002074void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002075{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002076 // No-op if zero count
2077 if (count == 0)
2078 {
2079 return;
2080 }
2081
Jamie Madill05b35b22017-10-03 09:01:44 -04002082 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002083 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002084}
2085
Jamie Madill675fe712016-12-19 13:07:54 -05002086void Context::drawElementsInstanced(GLenum mode,
2087 GLsizei count,
2088 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002089 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002090 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002091{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002092 // No-op if zero count
2093 if (count == 0 || instances == 0)
2094 {
2095 return;
2096 }
2097
Jamie Madill05b35b22017-10-03 09:01:44 -04002098 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002099 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002100 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002101}
2102
Jamie Madill675fe712016-12-19 13:07:54 -05002103void Context::drawRangeElements(GLenum mode,
2104 GLuint start,
2105 GLuint end,
2106 GLsizei count,
2107 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002108 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002109{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002110 // No-op if zero count
2111 if (count == 0)
2112 {
2113 return;
2114 }
2115
Jamie Madill05b35b22017-10-03 09:01:44 -04002116 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002117 ANGLE_CONTEXT_TRY(
2118 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002119}
2120
Jamie Madill876429b2017-04-20 15:46:24 -04002121void Context::drawArraysIndirect(GLenum mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002122{
Jamie Madill05b35b22017-10-03 09:01:44 -04002123 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002124 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002125}
2126
Jamie Madill876429b2017-04-20 15:46:24 -04002127void Context::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002128{
Jamie Madill05b35b22017-10-03 09:01:44 -04002129 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002130 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002131}
2132
Jamie Madill675fe712016-12-19 13:07:54 -05002133void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002134{
Jamie Madillafa02a22017-11-23 12:57:38 -05002135 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002136}
2137
Jamie Madill675fe712016-12-19 13:07:54 -05002138void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002139{
Jamie Madillafa02a22017-11-23 12:57:38 -05002140 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002141}
2142
Austin Kinross6ee1e782015-05-29 17:05:37 -07002143void Context::insertEventMarker(GLsizei length, const char *marker)
2144{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002145 ASSERT(mImplementation);
2146 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002147}
2148
2149void Context::pushGroupMarker(GLsizei length, const char *marker)
2150{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002151 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002152
2153 if (marker == nullptr)
2154 {
2155 // From the EXT_debug_marker spec,
2156 // "If <marker> is null then an empty string is pushed on the stack."
2157 mImplementation->pushGroupMarker(length, "");
2158 }
2159 else
2160 {
2161 mImplementation->pushGroupMarker(length, marker);
2162 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002163}
2164
2165void Context::popGroupMarker()
2166{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002167 ASSERT(mImplementation);
2168 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002169}
2170
Geoff Langd8605522016-04-13 10:19:12 -04002171void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2172{
2173 Program *programObject = getProgram(program);
2174 ASSERT(programObject);
2175
2176 programObject->bindUniformLocation(location, name);
2177}
2178
Brandon Jones59770802018-04-02 13:18:42 -07002179void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002180{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002181 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002182}
2183
Brandon Jones59770802018-04-02 13:18:42 -07002184void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002185{
2186 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2187}
2188
Brandon Jones59770802018-04-02 13:18:42 -07002189void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002190{
2191 GLfloat I[16];
2192 angle::Matrix<GLfloat>::setToIdentity(I);
2193
2194 mGLState.loadPathRenderingMatrix(matrixMode, I);
2195}
2196
2197void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2198{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002199 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002200 if (!pathObj)
2201 return;
2202
2203 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002204 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002205
2206 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2207}
2208
2209void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2210{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002211 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002212 if (!pathObj)
2213 return;
2214
2215 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002216 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002217
2218 mImplementation->stencilStrokePath(pathObj, reference, mask);
2219}
2220
2221void Context::coverFillPath(GLuint path, GLenum coverMode)
2222{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002223 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002224 if (!pathObj)
2225 return;
2226
2227 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002228 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002229
2230 mImplementation->coverFillPath(pathObj, coverMode);
2231}
2232
2233void Context::coverStrokePath(GLuint path, GLenum coverMode)
2234{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002235 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002236 if (!pathObj)
2237 return;
2238
2239 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002240 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002241
2242 mImplementation->coverStrokePath(pathObj, coverMode);
2243}
2244
2245void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2246{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002247 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002248 if (!pathObj)
2249 return;
2250
2251 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002252 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002253
2254 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2255}
2256
2257void Context::stencilThenCoverStrokePath(GLuint path,
2258 GLint reference,
2259 GLuint mask,
2260 GLenum coverMode)
2261{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002262 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002263 if (!pathObj)
2264 return;
2265
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änene45e53b2016-05-25 10:36:04 +03002268
2269 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2270}
2271
Sami Väisänend59ca052016-06-21 16:10:00 +03002272void Context::coverFillPathInstanced(GLsizei numPaths,
2273 GLenum pathNameType,
2274 const void *paths,
2275 GLuint pathBase,
2276 GLenum coverMode,
2277 GLenum transformType,
2278 const GLfloat *transformValues)
2279{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002280 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002281
2282 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002283 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002284
2285 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2286}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002287
Sami Väisänend59ca052016-06-21 16:10:00 +03002288void Context::coverStrokePathInstanced(GLsizei numPaths,
2289 GLenum pathNameType,
2290 const void *paths,
2291 GLuint pathBase,
2292 GLenum coverMode,
2293 GLenum transformType,
2294 const GLfloat *transformValues)
2295{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002296 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002297
2298 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002299 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002300
2301 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2302 transformValues);
2303}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002304
Sami Väisänend59ca052016-06-21 16:10:00 +03002305void Context::stencilFillPathInstanced(GLsizei numPaths,
2306 GLenum pathNameType,
2307 const void *paths,
2308 GLuint pathBase,
2309 GLenum fillMode,
2310 GLuint mask,
2311 GLenum transformType,
2312 const GLfloat *transformValues)
2313{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002314 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002315
2316 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002317 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002318
2319 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2320 transformValues);
2321}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002322
Sami Väisänend59ca052016-06-21 16:10:00 +03002323void Context::stencilStrokePathInstanced(GLsizei numPaths,
2324 GLenum pathNameType,
2325 const void *paths,
2326 GLuint pathBase,
2327 GLint reference,
2328 GLuint mask,
2329 GLenum transformType,
2330 const GLfloat *transformValues)
2331{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002332 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002333
2334 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002335 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002336
2337 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2338 transformValues);
2339}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002340
Sami Väisänend59ca052016-06-21 16:10:00 +03002341void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2342 GLenum pathNameType,
2343 const void *paths,
2344 GLuint pathBase,
2345 GLenum fillMode,
2346 GLuint mask,
2347 GLenum coverMode,
2348 GLenum transformType,
2349 const GLfloat *transformValues)
2350{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002351 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002352
2353 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002354 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002355
2356 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2357 transformType, transformValues);
2358}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002359
Sami Väisänend59ca052016-06-21 16:10:00 +03002360void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2361 GLenum pathNameType,
2362 const void *paths,
2363 GLuint pathBase,
2364 GLint reference,
2365 GLuint mask,
2366 GLenum coverMode,
2367 GLenum transformType,
2368 const GLfloat *transformValues)
2369{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002370 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002371
2372 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002373 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002374
2375 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2376 transformType, transformValues);
2377}
2378
Sami Väisänen46eaa942016-06-29 10:26:37 +03002379void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2380{
2381 auto *programObject = getProgram(program);
2382
2383 programObject->bindFragmentInputLocation(location, name);
2384}
2385
2386void Context::programPathFragmentInputGen(GLuint program,
2387 GLint location,
2388 GLenum genMode,
2389 GLint components,
2390 const GLfloat *coeffs)
2391{
2392 auto *programObject = getProgram(program);
2393
Jamie Madillbd044ed2017-06-05 12:59:21 -04002394 programObject->pathFragmentInputGen(this, location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002395}
2396
jchen1015015f72017-03-16 13:54:21 +08002397GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2398{
jchen10fd7c3b52017-03-21 15:36:03 +08002399 const auto *programObject = getProgram(program);
jchen1015015f72017-03-16 13:54:21 +08002400 return QueryProgramResourceIndex(programObject, programInterface, name);
2401}
2402
jchen10fd7c3b52017-03-21 15:36:03 +08002403void Context::getProgramResourceName(GLuint program,
2404 GLenum programInterface,
2405 GLuint index,
2406 GLsizei bufSize,
2407 GLsizei *length,
2408 GLchar *name)
2409{
2410 const auto *programObject = getProgram(program);
2411 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2412}
2413
jchen10191381f2017-04-11 13:59:04 +08002414GLint Context::getProgramResourceLocation(GLuint program,
2415 GLenum programInterface,
2416 const GLchar *name)
2417{
2418 const auto *programObject = getProgram(program);
2419 return QueryProgramResourceLocation(programObject, programInterface, name);
2420}
2421
jchen10880683b2017-04-12 16:21:55 +08002422void Context::getProgramResourceiv(GLuint program,
2423 GLenum programInterface,
2424 GLuint index,
2425 GLsizei propCount,
2426 const GLenum *props,
2427 GLsizei bufSize,
2428 GLsizei *length,
2429 GLint *params)
2430{
2431 const auto *programObject = getProgram(program);
2432 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2433 length, params);
2434}
2435
jchen10d9cd7b72017-08-30 15:04:25 +08002436void Context::getProgramInterfaceiv(GLuint program,
2437 GLenum programInterface,
2438 GLenum pname,
2439 GLint *params)
2440{
2441 const auto *programObject = getProgram(program);
2442 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2443}
2444
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002445void Context::getProgramInterfaceivRobust(GLuint program,
2446 GLenum programInterface,
2447 GLenum pname,
2448 GLsizei bufSize,
2449 GLsizei *length,
2450 GLint *params)
2451{
2452 UNIMPLEMENTED();
2453}
2454
Jamie Madill427064d2018-04-13 16:20:34 -04002455void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002456{
Geoff Lang7b19a492018-04-20 09:31:52 -04002457 if (ANGLE_UNLIKELY(error.isError()))
Geoff Langda5777c2014-07-11 09:52:58 -04002458 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002459 GLenum code = error.getCode();
2460 mErrors.insert(code);
2461 if (code == GL_OUT_OF_MEMORY && getWorkarounds().loseContextOnOutOfMemory)
2462 {
2463 markContextLost();
2464 }
Geoff Lang70d0f492015-12-10 17:45:46 -05002465
Geoff Langee6884e2017-11-09 16:51:11 -05002466 ASSERT(!error.getMessage().empty());
2467 mGLState.getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
2468 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
Geoff Langda5777c2014-07-11 09:52:58 -04002469 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002470}
2471
2472// Get one of the recorded errors and clear its flag, if any.
2473// [OpenGL ES 2.0.24] section 2.5 page 13.
2474GLenum Context::getError()
2475{
Geoff Langda5777c2014-07-11 09:52:58 -04002476 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002477 {
Geoff Langda5777c2014-07-11 09:52:58 -04002478 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002479 }
Geoff Langda5777c2014-07-11 09:52:58 -04002480 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002481 {
Geoff Langda5777c2014-07-11 09:52:58 -04002482 GLenum error = *mErrors.begin();
2483 mErrors.erase(mErrors.begin());
2484 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002485 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002486}
2487
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002488// NOTE: this function should not assume that this context is current!
Jamie Madill427064d2018-04-13 16:20:34 -04002489void Context::markContextLost() const
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002490{
2491 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002492 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002493 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002494 mContextLostForced = true;
2495 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002496 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002497}
2498
Jamie Madill427064d2018-04-13 16:20:34 -04002499bool Context::isContextLost() const
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002500{
2501 return mContextLost;
2502}
2503
Jamie Madillfa920eb2018-01-04 11:45:50 -05002504GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002505{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002506 // Even if the application doesn't want to know about resets, we want to know
2507 // as it will allow us to skip all the calls.
2508 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002509 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002510 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002511 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002512 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002513 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002514
2515 // EXT_robustness, section 2.6: If the reset notification behavior is
2516 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2517 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2518 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002519 }
2520
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002521 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2522 // status should be returned at least once, and GL_NO_ERROR should be returned
2523 // once the device has finished resetting.
2524 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002525 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002526 ASSERT(mResetStatus == GL_NO_ERROR);
2527 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002528
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002529 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002530 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002531 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002532 }
2533 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002534 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002535 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002536 // If markContextLost was used to mark the context lost then
2537 // assume that is not recoverable, and continue to report the
2538 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002539 mResetStatus = mImplementation->getResetStatus();
2540 }
Jamie Madill893ab082014-05-16 16:56:10 -04002541
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002542 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002543}
2544
2545bool Context::isResetNotificationEnabled()
2546{
2547 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2548}
2549
Corentin Walleze3b10e82015-05-20 11:06:25 -04002550const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002551{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002552 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002553}
2554
2555EGLenum Context::getClientType() const
2556{
2557 return mClientType;
2558}
2559
2560EGLenum Context::getRenderBuffer() const
2561{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002562 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2563 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002564 {
2565 return EGL_NONE;
2566 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002567
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002568 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002569 ASSERT(backAttachment != nullptr);
2570 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002571}
2572
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002573VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002574{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002575 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002576 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2577 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002578 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002579 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2580 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002581
Jamie Madill96a483b2017-06-27 16:49:21 -04002582 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002583 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002584
2585 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002586}
2587
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002588TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002589{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002590 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002591 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2592 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002593 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002594 transformFeedback =
2595 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002596 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002597 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002598 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002599
2600 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002601}
2602
2603bool Context::isVertexArrayGenerated(GLuint vertexArray)
2604{
Jamie Madill96a483b2017-06-27 16:49:21 -04002605 ASSERT(mVertexArrayMap.contains(0));
2606 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002607}
2608
2609bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2610{
Jamie Madill96a483b2017-06-27 16:49:21 -04002611 ASSERT(mTransformFeedbackMap.contains(0));
2612 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002613}
2614
Shannon Woods53a94a82014-06-24 15:20:36 -04002615void Context::detachTexture(GLuint texture)
2616{
2617 // Simple pass-through to State's detachTexture method, as textures do not require
2618 // allocation map management either here or in the resource manager at detach time.
2619 // Zero textures are held by the Context, and we don't attempt to request them from
2620 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002621 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002622}
2623
James Darpinian4d9d4832018-03-13 12:43:28 -07002624void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002625{
Yuly Novikov5807a532015-12-03 13:01:22 -05002626 // Simple pass-through to State's detachBuffer method, since
2627 // only buffer attachments to container objects that are bound to the current context
2628 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002629
Yuly Novikov5807a532015-12-03 13:01:22 -05002630 // [OpenGL ES 3.2] section 5.1.2 page 45:
2631 // Attachments to unbound container objects, such as
2632 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2633 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002634 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002635}
2636
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002637void Context::detachFramebuffer(GLuint framebuffer)
2638{
Shannon Woods53a94a82014-06-24 15:20:36 -04002639 // Framebuffer detachment is handled by Context, because 0 is a valid
2640 // Framebuffer object, and a pointer to it must be passed from Context
2641 // to State at binding time.
2642
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002643 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002644 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2645 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2646 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002647
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002648 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002649 {
2650 bindReadFramebuffer(0);
2651 }
2652
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002653 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002654 {
2655 bindDrawFramebuffer(0);
2656 }
2657}
2658
2659void Context::detachRenderbuffer(GLuint renderbuffer)
2660{
Jamie Madilla02315b2017-02-23 14:14:47 -05002661 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002662}
2663
Jamie Madill57a89722013-07-02 11:57:03 -04002664void Context::detachVertexArray(GLuint vertexArray)
2665{
Jamie Madill77a72f62015-04-14 11:18:32 -04002666 // Vertex array detachment is handled by Context, because 0 is a valid
2667 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002668 // binding time.
2669
Jamie Madill57a89722013-07-02 11:57:03 -04002670 // [OpenGL ES 3.0.2] section 2.10 page 43:
2671 // If a vertex array object that is currently bound is deleted, the binding
2672 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002673 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002674 {
2675 bindVertexArray(0);
2676 }
2677}
2678
Geoff Langc8058452014-02-03 12:04:11 -05002679void Context::detachTransformFeedback(GLuint transformFeedback)
2680{
Corentin Walleza2257da2016-04-19 16:43:12 -04002681 // Transform feedback detachment is handled by Context, because 0 is a valid
2682 // transform feedback, and a pointer to it must be passed from Context to State at
2683 // binding time.
2684
2685 // The OpenGL specification doesn't mention what should happen when the currently bound
2686 // transform feedback object is deleted. Since it is a container object, we treat it like
2687 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002688 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002689 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002690 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002691 }
Geoff Langc8058452014-02-03 12:04:11 -05002692}
2693
Jamie Madilldc356042013-07-19 16:36:57 -04002694void Context::detachSampler(GLuint sampler)
2695{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002696 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002697}
2698
Yunchao Hea336b902017-08-02 16:05:21 +08002699void Context::detachProgramPipeline(GLuint pipeline)
2700{
2701 mGLState.detachProgramPipeline(this, pipeline);
2702}
2703
Jamie Madill3ef140a2017-08-26 23:11:21 -04002704void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002705{
Shaodde78e82017-05-22 14:13:27 +08002706 mGLState.setVertexAttribDivisor(this, index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002707}
2708
Jamie Madille29d1672013-07-19 16:36:57 -04002709void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2710{
Geoff Langc1984ed2016-10-07 12:41:00 -04002711 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002712 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002713 SetSamplerParameteri(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002714 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002715}
Jamie Madille29d1672013-07-19 16:36:57 -04002716
Geoff Langc1984ed2016-10-07 12:41:00 -04002717void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2718{
2719 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002720 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002721 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002722 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002723}
2724
Brandon Jones59770802018-04-02 13:18:42 -07002725void Context::samplerParameterivRobust(GLuint sampler,
2726 GLenum pname,
2727 GLsizei bufSize,
2728 const GLint *param)
2729{
2730 samplerParameteriv(sampler, pname, param);
2731}
2732
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002733void Context::samplerParameterIivRobust(GLuint sampler,
2734 GLenum pname,
2735 GLsizei bufSize,
2736 const GLint *param)
2737{
2738 UNIMPLEMENTED();
2739}
2740
2741void Context::samplerParameterIuivRobust(GLuint sampler,
2742 GLenum pname,
2743 GLsizei bufSize,
2744 const GLuint *param)
2745{
2746 UNIMPLEMENTED();
2747}
2748
Jamie Madille29d1672013-07-19 16:36:57 -04002749void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2750{
Geoff Langc1984ed2016-10-07 12:41:00 -04002751 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002752 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002753 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002754 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002755}
2756
Geoff Langc1984ed2016-10-07 12:41:00 -04002757void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002758{
Geoff Langc1984ed2016-10-07 12:41:00 -04002759 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002760 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002761 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002762 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002763}
2764
Brandon Jones59770802018-04-02 13:18:42 -07002765void Context::samplerParameterfvRobust(GLuint sampler,
2766 GLenum pname,
2767 GLsizei bufSize,
2768 const GLfloat *param)
2769{
2770 samplerParameterfv(sampler, pname, param);
2771}
2772
Geoff Langc1984ed2016-10-07 12:41:00 -04002773void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002774{
Geoff Langc1984ed2016-10-07 12:41:00 -04002775 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002776 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002777 QuerySamplerParameteriv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002778 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002779}
Jamie Madill9675b802013-07-19 16:36:59 -04002780
Brandon Jones59770802018-04-02 13:18:42 -07002781void Context::getSamplerParameterivRobust(GLuint sampler,
2782 GLenum pname,
2783 GLsizei bufSize,
2784 GLsizei *length,
2785 GLint *params)
2786{
2787 getSamplerParameteriv(sampler, pname, params);
2788}
2789
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002790void Context::getSamplerParameterIivRobust(GLuint sampler,
2791 GLenum pname,
2792 GLsizei bufSize,
2793 GLsizei *length,
2794 GLint *params)
2795{
2796 UNIMPLEMENTED();
2797}
2798
2799void Context::getSamplerParameterIuivRobust(GLuint sampler,
2800 GLenum pname,
2801 GLsizei bufSize,
2802 GLsizei *length,
2803 GLuint *params)
2804{
2805 UNIMPLEMENTED();
2806}
2807
Geoff Langc1984ed2016-10-07 12:41:00 -04002808void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2809{
2810 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002811 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002812 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002813 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002814}
2815
Brandon Jones59770802018-04-02 13:18:42 -07002816void Context::getSamplerParameterfvRobust(GLuint sampler,
2817 GLenum pname,
2818 GLsizei bufSize,
2819 GLsizei *length,
2820 GLfloat *params)
2821{
2822 getSamplerParameterfv(sampler, pname, params);
2823}
2824
Olli Etuahof0fee072016-03-30 15:11:58 +03002825void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2826{
2827 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002828 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002829}
2830
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002831void Context::initRendererString()
2832{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002833 std::ostringstream rendererString;
2834 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002835 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002836 rendererString << ")";
2837
Geoff Langcec35902014-04-16 10:52:36 -04002838 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002839}
2840
Geoff Langc339c4e2016-11-29 10:37:36 -05002841void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002842{
Geoff Langc339c4e2016-11-29 10:37:36 -05002843 const Version &clientVersion = getClientVersion();
2844
2845 std::ostringstream versionString;
2846 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2847 << ANGLE_VERSION_STRING << ")";
2848 mVersionString = MakeStaticString(versionString.str());
2849
2850 std::ostringstream shadingLanguageVersionString;
2851 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2852 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2853 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2854 << ")";
2855 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002856}
2857
Geoff Langcec35902014-04-16 10:52:36 -04002858void Context::initExtensionStrings()
2859{
Geoff Langc339c4e2016-11-29 10:37:36 -05002860 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2861 std::ostringstream combinedStringStream;
2862 std::copy(strings.begin(), strings.end(),
2863 std::ostream_iterator<const char *>(combinedStringStream, " "));
2864 return MakeStaticString(combinedStringStream.str());
2865 };
2866
2867 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002868 for (const auto &extensionString : mExtensions.getStrings())
2869 {
2870 mExtensionStrings.push_back(MakeStaticString(extensionString));
2871 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002872 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002873
Geoff Langc339c4e2016-11-29 10:37:36 -05002874 mRequestableExtensionStrings.clear();
2875 for (const auto &extensionInfo : GetExtensionInfoMap())
2876 {
2877 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002878 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05002879 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002880 {
2881 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2882 }
2883 }
2884 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002885}
2886
Geoff Langc339c4e2016-11-29 10:37:36 -05002887const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04002888{
Geoff Langc339c4e2016-11-29 10:37:36 -05002889 switch (name)
2890 {
2891 case GL_VENDOR:
2892 return reinterpret_cast<const GLubyte *>("Google Inc.");
2893
2894 case GL_RENDERER:
2895 return reinterpret_cast<const GLubyte *>(mRendererString);
2896
2897 case GL_VERSION:
2898 return reinterpret_cast<const GLubyte *>(mVersionString);
2899
2900 case GL_SHADING_LANGUAGE_VERSION:
2901 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
2902
2903 case GL_EXTENSIONS:
2904 return reinterpret_cast<const GLubyte *>(mExtensionString);
2905
2906 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2907 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
2908
2909 default:
2910 UNREACHABLE();
2911 return nullptr;
2912 }
Geoff Langcec35902014-04-16 10:52:36 -04002913}
2914
Geoff Langc339c4e2016-11-29 10:37:36 -05002915const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04002916{
Geoff Langc339c4e2016-11-29 10:37:36 -05002917 switch (name)
2918 {
2919 case GL_EXTENSIONS:
2920 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
2921
2922 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2923 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
2924
2925 default:
2926 UNREACHABLE();
2927 return nullptr;
2928 }
Geoff Langcec35902014-04-16 10:52:36 -04002929}
2930
2931size_t Context::getExtensionStringCount() const
2932{
2933 return mExtensionStrings.size();
2934}
2935
Geoff Lang111a99e2017-10-17 10:58:41 -04002936bool Context::isExtensionRequestable(const char *name)
2937{
2938 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2939 auto extension = extensionInfos.find(name);
2940
Geoff Lang111a99e2017-10-17 10:58:41 -04002941 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05002942 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04002943}
2944
Geoff Langc339c4e2016-11-29 10:37:36 -05002945void Context::requestExtension(const char *name)
2946{
2947 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2948 ASSERT(extensionInfos.find(name) != extensionInfos.end());
2949 const auto &extension = extensionInfos.at(name);
2950 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05002951 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05002952
2953 if (mExtensions.*(extension.ExtensionsMember))
2954 {
2955 // Extension already enabled
2956 return;
2957 }
2958
2959 mExtensions.*(extension.ExtensionsMember) = true;
2960 updateCaps();
2961 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08002962
Jamie Madill2f348d22017-06-05 10:50:59 -04002963 // Release the shader compiler so it will be re-created with the requested extensions enabled.
2964 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04002965
Jamie Madill81c2e252017-09-09 23:32:46 -04002966 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
2967 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05002968 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04002969 for (auto &zeroTexture : mZeroTextures)
2970 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002971 if (zeroTexture.get() != nullptr)
2972 {
2973 zeroTexture->signalDirty(this, InitState::Initialized);
2974 }
Geoff Lang9aded172017-04-05 11:07:56 -04002975 }
2976
2977 mState.mFramebuffers->invalidateFramebufferComplenessCache();
Geoff Langc339c4e2016-11-29 10:37:36 -05002978}
2979
2980size_t Context::getRequestableExtensionStringCount() const
2981{
2982 return mRequestableExtensionStrings.size();
2983}
2984
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002985void Context::beginTransformFeedback(GLenum primitiveMode)
2986{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002987 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002988 ASSERT(transformFeedback != nullptr);
2989 ASSERT(!transformFeedback->isPaused());
2990
Jamie Madill6c1f6712017-02-14 19:08:04 -05002991 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002992}
2993
2994bool Context::hasActiveTransformFeedback(GLuint program) const
2995{
2996 for (auto pair : mTransformFeedbackMap)
2997 {
2998 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
2999 {
3000 return true;
3001 }
3002 }
3003 return false;
3004}
3005
Geoff Langb0f917f2017-12-05 13:41:54 -05003006Extensions Context::generateSupportedExtensions(const egl::DisplayExtensions &displayExtensions,
3007 bool robustResourceInit) const
3008{
3009 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3010
3011 if (getClientVersion() < ES_2_0)
3012 {
3013 // Default extensions for GLES1
3014 supportedExtensions.pointSizeArray = true;
Lingfeng Yang23dc90b2018-04-23 09:01:49 -07003015 supportedExtensions.textureCubeMap = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003016 }
3017
3018 if (getClientVersion() < ES_3_0)
3019 {
3020 // Disable ES3+ extensions
3021 supportedExtensions.colorBufferFloat = false;
3022 supportedExtensions.eglImageExternalEssl3 = false;
3023 supportedExtensions.textureNorm16 = false;
3024 supportedExtensions.multiview = false;
3025 supportedExtensions.maxViews = 1u;
3026 }
3027
3028 if (getClientVersion() < ES_3_1)
3029 {
3030 // Disable ES3.1+ extensions
3031 supportedExtensions.geometryShader = false;
3032 }
3033
3034 if (getClientVersion() > ES_2_0)
3035 {
3036 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3037 // supportedExtensions.sRGB = false;
3038 }
3039
3040 // Some extensions are always available because they are implemented in the GL layer.
3041 supportedExtensions.bindUniformLocation = true;
3042 supportedExtensions.vertexArrayObject = true;
3043 supportedExtensions.bindGeneratesResource = true;
3044 supportedExtensions.clientArrays = true;
3045 supportedExtensions.requestExtension = true;
3046
3047 // Enable the no error extension if the context was created with the flag.
3048 supportedExtensions.noError = mSkipValidation;
3049
3050 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
3051 supportedExtensions.surfacelessContext = displayExtensions.surfacelessContext;
3052
3053 // Explicitly enable GL_KHR_debug
3054 supportedExtensions.debug = true;
3055 supportedExtensions.maxDebugMessageLength = 1024;
3056 supportedExtensions.maxDebugLoggedMessages = 1024;
3057 supportedExtensions.maxDebugGroupStackDepth = 1024;
3058 supportedExtensions.maxLabelLength = 1024;
3059
3060 // Explicitly enable GL_ANGLE_robust_client_memory
3061 supportedExtensions.robustClientMemory = true;
3062
3063 // Determine robust resource init availability from EGL.
3064 supportedExtensions.robustResourceInitialization = robustResourceInit;
3065
3066 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3067 // supports it.
3068 supportedExtensions.robustBufferAccessBehavior =
3069 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3070
3071 // Enable the cache control query unconditionally.
3072 supportedExtensions.programCacheControl = true;
3073
3074 return supportedExtensions;
3075}
3076
Geoff Langb433e872017-10-05 14:01:47 -04003077void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit)
Geoff Lang493daf52014-07-03 13:38:44 -04003078{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003079 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003080
Geoff Langb0f917f2017-12-05 13:41:54 -05003081 mSupportedExtensions = generateSupportedExtensions(displayExtensions, robustResourceInit);
3082 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003083
3084 mLimitations = mImplementation->getNativeLimitations();
3085
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003086 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3087 if (getClientVersion() < Version(2, 0))
3088 {
3089 mCaps.maxMultitextureUnits = 4;
3090 mCaps.maxClipPlanes = 6;
3091 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003092 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3093 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3094 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003095 }
3096
Geoff Lang301d1612014-07-09 10:34:37 -04003097 // Apply implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003098 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003099
Jamie Madill0f80ed82017-09-19 00:24:56 -04003100 if (getClientVersion() < ES_3_1)
3101 {
3102 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3103 }
3104 else
3105 {
3106 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3107 }
Geoff Lang301d1612014-07-09 10:34:37 -04003108
Jamie Madill0f80ed82017-09-19 00:24:56 -04003109 LimitCap(&mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
3110 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3111 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3112
3113 // Limit textures as well, so we can use fast bitsets with texture bindings.
3114 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
3115 LimitCap(&mCaps.maxVertexTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3116 LimitCap(&mCaps.maxTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003117
Jiawei Shaodb342272017-09-27 10:21:45 +08003118 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3119
Geoff Langc287ea62016-09-16 14:46:51 -04003120 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003121 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003122 for (const auto &extensionInfo : GetExtensionInfoMap())
3123 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003124 // If the user has requested that extensions start disabled and they are requestable,
3125 // disable them.
3126 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003127 {
3128 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3129 }
3130 }
3131
3132 // Generate texture caps
3133 updateCaps();
3134}
3135
3136void Context::updateCaps()
3137{
Geoff Lang900013c2014-07-07 11:32:19 -04003138 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003139 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003140
Jamie Madill7b62cf92017-11-02 15:20:49 -04003141 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003142 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003143 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003144 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003145
Geoff Lang0d8b7242015-09-09 14:56:53 -04003146 // Update the format caps based on the client version and extensions.
3147 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3148 // ES3.
3149 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003150 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003151 formatCaps.renderable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003152 formatCaps.renderable && formatInfo.renderSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003153 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003154 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003155
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003156 // OpenGL ES does not support multisampling with non-rendererable formats
3157 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Olli Etuaho50c562d2017-06-06 14:43:30 +03003158 if (!formatCaps.renderable ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003159 (getClientVersion() < ES_3_1 &&
3160 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003161 {
Geoff Langd87878e2014-09-19 15:42:59 -04003162 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003163 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003164 else
3165 {
3166 // We may have limited the max samples for some required renderbuffer formats due to
3167 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3168 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3169
3170 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3171 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3172 // exception of signed and unsigned integer formats."
3173 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3174 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3175 {
3176 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3177 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3178 }
3179
3180 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3181 if (getClientVersion() >= ES_3_1)
3182 {
3183 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3184 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3185 // the exception that the signed and unsigned integer formats are required only to
3186 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3187 // multisamples, which must be at least one."
3188 if (formatInfo.componentType == GL_INT ||
3189 formatInfo.componentType == GL_UNSIGNED_INT)
3190 {
3191 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3192 }
3193
3194 // GLES 3.1 section 19.3.1.
3195 if (formatCaps.texturable)
3196 {
3197 if (formatInfo.depthBits > 0)
3198 {
3199 mCaps.maxDepthTextureSamples =
3200 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3201 }
3202 else if (formatInfo.redBits > 0)
3203 {
3204 mCaps.maxColorTextureSamples =
3205 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3206 }
3207 }
3208 }
3209 }
Geoff Langd87878e2014-09-19 15:42:59 -04003210
3211 if (formatCaps.texturable && formatInfo.compressed)
3212 {
Geoff Langca271392017-04-05 12:30:00 -04003213 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003214 }
3215
Geoff Langca271392017-04-05 12:30:00 -04003216 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003217 }
Jamie Madill32447362017-06-28 14:53:52 -04003218
3219 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003220 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003221 {
3222 mMemoryProgramCache = nullptr;
3223 }
Corentin Walleze4477002017-12-01 14:39:58 -05003224
3225 // Compute which buffer types are allowed
3226 mValidBufferBindings.reset();
3227 mValidBufferBindings.set(BufferBinding::ElementArray);
3228 mValidBufferBindings.set(BufferBinding::Array);
3229
3230 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3231 {
3232 mValidBufferBindings.set(BufferBinding::PixelPack);
3233 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3234 }
3235
3236 if (getClientVersion() >= ES_3_0)
3237 {
3238 mValidBufferBindings.set(BufferBinding::CopyRead);
3239 mValidBufferBindings.set(BufferBinding::CopyWrite);
3240 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3241 mValidBufferBindings.set(BufferBinding::Uniform);
3242 }
3243
3244 if (getClientVersion() >= ES_3_1)
3245 {
3246 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3247 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3248 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3249 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3250 }
Geoff Lang493daf52014-07-03 13:38:44 -04003251}
3252
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003253void Context::initWorkarounds()
3254{
Jamie Madill761b02c2017-06-23 16:27:06 -04003255 // Apply back-end workarounds.
3256 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3257
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003258 // Lose the context upon out of memory error if the application is
3259 // expecting to watch for those events.
3260 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3261}
3262
Jamie Madill05b35b22017-10-03 09:01:44 -04003263Error Context::prepareForDraw()
3264{
Geoff Langa8cb2872018-03-09 16:09:40 -05003265 ANGLE_TRY(syncDirtyObjects());
Jamie Madilla59fc192017-11-02 12:57:58 -04003266
3267 if (isRobustResourceInitEnabled())
3268 {
3269 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3270 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3271 }
3272
Geoff Langa8cb2872018-03-09 16:09:40 -05003273 ANGLE_TRY(syncDirtyBits());
Geoff Langd4fff502017-09-22 11:28:28 -04003274 return NoError();
3275}
3276
3277Error Context::prepareForClear(GLbitfield mask)
3278{
Geoff Langa8cb2872018-03-09 16:09:40 -05003279 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003280 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003281 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003282 return NoError();
3283}
3284
3285Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3286{
Geoff Langa8cb2872018-03-09 16:09:40 -05003287 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003288 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3289 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003290 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003291 return NoError();
3292}
3293
Geoff Langa8cb2872018-03-09 16:09:40 -05003294Error Context::syncState()
Jamie Madill1b94d432015-08-07 13:23:23 -04003295{
Geoff Langa8cb2872018-03-09 16:09:40 -05003296 ANGLE_TRY(syncDirtyObjects());
3297 ANGLE_TRY(syncDirtyBits());
Jamie Madillbc918e72018-03-08 09:47:21 -05003298 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003299}
3300
Geoff Langa8cb2872018-03-09 16:09:40 -05003301Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003302{
Geoff Langa8cb2872018-03-09 16:09:40 -05003303 ANGLE_TRY(syncDirtyObjects(objectMask));
3304 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003305 return NoError();
3306}
3307
Geoff Langa8cb2872018-03-09 16:09:40 -05003308Error Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003309{
3310 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
3311 mImplementation->syncState(this, dirtyBits);
3312 mGLState.clearDirtyBits();
3313 return NoError();
3314}
3315
Geoff Langa8cb2872018-03-09 16:09:40 -05003316Error Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003317{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003318 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madillfe548342017-06-19 11:13:24 -04003319 mImplementation->syncState(this, dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003320 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillbc918e72018-03-08 09:47:21 -05003321 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003322}
Jamie Madillc29968b2016-01-20 11:17:23 -05003323
Geoff Langa8cb2872018-03-09 16:09:40 -05003324Error Context::syncDirtyObjects()
Geoff Langd4fff502017-09-22 11:28:28 -04003325{
3326 return mGLState.syncDirtyObjects(this);
3327}
3328
Geoff Langa8cb2872018-03-09 16:09:40 -05003329Error Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003330{
3331 return mGLState.syncDirtyObjects(this, objectMask);
3332}
3333
Jamie Madillc29968b2016-01-20 11:17:23 -05003334void Context::blitFramebuffer(GLint srcX0,
3335 GLint srcY0,
3336 GLint srcX1,
3337 GLint srcY1,
3338 GLint dstX0,
3339 GLint dstY0,
3340 GLint dstX1,
3341 GLint dstY1,
3342 GLbitfield mask,
3343 GLenum filter)
3344{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003345 if (mask == 0)
3346 {
3347 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3348 // buffers are copied.
3349 return;
3350 }
3351
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003352 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003353 ASSERT(drawFramebuffer);
3354
3355 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3356 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3357
Jamie Madillbc918e72018-03-08 09:47:21 -05003358 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003359
Jamie Madillc564c072017-06-01 12:45:42 -04003360 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003361}
Jamie Madillc29968b2016-01-20 11:17:23 -05003362
3363void Context::clear(GLbitfield mask)
3364{
Geoff Langd4fff502017-09-22 11:28:28 -04003365 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3366 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003367}
3368
3369void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3370{
Geoff Langd4fff502017-09-22 11:28:28 -04003371 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3372 ANGLE_CONTEXT_TRY(
3373 mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003374}
3375
3376void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3377{
Geoff Langd4fff502017-09-22 11:28:28 -04003378 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3379 ANGLE_CONTEXT_TRY(
3380 mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003381}
3382
3383void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3384{
Geoff Langd4fff502017-09-22 11:28:28 -04003385 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3386 ANGLE_CONTEXT_TRY(
3387 mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003388}
3389
3390void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3391{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003392 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003393 ASSERT(framebufferObject);
3394
3395 // If a buffer is not present, the clear has no effect
3396 if (framebufferObject->getDepthbuffer() == nullptr &&
3397 framebufferObject->getStencilbuffer() == nullptr)
3398 {
3399 return;
3400 }
3401
Geoff Langd4fff502017-09-22 11:28:28 -04003402 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3403 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003404}
3405
3406void Context::readPixels(GLint x,
3407 GLint y,
3408 GLsizei width,
3409 GLsizei height,
3410 GLenum format,
3411 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003412 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003413{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003414 if (width == 0 || height == 0)
3415 {
3416 return;
3417 }
3418
Jamie Madillbc918e72018-03-08 09:47:21 -05003419 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003420
Jamie Madillb6664922017-07-25 12:55:04 -04003421 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3422 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003423
3424 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003425 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003426}
3427
Brandon Jones59770802018-04-02 13:18:42 -07003428void Context::readPixelsRobust(GLint x,
3429 GLint y,
3430 GLsizei width,
3431 GLsizei height,
3432 GLenum format,
3433 GLenum type,
3434 GLsizei bufSize,
3435 GLsizei *length,
3436 GLsizei *columns,
3437 GLsizei *rows,
3438 void *pixels)
3439{
3440 readPixels(x, y, width, height, format, type, pixels);
3441}
3442
3443void Context::readnPixelsRobust(GLint x,
3444 GLint y,
3445 GLsizei width,
3446 GLsizei height,
3447 GLenum format,
3448 GLenum type,
3449 GLsizei bufSize,
3450 GLsizei *length,
3451 GLsizei *columns,
3452 GLsizei *rows,
3453 void *data)
3454{
3455 readPixels(x, y, width, height, format, type, data);
3456}
3457
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003458void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003459 GLint level,
3460 GLenum internalformat,
3461 GLint x,
3462 GLint y,
3463 GLsizei width,
3464 GLsizei height,
3465 GLint border)
3466{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003467 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003468 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003469
Jamie Madillc29968b2016-01-20 11:17:23 -05003470 Rectangle sourceArea(x, y, width, height);
3471
Jamie Madill05b35b22017-10-03 09:01:44 -04003472 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003473 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003474 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003475}
3476
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003477void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003478 GLint level,
3479 GLint xoffset,
3480 GLint yoffset,
3481 GLint x,
3482 GLint y,
3483 GLsizei width,
3484 GLsizei height)
3485{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003486 if (width == 0 || height == 0)
3487 {
3488 return;
3489 }
3490
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003491 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003492 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003493
Jamie Madillc29968b2016-01-20 11:17:23 -05003494 Offset destOffset(xoffset, yoffset, 0);
3495 Rectangle sourceArea(x, y, width, height);
3496
Jamie Madill05b35b22017-10-03 09:01:44 -04003497 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003498 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003499 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003500}
3501
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003502void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003503 GLint level,
3504 GLint xoffset,
3505 GLint yoffset,
3506 GLint zoffset,
3507 GLint x,
3508 GLint y,
3509 GLsizei width,
3510 GLsizei height)
3511{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003512 if (width == 0 || height == 0)
3513 {
3514 return;
3515 }
3516
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003517 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003518 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003519
Jamie Madillc29968b2016-01-20 11:17:23 -05003520 Offset destOffset(xoffset, yoffset, zoffset);
3521 Rectangle sourceArea(x, y, width, height);
3522
Jamie Madill05b35b22017-10-03 09:01:44 -04003523 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3524 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003525 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3526 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003527}
3528
3529void Context::framebufferTexture2D(GLenum target,
3530 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003531 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003532 GLuint texture,
3533 GLint level)
3534{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003535 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003536 ASSERT(framebuffer);
3537
3538 if (texture != 0)
3539 {
3540 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003541 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003542 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003543 }
3544 else
3545 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003546 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003547 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003548
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003549 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003550}
3551
3552void Context::framebufferRenderbuffer(GLenum target,
3553 GLenum attachment,
3554 GLenum renderbuffertarget,
3555 GLuint renderbuffer)
3556{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003557 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003558 ASSERT(framebuffer);
3559
3560 if (renderbuffer != 0)
3561 {
3562 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003563
Jamie Madillcc129372018-04-12 09:13:18 -04003564 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003565 renderbufferObject);
3566 }
3567 else
3568 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003569 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003570 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003571
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003572 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003573}
3574
3575void Context::framebufferTextureLayer(GLenum target,
3576 GLenum attachment,
3577 GLuint texture,
3578 GLint level,
3579 GLint layer)
3580{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003581 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003582 ASSERT(framebuffer);
3583
3584 if (texture != 0)
3585 {
3586 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003587 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003588 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003589 }
3590 else
3591 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003592 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003593 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003594
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003595 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003596}
3597
Brandon Jones59770802018-04-02 13:18:42 -07003598void Context::framebufferTextureMultiviewLayered(GLenum target,
3599 GLenum attachment,
3600 GLuint texture,
3601 GLint level,
3602 GLint baseViewIndex,
3603 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003604{
Martin Radev82ef7742017-08-08 17:44:58 +03003605 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3606 ASSERT(framebuffer);
3607
3608 if (texture != 0)
3609 {
3610 Texture *textureObj = getTexture(texture);
3611
Martin Radev18b75ba2017-08-15 15:50:40 +03003612 ImageIndex index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
Martin Radev82ef7742017-08-08 17:44:58 +03003613 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3614 numViews, baseViewIndex);
3615 }
3616 else
3617 {
3618 framebuffer->resetAttachment(this, attachment);
3619 }
3620
3621 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003622}
3623
Brandon Jones59770802018-04-02 13:18:42 -07003624void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3625 GLenum attachment,
3626 GLuint texture,
3627 GLint level,
3628 GLsizei numViews,
3629 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003630{
Martin Radev5dae57b2017-07-14 16:15:55 +03003631 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3632 ASSERT(framebuffer);
3633
3634 if (texture != 0)
3635 {
3636 Texture *textureObj = getTexture(texture);
3637
3638 ImageIndex index = ImageIndex::Make2D(level);
3639 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3640 textureObj, numViews, viewportOffsets);
3641 }
3642 else
3643 {
3644 framebuffer->resetAttachment(this, attachment);
3645 }
3646
3647 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003648}
3649
Jamie Madillc29968b2016-01-20 11:17:23 -05003650void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3651{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003652 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003653 ASSERT(framebuffer);
3654 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003655 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003656}
3657
3658void Context::readBuffer(GLenum mode)
3659{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003660 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003661 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003662 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003663}
3664
3665void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3666{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003667 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003668 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003669
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003670 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003671 ASSERT(framebuffer);
3672
3673 // The specification isn't clear what should be done when the framebuffer isn't complete.
3674 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003675 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003676}
3677
3678void Context::invalidateFramebuffer(GLenum target,
3679 GLsizei numAttachments,
3680 const GLenum *attachments)
3681{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003682 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003683 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003684
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003685 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003686 ASSERT(framebuffer);
3687
Jamie Madill427064d2018-04-13 16:20:34 -04003688 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003689 {
Jamie Madill437fa652016-05-03 15:13:24 -04003690 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003691 }
Jamie Madill437fa652016-05-03 15:13:24 -04003692
Jamie Madill4928b7c2017-06-20 12:57:39 -04003693 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003694}
3695
3696void Context::invalidateSubFramebuffer(GLenum target,
3697 GLsizei numAttachments,
3698 const GLenum *attachments,
3699 GLint x,
3700 GLint y,
3701 GLsizei width,
3702 GLsizei height)
3703{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003704 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003705 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003706
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003707 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003708 ASSERT(framebuffer);
3709
Jamie Madill427064d2018-04-13 16:20:34 -04003710 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003711 {
Jamie Madill437fa652016-05-03 15:13:24 -04003712 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003713 }
Jamie Madill437fa652016-05-03 15:13:24 -04003714
3715 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003716 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003717}
3718
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003719void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003720 GLint level,
3721 GLint internalformat,
3722 GLsizei width,
3723 GLsizei height,
3724 GLint border,
3725 GLenum format,
3726 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003727 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003728{
Jamie Madillbc918e72018-03-08 09:47:21 -05003729 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003730
3731 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003732 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003733 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3734 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003735}
3736
Brandon Jones59770802018-04-02 13:18:42 -07003737void Context::texImage2DRobust(TextureTarget target,
3738 GLint level,
3739 GLint internalformat,
3740 GLsizei width,
3741 GLsizei height,
3742 GLint border,
3743 GLenum format,
3744 GLenum type,
3745 GLsizei bufSize,
3746 const void *pixels)
3747{
3748 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
3749}
3750
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003751void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003752 GLint level,
3753 GLint internalformat,
3754 GLsizei width,
3755 GLsizei height,
3756 GLsizei depth,
3757 GLint border,
3758 GLenum format,
3759 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003760 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003761{
Jamie Madillbc918e72018-03-08 09:47:21 -05003762 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003763
3764 Extents size(width, height, depth);
3765 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003766 handleError(texture->setImage(this, mGLState.getUnpackState(),
3767 NonCubeTextureTypeToTarget(target), level, internalformat, size,
3768 format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003769}
3770
Brandon Jones59770802018-04-02 13:18:42 -07003771void Context::texImage3DRobust(TextureType target,
3772 GLint level,
3773 GLint internalformat,
3774 GLsizei width,
3775 GLsizei height,
3776 GLsizei depth,
3777 GLint border,
3778 GLenum format,
3779 GLenum type,
3780 GLsizei bufSize,
3781 const void *pixels)
3782{
3783 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
3784}
3785
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003786void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003787 GLint level,
3788 GLint xoffset,
3789 GLint yoffset,
3790 GLsizei width,
3791 GLsizei height,
3792 GLenum format,
3793 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003794 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003795{
3796 // Zero sized uploads are valid but no-ops
3797 if (width == 0 || height == 0)
3798 {
3799 return;
3800 }
3801
Jamie Madillbc918e72018-03-08 09:47:21 -05003802 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003803
3804 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003805 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003806 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3807 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003808}
3809
Brandon Jones59770802018-04-02 13:18:42 -07003810void Context::texSubImage2DRobust(TextureTarget target,
3811 GLint level,
3812 GLint xoffset,
3813 GLint yoffset,
3814 GLsizei width,
3815 GLsizei height,
3816 GLenum format,
3817 GLenum type,
3818 GLsizei bufSize,
3819 const void *pixels)
3820{
3821 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
3822}
3823
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003824void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003825 GLint level,
3826 GLint xoffset,
3827 GLint yoffset,
3828 GLint zoffset,
3829 GLsizei width,
3830 GLsizei height,
3831 GLsizei depth,
3832 GLenum format,
3833 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003834 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003835{
3836 // Zero sized uploads are valid but no-ops
3837 if (width == 0 || height == 0 || depth == 0)
3838 {
3839 return;
3840 }
3841
Jamie Madillbc918e72018-03-08 09:47:21 -05003842 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003843
3844 Box area(xoffset, yoffset, zoffset, width, height, depth);
3845 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003846 handleError(texture->setSubImage(this, mGLState.getUnpackState(),
3847 NonCubeTextureTypeToTarget(target), level, area, format, type,
3848 reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003849}
3850
Brandon Jones59770802018-04-02 13:18:42 -07003851void Context::texSubImage3DRobust(TextureType target,
3852 GLint level,
3853 GLint xoffset,
3854 GLint yoffset,
3855 GLint zoffset,
3856 GLsizei width,
3857 GLsizei height,
3858 GLsizei depth,
3859 GLenum format,
3860 GLenum type,
3861 GLsizei bufSize,
3862 const void *pixels)
3863{
3864 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
3865 pixels);
3866}
3867
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003868void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003869 GLint level,
3870 GLenum internalformat,
3871 GLsizei width,
3872 GLsizei height,
3873 GLint border,
3874 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003875 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003876{
Jamie Madillbc918e72018-03-08 09:47:21 -05003877 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003878
3879 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003880 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003881 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
3882 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003883 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003884}
3885
Brandon Jones59770802018-04-02 13:18:42 -07003886void Context::compressedTexImage2DRobust(TextureTarget target,
3887 GLint level,
3888 GLenum internalformat,
3889 GLsizei width,
3890 GLsizei height,
3891 GLint border,
3892 GLsizei imageSize,
3893 GLsizei dataSize,
3894 const GLvoid *data)
3895{
3896 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
3897}
3898
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003899void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003900 GLint level,
3901 GLenum internalformat,
3902 GLsizei width,
3903 GLsizei height,
3904 GLsizei depth,
3905 GLint border,
3906 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003907 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003908{
Jamie Madillbc918e72018-03-08 09:47:21 -05003909 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003910
3911 Extents size(width, height, depth);
3912 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003913 handleError(texture->setCompressedImage(
3914 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
3915 size, imageSize, reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003916}
3917
Brandon Jones59770802018-04-02 13:18:42 -07003918void Context::compressedTexImage3DRobust(TextureType target,
3919 GLint level,
3920 GLenum internalformat,
3921 GLsizei width,
3922 GLsizei height,
3923 GLsizei depth,
3924 GLint border,
3925 GLsizei imageSize,
3926 GLsizei dataSize,
3927 const GLvoid *data)
3928{
3929 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
3930 data);
3931}
3932
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003933void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003934 GLint level,
3935 GLint xoffset,
3936 GLint yoffset,
3937 GLsizei width,
3938 GLsizei height,
3939 GLenum format,
3940 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003941 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003942{
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, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003946 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003947 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
3948 format, imageSize,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003949 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003950}
3951
Brandon Jones59770802018-04-02 13:18:42 -07003952void Context::compressedTexSubImage2DRobust(TextureTarget target,
3953 GLint level,
3954 GLint xoffset,
3955 GLint yoffset,
3956 GLsizei width,
3957 GLsizei height,
3958 GLenum format,
3959 GLsizei imageSize,
3960 GLsizei dataSize,
3961 const GLvoid *data)
3962{
3963 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
3964 data);
3965}
3966
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003967void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003968 GLint level,
3969 GLint xoffset,
3970 GLint yoffset,
3971 GLint zoffset,
3972 GLsizei width,
3973 GLsizei height,
3974 GLsizei depth,
3975 GLenum format,
3976 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003977 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003978{
3979 // Zero sized uploads are valid but no-ops
3980 if (width == 0 || height == 0)
3981 {
3982 return;
3983 }
3984
Jamie Madillbc918e72018-03-08 09:47:21 -05003985 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003986
3987 Box area(xoffset, yoffset, zoffset, width, height, depth);
3988 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003989 handleError(texture->setCompressedSubImage(
3990 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
3991 imageSize, reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003992}
3993
Brandon Jones59770802018-04-02 13:18:42 -07003994void Context::compressedTexSubImage3DRobust(TextureType target,
3995 GLint level,
3996 GLint xoffset,
3997 GLint yoffset,
3998 GLint zoffset,
3999 GLsizei width,
4000 GLsizei height,
4001 GLsizei depth,
4002 GLenum format,
4003 GLsizei imageSize,
4004 GLsizei dataSize,
4005 const GLvoid *data)
4006{
4007 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4008 imageSize, data);
4009}
4010
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004011void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004012{
4013 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004014 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004015}
4016
Jamie Madill007530e2017-12-28 14:27:04 -05004017void Context::copyTexture(GLuint sourceId,
4018 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004019 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004020 GLuint destId,
4021 GLint destLevel,
4022 GLint internalFormat,
4023 GLenum destType,
4024 GLboolean unpackFlipY,
4025 GLboolean unpackPremultiplyAlpha,
4026 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004027{
Jamie Madillbc918e72018-03-08 09:47:21 -05004028 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004029
4030 gl::Texture *sourceTexture = getTexture(sourceId);
4031 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004032 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4033 sourceLevel, ConvertToBool(unpackFlipY),
4034 ConvertToBool(unpackPremultiplyAlpha),
4035 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004036}
4037
Jamie Madill007530e2017-12-28 14:27:04 -05004038void Context::copySubTexture(GLuint sourceId,
4039 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004040 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004041 GLuint destId,
4042 GLint destLevel,
4043 GLint xoffset,
4044 GLint yoffset,
4045 GLint x,
4046 GLint y,
4047 GLsizei width,
4048 GLsizei height,
4049 GLboolean unpackFlipY,
4050 GLboolean unpackPremultiplyAlpha,
4051 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004052{
4053 // Zero sized copies are valid but no-ops
4054 if (width == 0 || height == 0)
4055 {
4056 return;
4057 }
4058
Jamie Madillbc918e72018-03-08 09:47:21 -05004059 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004060
4061 gl::Texture *sourceTexture = getTexture(sourceId);
4062 gl::Texture *destTexture = getTexture(destId);
4063 Offset offset(xoffset, yoffset, 0);
4064 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05004065 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
4066 ConvertToBool(unpackFlipY),
4067 ConvertToBool(unpackPremultiplyAlpha),
4068 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004069}
4070
Jamie Madill007530e2017-12-28 14:27:04 -05004071void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004072{
Jamie Madillbc918e72018-03-08 09:47:21 -05004073 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004074
4075 gl::Texture *sourceTexture = getTexture(sourceId);
4076 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004077 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004078}
4079
Corentin Wallez336129f2017-10-17 15:55:40 -04004080void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004081{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004082 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004083 ASSERT(buffer);
4084
Geoff Lang496c02d2016-10-20 11:38:11 -07004085 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004086}
4087
Brandon Jones59770802018-04-02 13:18:42 -07004088void Context::getBufferPointervRobust(BufferBinding target,
4089 GLenum pname,
4090 GLsizei bufSize,
4091 GLsizei *length,
4092 void **params)
4093{
4094 getBufferPointerv(target, pname, params);
4095}
4096
Corentin Wallez336129f2017-10-17 15:55:40 -04004097void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004098{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004099 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004100 ASSERT(buffer);
4101
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004102 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004103 if (error.isError())
4104 {
Jamie Madill437fa652016-05-03 15:13:24 -04004105 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004106 return nullptr;
4107 }
4108
4109 return buffer->getMapPointer();
4110}
4111
Corentin Wallez336129f2017-10-17 15:55:40 -04004112GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004113{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004114 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004115 ASSERT(buffer);
4116
4117 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004118 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004119 if (error.isError())
4120 {
Jamie Madill437fa652016-05-03 15:13:24 -04004121 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004122 return GL_FALSE;
4123 }
4124
4125 return result;
4126}
4127
Corentin Wallez336129f2017-10-17 15:55:40 -04004128void *Context::mapBufferRange(BufferBinding target,
4129 GLintptr offset,
4130 GLsizeiptr length,
4131 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004132{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004133 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004134 ASSERT(buffer);
4135
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004136 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004137 if (error.isError())
4138 {
Jamie Madill437fa652016-05-03 15:13:24 -04004139 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004140 return nullptr;
4141 }
4142
4143 return buffer->getMapPointer();
4144}
4145
Corentin Wallez336129f2017-10-17 15:55:40 -04004146void Context::flushMappedBufferRange(BufferBinding /*target*/,
4147 GLintptr /*offset*/,
4148 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004149{
4150 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4151}
4152
Jamie Madillbc918e72018-03-08 09:47:21 -05004153Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004154{
Geoff Langa8cb2872018-03-09 16:09:40 -05004155 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004156}
4157
Jamie Madillbc918e72018-03-08 09:47:21 -05004158Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004159{
Geoff Langa8cb2872018-03-09 16:09:40 -05004160 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004161}
4162
Jamie Madillbc918e72018-03-08 09:47:21 -05004163Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004164{
Geoff Langa8cb2872018-03-09 16:09:40 -05004165 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004166}
4167
Jiajia Qin5451d532017-11-16 17:16:34 +08004168void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4169{
4170 UNIMPLEMENTED();
4171}
4172
Jamie Madillc20ab272016-06-09 07:20:46 -07004173void Context::activeTexture(GLenum texture)
4174{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004175 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004176}
4177
Jamie Madill876429b2017-04-20 15:46:24 -04004178void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004179{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004180 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004181}
4182
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004183void Context::blendEquation(GLenum mode)
4184{
4185 mGLState.setBlendEquation(mode, mode);
4186}
4187
Jamie Madillc20ab272016-06-09 07:20:46 -07004188void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4189{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004190 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004191}
4192
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004193void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4194{
4195 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4196}
4197
Jamie Madillc20ab272016-06-09 07:20:46 -07004198void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4199{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004200 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004201}
4202
Jamie Madill876429b2017-04-20 15:46:24 -04004203void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004204{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004205 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004206}
4207
Jamie Madill876429b2017-04-20 15:46:24 -04004208void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004209{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004210 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004211}
4212
4213void Context::clearStencil(GLint s)
4214{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004215 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004216}
4217
4218void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4219{
Geoff Lang92019432017-11-20 13:09:34 -05004220 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4221 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004222}
4223
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004224void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004225{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004226 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004227}
4228
4229void Context::depthFunc(GLenum func)
4230{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004231 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004232}
4233
4234void Context::depthMask(GLboolean flag)
4235{
Geoff Lang92019432017-11-20 13:09:34 -05004236 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004237}
4238
Jamie Madill876429b2017-04-20 15:46:24 -04004239void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004240{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004241 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004242}
4243
4244void Context::disable(GLenum cap)
4245{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004246 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07004247}
4248
4249void Context::disableVertexAttribArray(GLuint index)
4250{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004251 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07004252}
4253
4254void Context::enable(GLenum cap)
4255{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004256 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07004257}
4258
4259void Context::enableVertexAttribArray(GLuint index)
4260{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004261 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07004262}
4263
4264void Context::frontFace(GLenum mode)
4265{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004266 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004267}
4268
4269void Context::hint(GLenum target, GLenum mode)
4270{
4271 switch (target)
4272 {
4273 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004274 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004275 break;
4276
4277 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004278 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004279 break;
4280
4281 default:
4282 UNREACHABLE();
4283 return;
4284 }
4285}
4286
4287void Context::lineWidth(GLfloat width)
4288{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004289 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004290}
4291
4292void Context::pixelStorei(GLenum pname, GLint param)
4293{
4294 switch (pname)
4295 {
4296 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004297 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004298 break;
4299
4300 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004301 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004302 break;
4303
4304 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004305 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004306 break;
4307
4308 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004309 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004310 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004311 break;
4312
4313 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004314 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004315 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004316 break;
4317
4318 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004319 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004320 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004321 break;
4322
4323 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004324 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004325 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004326 break;
4327
4328 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004329 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004330 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004331 break;
4332
4333 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004334 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004335 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004336 break;
4337
4338 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004339 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004340 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004341 break;
4342
4343 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004344 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004345 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004346 break;
4347
4348 default:
4349 UNREACHABLE();
4350 return;
4351 }
4352}
4353
4354void Context::polygonOffset(GLfloat factor, GLfloat units)
4355{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004356 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004357}
4358
Jamie Madill876429b2017-04-20 15:46:24 -04004359void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004360{
Geoff Lang92019432017-11-20 13:09:34 -05004361 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004362}
4363
Jiawei Shaodb342272017-09-27 10:21:45 +08004364void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4365{
4366 mGLState.setSampleMaskParams(maskNumber, mask);
4367}
4368
Jamie Madillc20ab272016-06-09 07:20:46 -07004369void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4370{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004371 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004372}
4373
4374void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4375{
4376 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4377 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004378 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004379 }
4380
4381 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4382 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004383 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004384 }
4385}
4386
4387void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4388{
4389 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4390 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004391 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004392 }
4393
4394 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4395 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004396 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004397 }
4398}
4399
4400void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4401{
4402 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4403 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004404 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004405 }
4406
4407 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4408 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004409 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004410 }
4411}
4412
4413void Context::vertexAttrib1f(GLuint index, GLfloat x)
4414{
4415 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004416 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004417}
4418
4419void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4420{
4421 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004422 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004423}
4424
4425void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4426{
4427 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004428 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004429}
4430
4431void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4432{
4433 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004434 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004435}
4436
4437void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4438{
4439 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004440 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004441}
4442
4443void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4444{
4445 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004446 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004447}
4448
4449void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4450{
4451 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004452 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004453}
4454
4455void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4456{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004457 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07004458}
4459
4460void Context::vertexAttribPointer(GLuint index,
4461 GLint size,
4462 GLenum type,
4463 GLboolean normalized,
4464 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004465 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004466{
Corentin Wallez336129f2017-10-17 15:55:40 -04004467 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004468 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07004469}
4470
Shao80957d92017-02-20 21:25:59 +08004471void Context::vertexAttribFormat(GLuint attribIndex,
4472 GLint size,
4473 GLenum type,
4474 GLboolean normalized,
4475 GLuint relativeOffset)
4476{
Geoff Lang92019432017-11-20 13:09:34 -05004477 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004478 relativeOffset);
4479}
4480
4481void Context::vertexAttribIFormat(GLuint attribIndex,
4482 GLint size,
4483 GLenum type,
4484 GLuint relativeOffset)
4485{
4486 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
4487}
4488
4489void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4490{
Shaodde78e82017-05-22 14:13:27 +08004491 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08004492}
4493
Jiajia Qin5451d532017-11-16 17:16:34 +08004494void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004495{
4496 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
4497}
4498
Jamie Madillc20ab272016-06-09 07:20:46 -07004499void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4500{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004501 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004502}
4503
4504void Context::vertexAttribIPointer(GLuint index,
4505 GLint size,
4506 GLenum type,
4507 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004508 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004509{
Corentin Wallez336129f2017-10-17 15:55:40 -04004510 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4511 size, type, false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07004512}
4513
4514void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4515{
4516 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004517 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004518}
4519
4520void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4521{
4522 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004523 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004524}
4525
4526void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4527{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004528 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004529}
4530
4531void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4532{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004533 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004534}
4535
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004536void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4537{
4538 const VertexAttribCurrentValueData &currentValues =
4539 getGLState().getVertexAttribCurrentValue(index);
4540 const VertexArray *vao = getGLState().getVertexArray();
4541 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4542 currentValues, pname, params);
4543}
4544
Brandon Jones59770802018-04-02 13:18:42 -07004545void Context::getVertexAttribivRobust(GLuint index,
4546 GLenum pname,
4547 GLsizei bufSize,
4548 GLsizei *length,
4549 GLint *params)
4550{
4551 getVertexAttribiv(index, pname, params);
4552}
4553
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004554void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4555{
4556 const VertexAttribCurrentValueData &currentValues =
4557 getGLState().getVertexAttribCurrentValue(index);
4558 const VertexArray *vao = getGLState().getVertexArray();
4559 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4560 currentValues, pname, params);
4561}
4562
Brandon Jones59770802018-04-02 13:18:42 -07004563void Context::getVertexAttribfvRobust(GLuint index,
4564 GLenum pname,
4565 GLsizei bufSize,
4566 GLsizei *length,
4567 GLfloat *params)
4568{
4569 getVertexAttribfv(index, pname, params);
4570}
4571
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004572void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4573{
4574 const VertexAttribCurrentValueData &currentValues =
4575 getGLState().getVertexAttribCurrentValue(index);
4576 const VertexArray *vao = getGLState().getVertexArray();
4577 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4578 currentValues, pname, params);
4579}
4580
Brandon Jones59770802018-04-02 13:18:42 -07004581void Context::getVertexAttribIivRobust(GLuint index,
4582 GLenum pname,
4583 GLsizei bufSize,
4584 GLsizei *length,
4585 GLint *params)
4586{
4587 getVertexAttribIiv(index, pname, params);
4588}
4589
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004590void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4591{
4592 const VertexAttribCurrentValueData &currentValues =
4593 getGLState().getVertexAttribCurrentValue(index);
4594 const VertexArray *vao = getGLState().getVertexArray();
4595 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4596 currentValues, pname, params);
4597}
4598
Brandon Jones59770802018-04-02 13:18:42 -07004599void Context::getVertexAttribIuivRobust(GLuint index,
4600 GLenum pname,
4601 GLsizei bufSize,
4602 GLsizei *length,
4603 GLuint *params)
4604{
4605 getVertexAttribIuiv(index, pname, params);
4606}
4607
Jamie Madill876429b2017-04-20 15:46:24 -04004608void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004609{
4610 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4611 QueryVertexAttribPointerv(attrib, pname, pointer);
4612}
4613
Brandon Jones59770802018-04-02 13:18:42 -07004614void Context::getVertexAttribPointervRobust(GLuint index,
4615 GLenum pname,
4616 GLsizei bufSize,
4617 GLsizei *length,
4618 void **pointer)
4619{
4620 getVertexAttribPointerv(index, pname, pointer);
4621}
4622
Jamie Madillc20ab272016-06-09 07:20:46 -07004623void Context::debugMessageControl(GLenum source,
4624 GLenum type,
4625 GLenum severity,
4626 GLsizei count,
4627 const GLuint *ids,
4628 GLboolean enabled)
4629{
4630 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004631 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004632 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004633}
4634
4635void Context::debugMessageInsert(GLenum source,
4636 GLenum type,
4637 GLuint id,
4638 GLenum severity,
4639 GLsizei length,
4640 const GLchar *buf)
4641{
4642 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004643 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004644}
4645
4646void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4647{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004648 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004649}
4650
4651GLuint Context::getDebugMessageLog(GLuint count,
4652 GLsizei bufSize,
4653 GLenum *sources,
4654 GLenum *types,
4655 GLuint *ids,
4656 GLenum *severities,
4657 GLsizei *lengths,
4658 GLchar *messageLog)
4659{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004660 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4661 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004662}
4663
4664void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4665{
4666 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004667 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004668 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004669}
4670
4671void Context::popDebugGroup()
4672{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004673 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004674 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004675}
4676
Corentin Wallez336129f2017-10-17 15:55:40 -04004677void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004678{
4679 Buffer *buffer = mGLState.getTargetBuffer(target);
4680 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004681 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004682}
4683
Corentin Wallez336129f2017-10-17 15:55:40 -04004684void Context::bufferSubData(BufferBinding target,
4685 GLintptr offset,
4686 GLsizeiptr size,
4687 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004688{
4689 if (data == nullptr)
4690 {
4691 return;
4692 }
4693
4694 Buffer *buffer = mGLState.getTargetBuffer(target);
4695 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004696 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004697}
4698
Jamie Madillef300b12016-10-07 15:12:09 -04004699void Context::attachShader(GLuint program, GLuint shader)
4700{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004701 Program *programObject = mState.mShaderPrograms->getProgram(program);
4702 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004703 ASSERT(programObject && shaderObject);
4704 programObject->attachShader(shaderObject);
4705}
4706
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004707const Workarounds &Context::getWorkarounds() const
4708{
4709 return mWorkarounds;
4710}
4711
Corentin Wallez336129f2017-10-17 15:55:40 -04004712void Context::copyBufferSubData(BufferBinding readTarget,
4713 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04004714 GLintptr readOffset,
4715 GLintptr writeOffset,
4716 GLsizeiptr size)
4717{
4718 // if size is zero, the copy is a successful no-op
4719 if (size == 0)
4720 {
4721 return;
4722 }
4723
4724 // TODO(jmadill): cache these.
4725 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
4726 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4727
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004728 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004729}
4730
Jamie Madill01a80ee2016-11-07 12:06:18 -05004731void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4732{
4733 Program *programObject = getProgram(program);
4734 // TODO(jmadill): Re-use this from the validation if possible.
4735 ASSERT(programObject);
4736 programObject->bindAttributeLocation(index, name);
4737}
4738
Corentin Wallez336129f2017-10-17 15:55:40 -04004739void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004740{
Corentin Wallez336129f2017-10-17 15:55:40 -04004741 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4742 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004743}
4744
Corentin Wallez336129f2017-10-17 15:55:40 -04004745void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08004746{
4747 bindBufferRange(target, index, buffer, 0, 0);
4748}
4749
Corentin Wallez336129f2017-10-17 15:55:40 -04004750void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08004751 GLuint index,
4752 GLuint buffer,
4753 GLintptr offset,
4754 GLsizeiptr size)
4755{
Corentin Wallez336129f2017-10-17 15:55:40 -04004756 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4757 mGLState.setIndexedBufferBinding(this, target, index, bufferObject, offset, size);
Jiajia Qin6eafb042016-12-27 17:04:07 +08004758}
4759
Jamie Madill01a80ee2016-11-07 12:06:18 -05004760void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4761{
4762 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4763 {
4764 bindReadFramebuffer(framebuffer);
4765 }
4766
4767 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4768 {
4769 bindDrawFramebuffer(framebuffer);
4770 }
4771}
4772
4773void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4774{
4775 ASSERT(target == GL_RENDERBUFFER);
4776 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004777 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004778 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004779}
4780
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004781void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08004782 GLsizei samples,
4783 GLenum internalformat,
4784 GLsizei width,
4785 GLsizei height,
4786 GLboolean fixedsamplelocations)
4787{
4788 Extents size(width, height, 1);
4789 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004790 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
4791 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004792}
4793
4794void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
4795{
JiangYizhou5b03f472017-01-09 10:22:53 +08004796 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
4797 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05004798 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08004799 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08004800
4801 switch (pname)
4802 {
4803 case GL_SAMPLE_POSITION:
4804 handleError(framebuffer->getSamplePosition(index, val));
4805 break;
4806 default:
4807 UNREACHABLE();
4808 }
4809}
4810
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07004811void Context::getMultisamplefvRobust(GLenum pname,
4812 GLuint index,
4813 GLsizei bufSize,
4814 GLsizei *length,
4815 GLfloat *val)
4816{
4817 UNIMPLEMENTED();
4818}
4819
Jamie Madille8fb6402017-02-14 17:56:40 -05004820void Context::renderbufferStorage(GLenum target,
4821 GLenum internalformat,
4822 GLsizei width,
4823 GLsizei height)
4824{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004825 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4826 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
4827
Jamie Madille8fb6402017-02-14 17:56:40 -05004828 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04004829 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004830}
4831
4832void Context::renderbufferStorageMultisample(GLenum target,
4833 GLsizei samples,
4834 GLenum internalformat,
4835 GLsizei width,
4836 GLsizei height)
4837{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004838 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4839 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05004840
4841 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004842 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04004843 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004844}
4845
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004846void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
4847{
Jamie Madill70b5bb02017-08-28 13:32:37 -04004848 const Sync *syncObject = getSync(sync);
Geoff Lang82483b92017-04-11 15:33:00 -04004849 handleError(QuerySynciv(syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004850}
4851
JiangYizhoue18e6392017-02-20 10:32:23 +08004852void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
4853{
4854 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4855 QueryFramebufferParameteriv(framebuffer, pname, params);
4856}
4857
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07004858void Context::getFramebufferParameterivRobust(GLenum target,
4859 GLenum pname,
4860 GLsizei bufSize,
4861 GLsizei *length,
4862 GLint *params)
4863{
4864 UNIMPLEMENTED();
4865}
4866
Jiajia Qin5451d532017-11-16 17:16:34 +08004867void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08004868{
4869 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4870 SetFramebufferParameteri(framebuffer, pname, param);
4871}
4872
Jamie Madillb3f26b92017-07-19 15:07:41 -04004873Error Context::getScratchBuffer(size_t requstedSizeBytes,
4874 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05004875{
Jamie Madillb3f26b92017-07-19 15:07:41 -04004876 if (!mScratchBuffer.get(requstedSizeBytes, scratchBufferOut))
4877 {
4878 return OutOfMemory() << "Failed to allocate internal buffer.";
4879 }
4880 return NoError();
4881}
4882
4883Error Context::getZeroFilledBuffer(size_t requstedSizeBytes,
4884 angle::MemoryBuffer **zeroBufferOut) const
4885{
4886 if (!mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0))
Jamie Madille14951e2017-03-09 18:55:16 -05004887 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004888 return OutOfMemory() << "Failed to allocate internal buffer.";
Jamie Madille14951e2017-03-09 18:55:16 -05004889 }
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004890 return NoError();
Jamie Madille14951e2017-03-09 18:55:16 -05004891}
4892
Xinghua Cao10a4d432017-11-28 14:46:26 +08004893Error Context::prepareForDispatch()
4894{
Geoff Langa8cb2872018-03-09 16:09:40 -05004895 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08004896
4897 if (isRobustResourceInitEnabled())
4898 {
4899 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
4900 }
4901
4902 return NoError();
4903}
4904
Xinghua Cao2b396592017-03-29 15:36:04 +08004905void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
4906{
4907 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
4908 {
4909 return;
4910 }
4911
Xinghua Cao10a4d432017-11-28 14:46:26 +08004912 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04004913 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08004914}
4915
Jiajia Qin5451d532017-11-16 17:16:34 +08004916void Context::dispatchComputeIndirect(GLintptr indirect)
4917{
Qin Jiajia62fcf622017-11-30 16:16:12 +08004918 ANGLE_CONTEXT_TRY(prepareForDispatch());
4919 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08004920}
4921
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004922void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08004923 GLsizei levels,
4924 GLenum internalFormat,
4925 GLsizei width,
4926 GLsizei height)
4927{
4928 Extents size(width, height, 1);
4929 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004930 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08004931}
4932
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004933void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08004934 GLsizei levels,
4935 GLenum internalFormat,
4936 GLsizei width,
4937 GLsizei height,
4938 GLsizei depth)
4939{
4940 Extents size(width, height, depth);
4941 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004942 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08004943}
4944
Jiajia Qin5451d532017-11-16 17:16:34 +08004945void Context::memoryBarrier(GLbitfield barriers)
4946{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004947 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004948}
4949
4950void Context::memoryBarrierByRegion(GLbitfield barriers)
4951{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004952 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004953}
4954
Jamie Madillc1d770e2017-04-13 17:31:24 -04004955GLenum Context::checkFramebufferStatus(GLenum target)
4956{
4957 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4958 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04004959 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004960}
4961
4962void Context::compileShader(GLuint shader)
4963{
4964 Shader *shaderObject = GetValidShader(this, shader);
4965 if (!shaderObject)
4966 {
4967 return;
4968 }
4969 shaderObject->compile(this);
4970}
4971
4972void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
4973{
4974 for (int i = 0; i < n; i++)
4975 {
4976 deleteBuffer(buffers[i]);
4977 }
4978}
4979
4980void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
4981{
4982 for (int i = 0; i < n; i++)
4983 {
4984 if (framebuffers[i] != 0)
4985 {
4986 deleteFramebuffer(framebuffers[i]);
4987 }
4988 }
4989}
4990
4991void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
4992{
4993 for (int i = 0; i < n; i++)
4994 {
4995 deleteRenderbuffer(renderbuffers[i]);
4996 }
4997}
4998
4999void Context::deleteTextures(GLsizei n, const GLuint *textures)
5000{
5001 for (int i = 0; i < n; i++)
5002 {
5003 if (textures[i] != 0)
5004 {
5005 deleteTexture(textures[i]);
5006 }
5007 }
5008}
5009
5010void Context::detachShader(GLuint program, GLuint shader)
5011{
5012 Program *programObject = getProgram(program);
5013 ASSERT(programObject);
5014
5015 Shader *shaderObject = getShader(shader);
5016 ASSERT(shaderObject);
5017
5018 programObject->detachShader(this, shaderObject);
5019}
5020
5021void Context::genBuffers(GLsizei n, GLuint *buffers)
5022{
5023 for (int i = 0; i < n; i++)
5024 {
5025 buffers[i] = createBuffer();
5026 }
5027}
5028
5029void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5030{
5031 for (int i = 0; i < n; i++)
5032 {
5033 framebuffers[i] = createFramebuffer();
5034 }
5035}
5036
5037void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5038{
5039 for (int i = 0; i < n; i++)
5040 {
5041 renderbuffers[i] = createRenderbuffer();
5042 }
5043}
5044
5045void Context::genTextures(GLsizei n, GLuint *textures)
5046{
5047 for (int i = 0; i < n; i++)
5048 {
5049 textures[i] = createTexture();
5050 }
5051}
5052
5053void Context::getActiveAttrib(GLuint program,
5054 GLuint index,
5055 GLsizei bufsize,
5056 GLsizei *length,
5057 GLint *size,
5058 GLenum *type,
5059 GLchar *name)
5060{
5061 Program *programObject = getProgram(program);
5062 ASSERT(programObject);
5063 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5064}
5065
5066void Context::getActiveUniform(GLuint program,
5067 GLuint index,
5068 GLsizei bufsize,
5069 GLsizei *length,
5070 GLint *size,
5071 GLenum *type,
5072 GLchar *name)
5073{
5074 Program *programObject = getProgram(program);
5075 ASSERT(programObject);
5076 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5077}
5078
5079void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5080{
5081 Program *programObject = getProgram(program);
5082 ASSERT(programObject);
5083 programObject->getAttachedShaders(maxcount, count, shaders);
5084}
5085
5086GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5087{
5088 Program *programObject = getProgram(program);
5089 ASSERT(programObject);
5090 return programObject->getAttributeLocation(name);
5091}
5092
5093void Context::getBooleanv(GLenum pname, GLboolean *params)
5094{
5095 GLenum nativeType;
5096 unsigned int numParams = 0;
5097 getQueryParameterInfo(pname, &nativeType, &numParams);
5098
5099 if (nativeType == GL_BOOL)
5100 {
5101 getBooleanvImpl(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::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5110{
5111 getBooleanv(pname, params);
5112}
5113
Jamie Madillc1d770e2017-04-13 17:31:24 -04005114void Context::getFloatv(GLenum pname, GLfloat *params)
5115{
5116 GLenum nativeType;
5117 unsigned int numParams = 0;
5118 getQueryParameterInfo(pname, &nativeType, &numParams);
5119
5120 if (nativeType == GL_FLOAT)
5121 {
5122 getFloatvImpl(pname, params);
5123 }
5124 else
5125 {
5126 CastStateValues(this, nativeType, pname, numParams, params);
5127 }
5128}
5129
Brandon Jones59770802018-04-02 13:18:42 -07005130void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5131{
5132 getFloatv(pname, params);
5133}
5134
Jamie Madillc1d770e2017-04-13 17:31:24 -04005135void Context::getIntegerv(GLenum pname, GLint *params)
5136{
5137 GLenum nativeType;
5138 unsigned int numParams = 0;
5139 getQueryParameterInfo(pname, &nativeType, &numParams);
5140
5141 if (nativeType == GL_INT)
5142 {
5143 getIntegervImpl(pname, params);
5144 }
5145 else
5146 {
5147 CastStateValues(this, nativeType, pname, numParams, params);
5148 }
5149}
5150
Brandon Jones59770802018-04-02 13:18:42 -07005151void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5152{
5153 getIntegerv(pname, data);
5154}
5155
Jamie Madillc1d770e2017-04-13 17:31:24 -04005156void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5157{
5158 Program *programObject = getProgram(program);
5159 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005160 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005161}
5162
Brandon Jones59770802018-04-02 13:18:42 -07005163void Context::getProgramivRobust(GLuint program,
5164 GLenum pname,
5165 GLsizei bufSize,
5166 GLsizei *length,
5167 GLint *params)
5168{
5169 getProgramiv(program, pname, params);
5170}
5171
Jiajia Qin5451d532017-11-16 17:16:34 +08005172void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5173{
5174 UNIMPLEMENTED();
5175}
5176
Jamie Madillbe849e42017-05-02 15:49:00 -04005177void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005178{
5179 Program *programObject = getProgram(program);
5180 ASSERT(programObject);
5181 programObject->getInfoLog(bufsize, length, infolog);
5182}
5183
Jiajia Qin5451d532017-11-16 17:16:34 +08005184void Context::getProgramPipelineInfoLog(GLuint pipeline,
5185 GLsizei bufSize,
5186 GLsizei *length,
5187 GLchar *infoLog)
5188{
5189 UNIMPLEMENTED();
5190}
5191
Jamie Madillc1d770e2017-04-13 17:31:24 -04005192void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5193{
5194 Shader *shaderObject = getShader(shader);
5195 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04005196 QueryShaderiv(this, shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005197}
5198
Brandon Jones59770802018-04-02 13:18:42 -07005199void Context::getShaderivRobust(GLuint shader,
5200 GLenum pname,
5201 GLsizei bufSize,
5202 GLsizei *length,
5203 GLint *params)
5204{
5205 getShaderiv(shader, pname, params);
5206}
5207
Jamie Madillc1d770e2017-04-13 17:31:24 -04005208void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5209{
5210 Shader *shaderObject = getShader(shader);
5211 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04005212 shaderObject->getInfoLog(this, bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005213}
5214
5215void Context::getShaderPrecisionFormat(GLenum shadertype,
5216 GLenum precisiontype,
5217 GLint *range,
5218 GLint *precision)
5219{
5220 // TODO(jmadill): Compute shaders.
5221
5222 switch (shadertype)
5223 {
5224 case GL_VERTEX_SHADER:
5225 switch (precisiontype)
5226 {
5227 case GL_LOW_FLOAT:
5228 mCaps.vertexLowpFloat.get(range, precision);
5229 break;
5230 case GL_MEDIUM_FLOAT:
5231 mCaps.vertexMediumpFloat.get(range, precision);
5232 break;
5233 case GL_HIGH_FLOAT:
5234 mCaps.vertexHighpFloat.get(range, precision);
5235 break;
5236
5237 case GL_LOW_INT:
5238 mCaps.vertexLowpInt.get(range, precision);
5239 break;
5240 case GL_MEDIUM_INT:
5241 mCaps.vertexMediumpInt.get(range, precision);
5242 break;
5243 case GL_HIGH_INT:
5244 mCaps.vertexHighpInt.get(range, precision);
5245 break;
5246
5247 default:
5248 UNREACHABLE();
5249 return;
5250 }
5251 break;
5252
5253 case GL_FRAGMENT_SHADER:
5254 switch (precisiontype)
5255 {
5256 case GL_LOW_FLOAT:
5257 mCaps.fragmentLowpFloat.get(range, precision);
5258 break;
5259 case GL_MEDIUM_FLOAT:
5260 mCaps.fragmentMediumpFloat.get(range, precision);
5261 break;
5262 case GL_HIGH_FLOAT:
5263 mCaps.fragmentHighpFloat.get(range, precision);
5264 break;
5265
5266 case GL_LOW_INT:
5267 mCaps.fragmentLowpInt.get(range, precision);
5268 break;
5269 case GL_MEDIUM_INT:
5270 mCaps.fragmentMediumpInt.get(range, precision);
5271 break;
5272 case GL_HIGH_INT:
5273 mCaps.fragmentHighpInt.get(range, precision);
5274 break;
5275
5276 default:
5277 UNREACHABLE();
5278 return;
5279 }
5280 break;
5281
5282 default:
5283 UNREACHABLE();
5284 return;
5285 }
5286}
5287
5288void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5289{
5290 Shader *shaderObject = getShader(shader);
5291 ASSERT(shaderObject);
5292 shaderObject->getSource(bufsize, length, source);
5293}
5294
5295void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5296{
5297 Program *programObject = getProgram(program);
5298 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005299 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005300}
5301
Brandon Jones59770802018-04-02 13:18:42 -07005302void Context::getUniformfvRobust(GLuint program,
5303 GLint location,
5304 GLsizei bufSize,
5305 GLsizei *length,
5306 GLfloat *params)
5307{
5308 getUniformfv(program, location, params);
5309}
5310
Jamie Madillc1d770e2017-04-13 17:31:24 -04005311void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5312{
5313 Program *programObject = getProgram(program);
5314 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005315 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005316}
5317
Brandon Jones59770802018-04-02 13:18:42 -07005318void Context::getUniformivRobust(GLuint program,
5319 GLint location,
5320 GLsizei bufSize,
5321 GLsizei *length,
5322 GLint *params)
5323{
5324 getUniformiv(program, location, params);
5325}
5326
Jamie Madillc1d770e2017-04-13 17:31:24 -04005327GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5328{
5329 Program *programObject = getProgram(program);
5330 ASSERT(programObject);
5331 return programObject->getUniformLocation(name);
5332}
5333
5334GLboolean Context::isBuffer(GLuint buffer)
5335{
5336 if (buffer == 0)
5337 {
5338 return GL_FALSE;
5339 }
5340
5341 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5342}
5343
5344GLboolean Context::isEnabled(GLenum cap)
5345{
5346 return mGLState.getEnableFeature(cap);
5347}
5348
5349GLboolean Context::isFramebuffer(GLuint framebuffer)
5350{
5351 if (framebuffer == 0)
5352 {
5353 return GL_FALSE;
5354 }
5355
5356 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5357}
5358
5359GLboolean Context::isProgram(GLuint program)
5360{
5361 if (program == 0)
5362 {
5363 return GL_FALSE;
5364 }
5365
5366 return (getProgram(program) ? GL_TRUE : GL_FALSE);
5367}
5368
5369GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5370{
5371 if (renderbuffer == 0)
5372 {
5373 return GL_FALSE;
5374 }
5375
5376 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5377}
5378
5379GLboolean Context::isShader(GLuint shader)
5380{
5381 if (shader == 0)
5382 {
5383 return GL_FALSE;
5384 }
5385
5386 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5387}
5388
5389GLboolean Context::isTexture(GLuint texture)
5390{
5391 if (texture == 0)
5392 {
5393 return GL_FALSE;
5394 }
5395
5396 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5397}
5398
5399void Context::linkProgram(GLuint program)
5400{
5401 Program *programObject = getProgram(program);
5402 ASSERT(programObject);
5403 handleError(programObject->link(this));
Martin Radev0abb7a22017-08-28 15:34:45 +03005404 mGLState.onProgramExecutableChange(programObject);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005405}
5406
5407void Context::releaseShaderCompiler()
5408{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005409 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005410}
5411
5412void Context::shaderBinary(GLsizei n,
5413 const GLuint *shaders,
5414 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005415 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005416 GLsizei length)
5417{
5418 // No binary shader formats are supported.
5419 UNIMPLEMENTED();
5420}
5421
5422void Context::shaderSource(GLuint shader,
5423 GLsizei count,
5424 const GLchar *const *string,
5425 const GLint *length)
5426{
5427 Shader *shaderObject = getShader(shader);
5428 ASSERT(shaderObject);
5429 shaderObject->setSource(count, string, length);
5430}
5431
5432void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5433{
5434 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5435}
5436
5437void Context::stencilMask(GLuint mask)
5438{
5439 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5440}
5441
5442void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5443{
5444 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5445}
5446
5447void Context::uniform1f(GLint location, GLfloat x)
5448{
5449 Program *program = mGLState.getProgram();
5450 program->setUniform1fv(location, 1, &x);
5451}
5452
5453void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5454{
5455 Program *program = mGLState.getProgram();
5456 program->setUniform1fv(location, count, v);
5457}
5458
5459void Context::uniform1i(GLint location, GLint x)
5460{
5461 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04005462 if (program->setUniform1iv(location, 1, &x) == Program::SetUniformResult::SamplerChanged)
5463 {
5464 mGLState.setObjectDirty(GL_PROGRAM);
5465 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005466}
5467
5468void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5469{
5470 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04005471 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
5472 {
5473 mGLState.setObjectDirty(GL_PROGRAM);
5474 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005475}
5476
5477void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5478{
5479 GLfloat xy[2] = {x, y};
5480 Program *program = mGLState.getProgram();
5481 program->setUniform2fv(location, 1, xy);
5482}
5483
5484void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5485{
5486 Program *program = mGLState.getProgram();
5487 program->setUniform2fv(location, count, v);
5488}
5489
5490void Context::uniform2i(GLint location, GLint x, GLint y)
5491{
5492 GLint xy[2] = {x, y};
5493 Program *program = mGLState.getProgram();
5494 program->setUniform2iv(location, 1, xy);
5495}
5496
5497void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5498{
5499 Program *program = mGLState.getProgram();
5500 program->setUniform2iv(location, count, v);
5501}
5502
5503void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5504{
5505 GLfloat xyz[3] = {x, y, z};
5506 Program *program = mGLState.getProgram();
5507 program->setUniform3fv(location, 1, xyz);
5508}
5509
5510void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5511{
5512 Program *program = mGLState.getProgram();
5513 program->setUniform3fv(location, count, v);
5514}
5515
5516void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5517{
5518 GLint xyz[3] = {x, y, z};
5519 Program *program = mGLState.getProgram();
5520 program->setUniform3iv(location, 1, xyz);
5521}
5522
5523void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5524{
5525 Program *program = mGLState.getProgram();
5526 program->setUniform3iv(location, count, v);
5527}
5528
5529void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5530{
5531 GLfloat xyzw[4] = {x, y, z, w};
5532 Program *program = mGLState.getProgram();
5533 program->setUniform4fv(location, 1, xyzw);
5534}
5535
5536void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5537{
5538 Program *program = mGLState.getProgram();
5539 program->setUniform4fv(location, count, v);
5540}
5541
5542void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5543{
5544 GLint xyzw[4] = {x, y, z, w};
5545 Program *program = mGLState.getProgram();
5546 program->setUniform4iv(location, 1, xyzw);
5547}
5548
5549void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5550{
5551 Program *program = mGLState.getProgram();
5552 program->setUniform4iv(location, count, v);
5553}
5554
5555void Context::uniformMatrix2fv(GLint location,
5556 GLsizei count,
5557 GLboolean transpose,
5558 const GLfloat *value)
5559{
5560 Program *program = mGLState.getProgram();
5561 program->setUniformMatrix2fv(location, count, transpose, value);
5562}
5563
5564void Context::uniformMatrix3fv(GLint location,
5565 GLsizei count,
5566 GLboolean transpose,
5567 const GLfloat *value)
5568{
5569 Program *program = mGLState.getProgram();
5570 program->setUniformMatrix3fv(location, count, transpose, value);
5571}
5572
5573void Context::uniformMatrix4fv(GLint location,
5574 GLsizei count,
5575 GLboolean transpose,
5576 const GLfloat *value)
5577{
5578 Program *program = mGLState.getProgram();
5579 program->setUniformMatrix4fv(location, count, transpose, value);
5580}
5581
5582void Context::validateProgram(GLuint program)
5583{
5584 Program *programObject = getProgram(program);
5585 ASSERT(programObject);
5586 programObject->validate(mCaps);
5587}
5588
Jiajia Qin5451d532017-11-16 17:16:34 +08005589void Context::validateProgramPipeline(GLuint pipeline)
5590{
5591 UNIMPLEMENTED();
5592}
5593
Jamie Madilld04908b2017-06-09 14:15:35 -04005594void Context::getProgramBinary(GLuint program,
5595 GLsizei bufSize,
5596 GLsizei *length,
5597 GLenum *binaryFormat,
5598 void *binary)
5599{
5600 Program *programObject = getProgram(program);
5601 ASSERT(programObject != nullptr);
5602
5603 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
5604}
5605
5606void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
5607{
5608 Program *programObject = getProgram(program);
5609 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04005610
Jamie Madilld04908b2017-06-09 14:15:35 -04005611 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
5612}
5613
Jamie Madillff325f12017-08-26 15:06:05 -04005614void Context::uniform1ui(GLint location, GLuint v0)
5615{
5616 Program *program = mGLState.getProgram();
5617 program->setUniform1uiv(location, 1, &v0);
5618}
5619
5620void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
5621{
5622 Program *program = mGLState.getProgram();
5623 const GLuint xy[] = {v0, v1};
5624 program->setUniform2uiv(location, 1, xy);
5625}
5626
5627void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
5628{
5629 Program *program = mGLState.getProgram();
5630 const GLuint xyz[] = {v0, v1, v2};
5631 program->setUniform3uiv(location, 1, xyz);
5632}
5633
5634void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
5635{
5636 Program *program = mGLState.getProgram();
5637 const GLuint xyzw[] = {v0, v1, v2, v3};
5638 program->setUniform4uiv(location, 1, xyzw);
5639}
5640
5641void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
5642{
5643 Program *program = mGLState.getProgram();
5644 program->setUniform1uiv(location, count, value);
5645}
5646void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
5647{
5648 Program *program = mGLState.getProgram();
5649 program->setUniform2uiv(location, count, value);
5650}
5651
5652void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
5653{
5654 Program *program = mGLState.getProgram();
5655 program->setUniform3uiv(location, count, value);
5656}
5657
5658void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
5659{
5660 Program *program = mGLState.getProgram();
5661 program->setUniform4uiv(location, count, value);
5662}
5663
Jamie Madillf0e04492017-08-26 15:28:42 -04005664void Context::genQueries(GLsizei n, GLuint *ids)
5665{
5666 for (GLsizei i = 0; i < n; i++)
5667 {
5668 GLuint handle = mQueryHandleAllocator.allocate();
5669 mQueryMap.assign(handle, nullptr);
5670 ids[i] = handle;
5671 }
5672}
5673
5674void Context::deleteQueries(GLsizei n, const GLuint *ids)
5675{
5676 for (int i = 0; i < n; i++)
5677 {
5678 GLuint query = ids[i];
5679
5680 Query *queryObject = nullptr;
5681 if (mQueryMap.erase(query, &queryObject))
5682 {
5683 mQueryHandleAllocator.release(query);
5684 if (queryObject)
5685 {
5686 queryObject->release(this);
5687 }
5688 }
5689 }
5690}
5691
5692GLboolean Context::isQuery(GLuint id)
5693{
Corentin Wallezad3ae902018-03-09 13:40:42 -05005694 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04005695}
5696
Jamie Madillc8c95812017-08-26 18:40:09 -04005697void Context::uniformMatrix2x3fv(GLint location,
5698 GLsizei count,
5699 GLboolean transpose,
5700 const GLfloat *value)
5701{
5702 Program *program = mGLState.getProgram();
5703 program->setUniformMatrix2x3fv(location, count, transpose, value);
5704}
5705
5706void Context::uniformMatrix3x2fv(GLint location,
5707 GLsizei count,
5708 GLboolean transpose,
5709 const GLfloat *value)
5710{
5711 Program *program = mGLState.getProgram();
5712 program->setUniformMatrix3x2fv(location, count, transpose, value);
5713}
5714
5715void Context::uniformMatrix2x4fv(GLint location,
5716 GLsizei count,
5717 GLboolean transpose,
5718 const GLfloat *value)
5719{
5720 Program *program = mGLState.getProgram();
5721 program->setUniformMatrix2x4fv(location, count, transpose, value);
5722}
5723
5724void Context::uniformMatrix4x2fv(GLint location,
5725 GLsizei count,
5726 GLboolean transpose,
5727 const GLfloat *value)
5728{
5729 Program *program = mGLState.getProgram();
5730 program->setUniformMatrix4x2fv(location, count, transpose, value);
5731}
5732
5733void Context::uniformMatrix3x4fv(GLint location,
5734 GLsizei count,
5735 GLboolean transpose,
5736 const GLfloat *value)
5737{
5738 Program *program = mGLState.getProgram();
5739 program->setUniformMatrix3x4fv(location, count, transpose, value);
5740}
5741
5742void Context::uniformMatrix4x3fv(GLint location,
5743 GLsizei count,
5744 GLboolean transpose,
5745 const GLfloat *value)
5746{
5747 Program *program = mGLState.getProgram();
5748 program->setUniformMatrix4x3fv(location, count, transpose, value);
5749}
5750
Jamie Madilld7576732017-08-26 18:49:50 -04005751void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
5752{
5753 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5754 {
5755 GLuint vertexArray = arrays[arrayIndex];
5756
5757 if (arrays[arrayIndex] != 0)
5758 {
5759 VertexArray *vertexArrayObject = nullptr;
5760 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
5761 {
5762 if (vertexArrayObject != nullptr)
5763 {
5764 detachVertexArray(vertexArray);
5765 vertexArrayObject->onDestroy(this);
5766 }
5767
5768 mVertexArrayHandleAllocator.release(vertexArray);
5769 }
5770 }
5771 }
5772}
5773
5774void Context::genVertexArrays(GLsizei n, GLuint *arrays)
5775{
5776 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5777 {
5778 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
5779 mVertexArrayMap.assign(vertexArray, nullptr);
5780 arrays[arrayIndex] = vertexArray;
5781 }
5782}
5783
5784bool Context::isVertexArray(GLuint array)
5785{
5786 if (array == 0)
5787 {
5788 return GL_FALSE;
5789 }
5790
5791 VertexArray *vao = getVertexArray(array);
5792 return (vao != nullptr ? GL_TRUE : GL_FALSE);
5793}
5794
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04005795void Context::endTransformFeedback()
5796{
5797 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5798 transformFeedback->end(this);
5799}
5800
5801void Context::transformFeedbackVaryings(GLuint program,
5802 GLsizei count,
5803 const GLchar *const *varyings,
5804 GLenum bufferMode)
5805{
5806 Program *programObject = getProgram(program);
5807 ASSERT(programObject);
5808 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
5809}
5810
5811void Context::getTransformFeedbackVarying(GLuint program,
5812 GLuint index,
5813 GLsizei bufSize,
5814 GLsizei *length,
5815 GLsizei *size,
5816 GLenum *type,
5817 GLchar *name)
5818{
5819 Program *programObject = getProgram(program);
5820 ASSERT(programObject);
5821 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
5822}
5823
5824void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
5825{
5826 for (int i = 0; i < n; i++)
5827 {
5828 GLuint transformFeedback = ids[i];
5829 if (transformFeedback == 0)
5830 {
5831 continue;
5832 }
5833
5834 TransformFeedback *transformFeedbackObject = nullptr;
5835 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
5836 {
5837 if (transformFeedbackObject != nullptr)
5838 {
5839 detachTransformFeedback(transformFeedback);
5840 transformFeedbackObject->release(this);
5841 }
5842
5843 mTransformFeedbackHandleAllocator.release(transformFeedback);
5844 }
5845 }
5846}
5847
5848void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
5849{
5850 for (int i = 0; i < n; i++)
5851 {
5852 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
5853 mTransformFeedbackMap.assign(transformFeedback, nullptr);
5854 ids[i] = transformFeedback;
5855 }
5856}
5857
5858bool Context::isTransformFeedback(GLuint id)
5859{
5860 if (id == 0)
5861 {
5862 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
5863 // returns FALSE
5864 return GL_FALSE;
5865 }
5866
5867 const TransformFeedback *transformFeedback = getTransformFeedback(id);
5868 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
5869}
5870
5871void Context::pauseTransformFeedback()
5872{
5873 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5874 transformFeedback->pause();
5875}
5876
5877void Context::resumeTransformFeedback()
5878{
5879 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5880 transformFeedback->resume();
5881}
5882
Jamie Madill12e957f2017-08-26 21:42:26 -04005883void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
5884{
5885 const Program *programObject = getProgram(program);
Jamie Madill54164b02017-08-28 15:17:37 -04005886 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04005887}
5888
Brandon Jones59770802018-04-02 13:18:42 -07005889void Context::getUniformuivRobust(GLuint program,
5890 GLint location,
5891 GLsizei bufSize,
5892 GLsizei *length,
5893 GLuint *params)
5894{
5895 getUniformuiv(program, location, params);
5896}
5897
Jamie Madill12e957f2017-08-26 21:42:26 -04005898GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
5899{
5900 const Program *programObject = getProgram(program);
5901 return programObject->getFragDataLocation(name);
5902}
5903
5904void Context::getUniformIndices(GLuint program,
5905 GLsizei uniformCount,
5906 const GLchar *const *uniformNames,
5907 GLuint *uniformIndices)
5908{
5909 const Program *programObject = getProgram(program);
5910 if (!programObject->isLinked())
5911 {
5912 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5913 {
5914 uniformIndices[uniformId] = GL_INVALID_INDEX;
5915 }
5916 }
5917 else
5918 {
5919 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5920 {
5921 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
5922 }
5923 }
5924}
5925
5926void Context::getActiveUniformsiv(GLuint program,
5927 GLsizei uniformCount,
5928 const GLuint *uniformIndices,
5929 GLenum pname,
5930 GLint *params)
5931{
5932 const Program *programObject = getProgram(program);
5933 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5934 {
5935 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08005936 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04005937 }
5938}
5939
5940GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
5941{
5942 const Program *programObject = getProgram(program);
5943 return programObject->getUniformBlockIndex(uniformBlockName);
5944}
5945
5946void Context::getActiveUniformBlockiv(GLuint program,
5947 GLuint uniformBlockIndex,
5948 GLenum pname,
5949 GLint *params)
5950{
5951 const Program *programObject = getProgram(program);
5952 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
5953}
5954
Brandon Jones59770802018-04-02 13:18:42 -07005955void Context::getActiveUniformBlockivRobust(GLuint program,
5956 GLuint uniformBlockIndex,
5957 GLenum pname,
5958 GLsizei bufSize,
5959 GLsizei *length,
5960 GLint *params)
5961{
5962 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
5963}
5964
Jamie Madill12e957f2017-08-26 21:42:26 -04005965void Context::getActiveUniformBlockName(GLuint program,
5966 GLuint uniformBlockIndex,
5967 GLsizei bufSize,
5968 GLsizei *length,
5969 GLchar *uniformBlockName)
5970{
5971 const Program *programObject = getProgram(program);
5972 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
5973}
5974
5975void Context::uniformBlockBinding(GLuint program,
5976 GLuint uniformBlockIndex,
5977 GLuint uniformBlockBinding)
5978{
5979 Program *programObject = getProgram(program);
5980 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
5981}
5982
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005983GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
5984{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005985 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
5986 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005987
Jamie Madill70b5bb02017-08-28 13:32:37 -04005988 Sync *syncObject = getSync(syncHandle);
5989 Error error = syncObject->set(condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005990 if (error.isError())
5991 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04005992 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005993 handleError(error);
5994 return nullptr;
5995 }
5996
Jamie Madill70b5bb02017-08-28 13:32:37 -04005997 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005998}
5999
6000GLboolean Context::isSync(GLsync sync)
6001{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006002 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006003}
6004
6005GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6006{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006007 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006008
6009 GLenum result = GL_WAIT_FAILED;
6010 handleError(syncObject->clientWait(flags, timeout, &result));
6011 return result;
6012}
6013
6014void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6015{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006016 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006017 handleError(syncObject->serverWait(flags, timeout));
6018}
6019
6020void Context::getInteger64v(GLenum pname, GLint64 *params)
6021{
6022 GLenum nativeType = GL_NONE;
6023 unsigned int numParams = 0;
6024 getQueryParameterInfo(pname, &nativeType, &numParams);
6025
6026 if (nativeType == GL_INT_64_ANGLEX)
6027 {
6028 getInteger64vImpl(pname, params);
6029 }
6030 else
6031 {
6032 CastStateValues(this, nativeType, pname, numParams, params);
6033 }
6034}
6035
Brandon Jones59770802018-04-02 13:18:42 -07006036void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6037{
6038 getInteger64v(pname, data);
6039}
6040
Corentin Wallez336129f2017-10-17 15:55:40 -04006041void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006042{
6043 Buffer *buffer = mGLState.getTargetBuffer(target);
6044 QueryBufferParameteri64v(buffer, pname, params);
6045}
6046
Brandon Jones59770802018-04-02 13:18:42 -07006047void Context::getBufferParameteri64vRobust(BufferBinding target,
6048 GLenum pname,
6049 GLsizei bufSize,
6050 GLsizei *length,
6051 GLint64 *params)
6052{
6053 getBufferParameteri64v(target, pname, params);
6054}
6055
Jamie Madill3ef140a2017-08-26 23:11:21 -04006056void Context::genSamplers(GLsizei count, GLuint *samplers)
6057{
6058 for (int i = 0; i < count; i++)
6059 {
6060 samplers[i] = mState.mSamplers->createSampler();
6061 }
6062}
6063
6064void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6065{
6066 for (int i = 0; i < count; i++)
6067 {
6068 GLuint sampler = samplers[i];
6069
6070 if (mState.mSamplers->getSampler(sampler))
6071 {
6072 detachSampler(sampler);
6073 }
6074
6075 mState.mSamplers->deleteObject(this, sampler);
6076 }
6077}
6078
6079void Context::getInternalformativ(GLenum target,
6080 GLenum internalformat,
6081 GLenum pname,
6082 GLsizei bufSize,
6083 GLint *params)
6084{
6085 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6086 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6087}
6088
Brandon Jones59770802018-04-02 13:18:42 -07006089void Context::getInternalformativRobust(GLenum target,
6090 GLenum internalformat,
6091 GLenum pname,
6092 GLsizei bufSize,
6093 GLsizei *length,
6094 GLint *params)
6095{
6096 getInternalformativ(target, internalformat, pname, bufSize, params);
6097}
6098
Jiajia Qin5451d532017-11-16 17:16:34 +08006099void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6100{
6101 programUniform1iv(program, location, 1, &v0);
6102}
6103
6104void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6105{
6106 GLint xy[2] = {v0, v1};
6107 programUniform2iv(program, location, 1, xy);
6108}
6109
6110void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6111{
6112 GLint xyz[3] = {v0, v1, v2};
6113 programUniform3iv(program, location, 1, xyz);
6114}
6115
6116void Context::programUniform4i(GLuint program,
6117 GLint location,
6118 GLint v0,
6119 GLint v1,
6120 GLint v2,
6121 GLint v3)
6122{
6123 GLint xyzw[4] = {v0, v1, v2, v3};
6124 programUniform4iv(program, location, 1, xyzw);
6125}
6126
6127void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6128{
6129 programUniform1uiv(program, location, 1, &v0);
6130}
6131
6132void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6133{
6134 GLuint xy[2] = {v0, v1};
6135 programUniform2uiv(program, location, 1, xy);
6136}
6137
6138void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6139{
6140 GLuint xyz[3] = {v0, v1, v2};
6141 programUniform3uiv(program, location, 1, xyz);
6142}
6143
6144void Context::programUniform4ui(GLuint program,
6145 GLint location,
6146 GLuint v0,
6147 GLuint v1,
6148 GLuint v2,
6149 GLuint v3)
6150{
6151 GLuint xyzw[4] = {v0, v1, v2, v3};
6152 programUniform4uiv(program, location, 1, xyzw);
6153}
6154
6155void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6156{
6157 programUniform1fv(program, location, 1, &v0);
6158}
6159
6160void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6161{
6162 GLfloat xy[2] = {v0, v1};
6163 programUniform2fv(program, location, 1, xy);
6164}
6165
6166void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6167{
6168 GLfloat xyz[3] = {v0, v1, v2};
6169 programUniform3fv(program, location, 1, xyz);
6170}
6171
6172void Context::programUniform4f(GLuint program,
6173 GLint location,
6174 GLfloat v0,
6175 GLfloat v1,
6176 GLfloat v2,
6177 GLfloat v3)
6178{
6179 GLfloat xyzw[4] = {v0, v1, v2, v3};
6180 programUniform4fv(program, location, 1, xyzw);
6181}
6182
Jamie Madill81c2e252017-09-09 23:32:46 -04006183void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6184{
6185 Program *programObject = getProgram(program);
6186 ASSERT(programObject);
6187 if (programObject->setUniform1iv(location, count, value) ==
6188 Program::SetUniformResult::SamplerChanged)
6189 {
6190 mGLState.setObjectDirty(GL_PROGRAM);
6191 }
6192}
6193
Jiajia Qin5451d532017-11-16 17:16:34 +08006194void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6195{
6196 Program *programObject = getProgram(program);
6197 ASSERT(programObject);
6198 programObject->setUniform2iv(location, count, value);
6199}
6200
6201void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6202{
6203 Program *programObject = getProgram(program);
6204 ASSERT(programObject);
6205 programObject->setUniform3iv(location, count, value);
6206}
6207
6208void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6209{
6210 Program *programObject = getProgram(program);
6211 ASSERT(programObject);
6212 programObject->setUniform4iv(location, count, value);
6213}
6214
6215void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6216{
6217 Program *programObject = getProgram(program);
6218 ASSERT(programObject);
6219 programObject->setUniform1uiv(location, count, value);
6220}
6221
6222void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6223{
6224 Program *programObject = getProgram(program);
6225 ASSERT(programObject);
6226 programObject->setUniform2uiv(location, count, value);
6227}
6228
6229void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6230{
6231 Program *programObject = getProgram(program);
6232 ASSERT(programObject);
6233 programObject->setUniform3uiv(location, count, value);
6234}
6235
6236void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6237{
6238 Program *programObject = getProgram(program);
6239 ASSERT(programObject);
6240 programObject->setUniform4uiv(location, count, value);
6241}
6242
6243void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6244{
6245 Program *programObject = getProgram(program);
6246 ASSERT(programObject);
6247 programObject->setUniform1fv(location, count, value);
6248}
6249
6250void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6251{
6252 Program *programObject = getProgram(program);
6253 ASSERT(programObject);
6254 programObject->setUniform2fv(location, count, value);
6255}
6256
6257void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6258{
6259 Program *programObject = getProgram(program);
6260 ASSERT(programObject);
6261 programObject->setUniform3fv(location, count, value);
6262}
6263
6264void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6265{
6266 Program *programObject = getProgram(program);
6267 ASSERT(programObject);
6268 programObject->setUniform4fv(location, count, value);
6269}
6270
6271void Context::programUniformMatrix2fv(GLuint program,
6272 GLint location,
6273 GLsizei count,
6274 GLboolean transpose,
6275 const GLfloat *value)
6276{
6277 Program *programObject = getProgram(program);
6278 ASSERT(programObject);
6279 programObject->setUniformMatrix2fv(location, count, transpose, value);
6280}
6281
6282void Context::programUniformMatrix3fv(GLuint program,
6283 GLint location,
6284 GLsizei count,
6285 GLboolean transpose,
6286 const GLfloat *value)
6287{
6288 Program *programObject = getProgram(program);
6289 ASSERT(programObject);
6290 programObject->setUniformMatrix3fv(location, count, transpose, value);
6291}
6292
6293void Context::programUniformMatrix4fv(GLuint program,
6294 GLint location,
6295 GLsizei count,
6296 GLboolean transpose,
6297 const GLfloat *value)
6298{
6299 Program *programObject = getProgram(program);
6300 ASSERT(programObject);
6301 programObject->setUniformMatrix4fv(location, count, transpose, value);
6302}
6303
6304void Context::programUniformMatrix2x3fv(GLuint program,
6305 GLint location,
6306 GLsizei count,
6307 GLboolean transpose,
6308 const GLfloat *value)
6309{
6310 Program *programObject = getProgram(program);
6311 ASSERT(programObject);
6312 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6313}
6314
6315void Context::programUniformMatrix3x2fv(GLuint program,
6316 GLint location,
6317 GLsizei count,
6318 GLboolean transpose,
6319 const GLfloat *value)
6320{
6321 Program *programObject = getProgram(program);
6322 ASSERT(programObject);
6323 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6324}
6325
6326void Context::programUniformMatrix2x4fv(GLuint program,
6327 GLint location,
6328 GLsizei count,
6329 GLboolean transpose,
6330 const GLfloat *value)
6331{
6332 Program *programObject = getProgram(program);
6333 ASSERT(programObject);
6334 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6335}
6336
6337void Context::programUniformMatrix4x2fv(GLuint program,
6338 GLint location,
6339 GLsizei count,
6340 GLboolean transpose,
6341 const GLfloat *value)
6342{
6343 Program *programObject = getProgram(program);
6344 ASSERT(programObject);
6345 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6346}
6347
6348void Context::programUniformMatrix3x4fv(GLuint program,
6349 GLint location,
6350 GLsizei count,
6351 GLboolean transpose,
6352 const GLfloat *value)
6353{
6354 Program *programObject = getProgram(program);
6355 ASSERT(programObject);
6356 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6357}
6358
6359void Context::programUniformMatrix4x3fv(GLuint program,
6360 GLint location,
6361 GLsizei count,
6362 GLboolean transpose,
6363 const GLfloat *value)
6364{
6365 Program *programObject = getProgram(program);
6366 ASSERT(programObject);
6367 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6368}
6369
Jamie Madill81c2e252017-09-09 23:32:46 -04006370void Context::onTextureChange(const Texture *texture)
6371{
6372 // Conservatively assume all textures are dirty.
6373 // TODO(jmadill): More fine-grained update.
6374 mGLState.setObjectDirty(GL_TEXTURE);
6375}
6376
James Darpiniane8a93c62018-01-04 18:02:24 -08006377bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6378{
6379 return mGLState.isCurrentTransformFeedback(tf);
6380}
6381bool Context::isCurrentVertexArray(const VertexArray *va) const
6382{
6383 return mGLState.isCurrentVertexArray(va);
6384}
6385
Yunchao Hea336b902017-08-02 16:05:21 +08006386void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6387{
6388 for (int i = 0; i < count; i++)
6389 {
6390 pipelines[i] = createProgramPipeline();
6391 }
6392}
6393
6394void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6395{
6396 for (int i = 0; i < count; i++)
6397 {
6398 if (pipelines[i] != 0)
6399 {
6400 deleteProgramPipeline(pipelines[i]);
6401 }
6402 }
6403}
6404
6405GLboolean Context::isProgramPipeline(GLuint pipeline)
6406{
6407 if (pipeline == 0)
6408 {
6409 return GL_FALSE;
6410 }
6411
6412 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6413}
6414
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006415void Context::finishFenceNV(GLuint fence)
6416{
6417 FenceNV *fenceObject = getFenceNV(fence);
6418
6419 ASSERT(fenceObject && fenceObject->isSet());
6420 handleError(fenceObject->finish());
6421}
6422
6423void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6424{
6425 FenceNV *fenceObject = getFenceNV(fence);
6426
6427 ASSERT(fenceObject && fenceObject->isSet());
6428
6429 switch (pname)
6430 {
6431 case GL_FENCE_STATUS_NV:
6432 {
6433 // GL_NV_fence spec:
6434 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6435 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6436 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6437 GLboolean status = GL_TRUE;
6438 if (fenceObject->getStatus() != GL_TRUE)
6439 {
6440 ANGLE_CONTEXT_TRY(fenceObject->test(&status));
6441 }
6442 *params = status;
6443 break;
6444 }
6445
6446 case GL_FENCE_CONDITION_NV:
6447 {
6448 *params = static_cast<GLint>(fenceObject->getCondition());
6449 break;
6450 }
6451
6452 default:
6453 UNREACHABLE();
6454 }
6455}
6456
6457void Context::getTranslatedShaderSource(GLuint shader,
6458 GLsizei bufsize,
6459 GLsizei *length,
6460 GLchar *source)
6461{
6462 Shader *shaderObject = getShader(shader);
6463 ASSERT(shaderObject);
6464 shaderObject->getTranslatedSourceWithDebugInfo(this, bufsize, length, source);
6465}
6466
6467void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6468{
6469 Program *programObject = getProgram(program);
6470 ASSERT(programObject);
6471
6472 programObject->getUniformfv(this, location, params);
6473}
6474
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006475void Context::getnUniformfvRobust(GLuint program,
6476 GLint location,
6477 GLsizei bufSize,
6478 GLsizei *length,
6479 GLfloat *params)
6480{
6481 UNIMPLEMENTED();
6482}
6483
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006484void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6485{
6486 Program *programObject = getProgram(program);
6487 ASSERT(programObject);
6488
6489 programObject->getUniformiv(this, location, params);
6490}
6491
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006492void Context::getnUniformivRobust(GLuint program,
6493 GLint location,
6494 GLsizei bufSize,
6495 GLsizei *length,
6496 GLint *params)
6497{
6498 UNIMPLEMENTED();
6499}
6500
6501void Context::getnUniformuivRobust(GLuint program,
6502 GLint location,
6503 GLsizei bufSize,
6504 GLsizei *length,
6505 GLuint *params)
6506{
6507 UNIMPLEMENTED();
6508}
6509
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006510GLboolean Context::isFenceNV(GLuint fence)
6511{
6512 FenceNV *fenceObject = getFenceNV(fence);
6513
6514 if (fenceObject == nullptr)
6515 {
6516 return GL_FALSE;
6517 }
6518
6519 // GL_NV_fence spec:
6520 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6521 // existing fence.
6522 return fenceObject->isSet();
6523}
6524
6525void Context::readnPixels(GLint x,
6526 GLint y,
6527 GLsizei width,
6528 GLsizei height,
6529 GLenum format,
6530 GLenum type,
6531 GLsizei bufSize,
6532 void *data)
6533{
6534 return readPixels(x, y, width, height, format, type, data);
6535}
6536
Jamie Madill007530e2017-12-28 14:27:04 -05006537void Context::setFenceNV(GLuint fence, GLenum condition)
6538{
6539 ASSERT(condition == GL_ALL_COMPLETED_NV);
6540
6541 FenceNV *fenceObject = getFenceNV(fence);
6542 ASSERT(fenceObject != nullptr);
6543 handleError(fenceObject->set(condition));
6544}
6545
6546GLboolean Context::testFenceNV(GLuint fence)
6547{
6548 FenceNV *fenceObject = getFenceNV(fence);
6549
6550 ASSERT(fenceObject != nullptr);
6551 ASSERT(fenceObject->isSet() == GL_TRUE);
6552
6553 GLboolean result = GL_TRUE;
6554 Error error = fenceObject->test(&result);
6555 if (error.isError())
6556 {
6557 handleError(error);
6558 return GL_TRUE;
6559 }
6560
6561 return result;
6562}
6563
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006564void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006565{
6566 Texture *texture = getTargetTexture(target);
6567 egl::Image *imageObject = reinterpret_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05006568 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05006569}
6570
Jamie Madillfa920eb2018-01-04 11:45:50 -05006571void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05006572{
6573 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
6574 egl::Image *imageObject = reinterpret_cast<egl::Image *>(image);
6575 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
6576}
6577
Jamie Madillfa920eb2018-01-04 11:45:50 -05006578void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
6579{
6580 UNIMPLEMENTED();
6581}
6582
Jamie Madill5b772312018-03-08 20:28:32 -05006583bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
6584{
6585 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
6586 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
6587 // to the fact that it is stored internally as a float, and so would require conversion
6588 // if returned from Context::getIntegerv. Since this conversion is already implemented
6589 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
6590 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
6591 // application.
6592 switch (pname)
6593 {
6594 case GL_COMPRESSED_TEXTURE_FORMATS:
6595 {
6596 *type = GL_INT;
6597 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
6598 return true;
6599 }
6600 case GL_SHADER_BINARY_FORMATS:
6601 {
6602 *type = GL_INT;
6603 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
6604 return true;
6605 }
6606
6607 case GL_MAX_VERTEX_ATTRIBS:
6608 case GL_MAX_VERTEX_UNIFORM_VECTORS:
6609 case GL_MAX_VARYING_VECTORS:
6610 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
6611 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
6612 case GL_MAX_TEXTURE_IMAGE_UNITS:
6613 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
6614 case GL_MAX_RENDERBUFFER_SIZE:
6615 case GL_NUM_SHADER_BINARY_FORMATS:
6616 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
6617 case GL_ARRAY_BUFFER_BINDING:
6618 case GL_FRAMEBUFFER_BINDING:
6619 case GL_RENDERBUFFER_BINDING:
6620 case GL_CURRENT_PROGRAM:
6621 case GL_PACK_ALIGNMENT:
6622 case GL_UNPACK_ALIGNMENT:
6623 case GL_GENERATE_MIPMAP_HINT:
6624 case GL_RED_BITS:
6625 case GL_GREEN_BITS:
6626 case GL_BLUE_BITS:
6627 case GL_ALPHA_BITS:
6628 case GL_DEPTH_BITS:
6629 case GL_STENCIL_BITS:
6630 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
6631 case GL_CULL_FACE_MODE:
6632 case GL_FRONT_FACE:
6633 case GL_ACTIVE_TEXTURE:
6634 case GL_STENCIL_FUNC:
6635 case GL_STENCIL_VALUE_MASK:
6636 case GL_STENCIL_REF:
6637 case GL_STENCIL_FAIL:
6638 case GL_STENCIL_PASS_DEPTH_FAIL:
6639 case GL_STENCIL_PASS_DEPTH_PASS:
6640 case GL_STENCIL_BACK_FUNC:
6641 case GL_STENCIL_BACK_VALUE_MASK:
6642 case GL_STENCIL_BACK_REF:
6643 case GL_STENCIL_BACK_FAIL:
6644 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
6645 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
6646 case GL_DEPTH_FUNC:
6647 case GL_BLEND_SRC_RGB:
6648 case GL_BLEND_SRC_ALPHA:
6649 case GL_BLEND_DST_RGB:
6650 case GL_BLEND_DST_ALPHA:
6651 case GL_BLEND_EQUATION_RGB:
6652 case GL_BLEND_EQUATION_ALPHA:
6653 case GL_STENCIL_WRITEMASK:
6654 case GL_STENCIL_BACK_WRITEMASK:
6655 case GL_STENCIL_CLEAR_VALUE:
6656 case GL_SUBPIXEL_BITS:
6657 case GL_MAX_TEXTURE_SIZE:
6658 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
6659 case GL_SAMPLE_BUFFERS:
6660 case GL_SAMPLES:
6661 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
6662 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
6663 case GL_TEXTURE_BINDING_2D:
6664 case GL_TEXTURE_BINDING_CUBE_MAP:
6665 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
6666 {
6667 *type = GL_INT;
6668 *numParams = 1;
6669 return true;
6670 }
6671 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
6672 {
6673 if (!getExtensions().packReverseRowOrder)
6674 {
6675 return false;
6676 }
6677 *type = GL_INT;
6678 *numParams = 1;
6679 return true;
6680 }
6681 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
6682 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
6683 {
6684 if (!getExtensions().textureRectangle)
6685 {
6686 return false;
6687 }
6688 *type = GL_INT;
6689 *numParams = 1;
6690 return true;
6691 }
6692 case GL_MAX_DRAW_BUFFERS_EXT:
6693 case GL_MAX_COLOR_ATTACHMENTS_EXT:
6694 {
6695 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
6696 {
6697 return false;
6698 }
6699 *type = GL_INT;
6700 *numParams = 1;
6701 return true;
6702 }
6703 case GL_MAX_VIEWPORT_DIMS:
6704 {
6705 *type = GL_INT;
6706 *numParams = 2;
6707 return true;
6708 }
6709 case GL_VIEWPORT:
6710 case GL_SCISSOR_BOX:
6711 {
6712 *type = GL_INT;
6713 *numParams = 4;
6714 return true;
6715 }
6716 case GL_SHADER_COMPILER:
6717 case GL_SAMPLE_COVERAGE_INVERT:
6718 case GL_DEPTH_WRITEMASK:
6719 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
6720 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
6721 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
6722 // bool-natural
6723 case GL_SAMPLE_COVERAGE:
6724 case GL_SCISSOR_TEST:
6725 case GL_STENCIL_TEST:
6726 case GL_DEPTH_TEST:
6727 case GL_BLEND:
6728 case GL_DITHER:
6729 case GL_CONTEXT_ROBUST_ACCESS_EXT:
6730 {
6731 *type = GL_BOOL;
6732 *numParams = 1;
6733 return true;
6734 }
6735 case GL_COLOR_WRITEMASK:
6736 {
6737 *type = GL_BOOL;
6738 *numParams = 4;
6739 return true;
6740 }
6741 case GL_POLYGON_OFFSET_FACTOR:
6742 case GL_POLYGON_OFFSET_UNITS:
6743 case GL_SAMPLE_COVERAGE_VALUE:
6744 case GL_DEPTH_CLEAR_VALUE:
6745 case GL_LINE_WIDTH:
6746 {
6747 *type = GL_FLOAT;
6748 *numParams = 1;
6749 return true;
6750 }
6751 case GL_ALIASED_LINE_WIDTH_RANGE:
6752 case GL_ALIASED_POINT_SIZE_RANGE:
6753 case GL_DEPTH_RANGE:
6754 {
6755 *type = GL_FLOAT;
6756 *numParams = 2;
6757 return true;
6758 }
6759 case GL_COLOR_CLEAR_VALUE:
6760 case GL_BLEND_COLOR:
6761 {
6762 *type = GL_FLOAT;
6763 *numParams = 4;
6764 return true;
6765 }
6766 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
6767 if (!getExtensions().textureFilterAnisotropic)
6768 {
6769 return false;
6770 }
6771 *type = GL_FLOAT;
6772 *numParams = 1;
6773 return true;
6774 case GL_TIMESTAMP_EXT:
6775 if (!getExtensions().disjointTimerQuery)
6776 {
6777 return false;
6778 }
6779 *type = GL_INT_64_ANGLEX;
6780 *numParams = 1;
6781 return true;
6782 case GL_GPU_DISJOINT_EXT:
6783 if (!getExtensions().disjointTimerQuery)
6784 {
6785 return false;
6786 }
6787 *type = GL_INT;
6788 *numParams = 1;
6789 return true;
6790 case GL_COVERAGE_MODULATION_CHROMIUM:
6791 if (!getExtensions().framebufferMixedSamples)
6792 {
6793 return false;
6794 }
6795 *type = GL_INT;
6796 *numParams = 1;
6797 return true;
6798 case GL_TEXTURE_BINDING_EXTERNAL_OES:
6799 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
6800 {
6801 return false;
6802 }
6803 *type = GL_INT;
6804 *numParams = 1;
6805 return true;
6806 }
6807
6808 if (getExtensions().debug)
6809 {
6810 switch (pname)
6811 {
6812 case GL_DEBUG_LOGGED_MESSAGES:
6813 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
6814 case GL_DEBUG_GROUP_STACK_DEPTH:
6815 case GL_MAX_DEBUG_MESSAGE_LENGTH:
6816 case GL_MAX_DEBUG_LOGGED_MESSAGES:
6817 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
6818 case GL_MAX_LABEL_LENGTH:
6819 *type = GL_INT;
6820 *numParams = 1;
6821 return true;
6822
6823 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
6824 case GL_DEBUG_OUTPUT:
6825 *type = GL_BOOL;
6826 *numParams = 1;
6827 return true;
6828 }
6829 }
6830
6831 if (getExtensions().multisampleCompatibility)
6832 {
6833 switch (pname)
6834 {
6835 case GL_MULTISAMPLE_EXT:
6836 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
6837 *type = GL_BOOL;
6838 *numParams = 1;
6839 return true;
6840 }
6841 }
6842
6843 if (getExtensions().pathRendering)
6844 {
6845 switch (pname)
6846 {
6847 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
6848 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
6849 *type = GL_FLOAT;
6850 *numParams = 16;
6851 return true;
6852 }
6853 }
6854
6855 if (getExtensions().bindGeneratesResource)
6856 {
6857 switch (pname)
6858 {
6859 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
6860 *type = GL_BOOL;
6861 *numParams = 1;
6862 return true;
6863 }
6864 }
6865
6866 if (getExtensions().clientArrays)
6867 {
6868 switch (pname)
6869 {
6870 case GL_CLIENT_ARRAYS_ANGLE:
6871 *type = GL_BOOL;
6872 *numParams = 1;
6873 return true;
6874 }
6875 }
6876
6877 if (getExtensions().sRGBWriteControl)
6878 {
6879 switch (pname)
6880 {
6881 case GL_FRAMEBUFFER_SRGB_EXT:
6882 *type = GL_BOOL;
6883 *numParams = 1;
6884 return true;
6885 }
6886 }
6887
6888 if (getExtensions().robustResourceInitialization &&
6889 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
6890 {
6891 *type = GL_BOOL;
6892 *numParams = 1;
6893 return true;
6894 }
6895
6896 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
6897 {
6898 *type = GL_BOOL;
6899 *numParams = 1;
6900 return true;
6901 }
6902
6903 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
6904 switch (pname)
6905 {
6906 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
6907 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
6908 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
6909 {
6910 return false;
6911 }
6912 *type = GL_INT;
6913 *numParams = 1;
6914 return true;
6915
6916 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
6917 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
6918 {
6919 return false;
6920 }
6921 *type = GL_INT;
6922 *numParams = 1;
6923 return true;
6924
6925 case GL_PROGRAM_BINARY_FORMATS_OES:
6926 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
6927 {
6928 return false;
6929 }
6930 *type = GL_INT;
6931 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
6932 return true;
6933
6934 case GL_PACK_ROW_LENGTH:
6935 case GL_PACK_SKIP_ROWS:
6936 case GL_PACK_SKIP_PIXELS:
6937 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
6938 {
6939 return false;
6940 }
6941 *type = GL_INT;
6942 *numParams = 1;
6943 return true;
6944 case GL_UNPACK_ROW_LENGTH:
6945 case GL_UNPACK_SKIP_ROWS:
6946 case GL_UNPACK_SKIP_PIXELS:
6947 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
6948 {
6949 return false;
6950 }
6951 *type = GL_INT;
6952 *numParams = 1;
6953 return true;
6954 case GL_VERTEX_ARRAY_BINDING:
6955 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
6956 {
6957 return false;
6958 }
6959 *type = GL_INT;
6960 *numParams = 1;
6961 return true;
6962 case GL_PIXEL_PACK_BUFFER_BINDING:
6963 case GL_PIXEL_UNPACK_BUFFER_BINDING:
6964 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
6965 {
6966 return false;
6967 }
6968 *type = GL_INT;
6969 *numParams = 1;
6970 return true;
6971 case GL_MAX_SAMPLES:
6972 {
6973 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
6974 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
6975 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
6976 {
6977 return false;
6978 }
6979 *type = GL_INT;
6980 *numParams = 1;
6981 return true;
6982
6983 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
6984 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
6985 {
6986 return false;
6987 }
6988 *type = GL_INT;
6989 *numParams = 1;
6990 return true;
6991 }
6992 }
6993
6994 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
6995 {
6996 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
6997 {
6998 return false;
6999 }
7000 *type = GL_INT;
7001 *numParams = 1;
7002 return true;
7003 }
7004
7005 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7006 {
7007 *type = GL_INT;
7008 *numParams = 1;
7009 return true;
7010 }
7011
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007012 if (getClientVersion() < Version(2, 0))
7013 {
7014 switch (pname)
7015 {
7016 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007017 case GL_CLIENT_ACTIVE_TEXTURE:
7018 case GL_MATRIX_MODE:
7019 case GL_MAX_TEXTURE_UNITS:
7020 case GL_MAX_MODELVIEW_STACK_DEPTH:
7021 case GL_MAX_PROJECTION_STACK_DEPTH:
7022 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007023 case GL_VERTEX_ARRAY_STRIDE:
7024 case GL_NORMAL_ARRAY_STRIDE:
7025 case GL_COLOR_ARRAY_STRIDE:
7026 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7027 case GL_VERTEX_ARRAY_SIZE:
7028 case GL_COLOR_ARRAY_SIZE:
7029 case GL_TEXTURE_COORD_ARRAY_SIZE:
7030 case GL_VERTEX_ARRAY_TYPE:
7031 case GL_NORMAL_ARRAY_TYPE:
7032 case GL_COLOR_ARRAY_TYPE:
7033 case GL_TEXTURE_COORD_ARRAY_TYPE:
7034 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7035 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7036 case GL_COLOR_ARRAY_BUFFER_BINDING:
7037 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7038 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7039 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7040 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007041 *type = GL_INT;
7042 *numParams = 1;
7043 return true;
7044 case GL_ALPHA_TEST_REF:
7045 *type = GL_FLOAT;
7046 *numParams = 1;
7047 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007048 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007049 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007050 *type = GL_FLOAT;
7051 *numParams = 4;
7052 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007053 case GL_CURRENT_NORMAL:
7054 *type = GL_FLOAT;
7055 *numParams = 3;
7056 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007057 case GL_MODELVIEW_MATRIX:
7058 case GL_PROJECTION_MATRIX:
7059 case GL_TEXTURE_MATRIX:
7060 *type = GL_FLOAT;
7061 *numParams = 16;
7062 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007063 }
7064 }
7065
Jamie Madill5b772312018-03-08 20:28:32 -05007066 if (getClientVersion() < Version(3, 0))
7067 {
7068 return false;
7069 }
7070
7071 // Check for ES3.0+ parameter names
7072 switch (pname)
7073 {
7074 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7075 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7076 case GL_UNIFORM_BUFFER_BINDING:
7077 case GL_TRANSFORM_FEEDBACK_BINDING:
7078 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7079 case GL_COPY_READ_BUFFER_BINDING:
7080 case GL_COPY_WRITE_BUFFER_BINDING:
7081 case GL_SAMPLER_BINDING:
7082 case GL_READ_BUFFER:
7083 case GL_TEXTURE_BINDING_3D:
7084 case GL_TEXTURE_BINDING_2D_ARRAY:
7085 case GL_MAX_3D_TEXTURE_SIZE:
7086 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7087 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7088 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7089 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7090 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7091 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7092 case GL_MAX_VARYING_COMPONENTS:
7093 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7094 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7095 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7096 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7097 case GL_NUM_EXTENSIONS:
7098 case GL_MAJOR_VERSION:
7099 case GL_MINOR_VERSION:
7100 case GL_MAX_ELEMENTS_INDICES:
7101 case GL_MAX_ELEMENTS_VERTICES:
7102 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7103 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7104 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7105 case GL_UNPACK_IMAGE_HEIGHT:
7106 case GL_UNPACK_SKIP_IMAGES:
7107 {
7108 *type = GL_INT;
7109 *numParams = 1;
7110 return true;
7111 }
7112
7113 case GL_MAX_ELEMENT_INDEX:
7114 case GL_MAX_UNIFORM_BLOCK_SIZE:
7115 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7116 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7117 case GL_MAX_SERVER_WAIT_TIMEOUT:
7118 {
7119 *type = GL_INT_64_ANGLEX;
7120 *numParams = 1;
7121 return true;
7122 }
7123
7124 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7125 case GL_TRANSFORM_FEEDBACK_PAUSED:
7126 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7127 case GL_RASTERIZER_DISCARD:
7128 {
7129 *type = GL_BOOL;
7130 *numParams = 1;
7131 return true;
7132 }
7133
7134 case GL_MAX_TEXTURE_LOD_BIAS:
7135 {
7136 *type = GL_FLOAT;
7137 *numParams = 1;
7138 return true;
7139 }
7140 }
7141
7142 if (getExtensions().requestExtension)
7143 {
7144 switch (pname)
7145 {
7146 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7147 *type = GL_INT;
7148 *numParams = 1;
7149 return true;
7150 }
7151 }
7152
7153 if (getClientVersion() < Version(3, 1))
7154 {
7155 return false;
7156 }
7157
7158 switch (pname)
7159 {
7160 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7161 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7162 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7163 case GL_MAX_FRAMEBUFFER_WIDTH:
7164 case GL_MAX_FRAMEBUFFER_HEIGHT:
7165 case GL_MAX_FRAMEBUFFER_SAMPLES:
7166 case GL_MAX_SAMPLE_MASK_WORDS:
7167 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7168 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7169 case GL_MAX_INTEGER_SAMPLES:
7170 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7171 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7172 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7173 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7174 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7175 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7176 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7177 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7178 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7179 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7180 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7181 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7182 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7183 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7184 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7185 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7186 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7187 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7188 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7189 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7190 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7191 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7192 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7193 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7194 case GL_MAX_UNIFORM_LOCATIONS:
7195 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7196 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7197 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7198 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7199 case GL_MAX_IMAGE_UNITS:
7200 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7201 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7202 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7203 case GL_SHADER_STORAGE_BUFFER_BINDING:
7204 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7205 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
7206 *type = GL_INT;
7207 *numParams = 1;
7208 return true;
7209 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7210 *type = GL_INT_64_ANGLEX;
7211 *numParams = 1;
7212 return true;
7213 case GL_SAMPLE_MASK:
7214 *type = GL_BOOL;
7215 *numParams = 1;
7216 return true;
7217 }
7218
7219 if (getExtensions().geometryShader)
7220 {
7221 switch (pname)
7222 {
7223 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7224 case GL_LAYER_PROVOKING_VERTEX_EXT:
7225 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7226 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7227 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7228 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7229 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7230 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7231 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7232 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7233 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7234 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7235 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7236 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7237 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7238 *type = GL_INT;
7239 *numParams = 1;
7240 return true;
7241 }
7242 }
7243
7244 return false;
7245}
7246
7247bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7248{
7249 if (getClientVersion() < Version(3, 0))
7250 {
7251 return false;
7252 }
7253
7254 switch (target)
7255 {
7256 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7257 case GL_UNIFORM_BUFFER_BINDING:
7258 {
7259 *type = GL_INT;
7260 *numParams = 1;
7261 return true;
7262 }
7263 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7264 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7265 case GL_UNIFORM_BUFFER_START:
7266 case GL_UNIFORM_BUFFER_SIZE:
7267 {
7268 *type = GL_INT_64_ANGLEX;
7269 *numParams = 1;
7270 return true;
7271 }
7272 }
7273
7274 if (getClientVersion() < Version(3, 1))
7275 {
7276 return false;
7277 }
7278
7279 switch (target)
7280 {
7281 case GL_IMAGE_BINDING_LAYERED:
7282 {
7283 *type = GL_BOOL;
7284 *numParams = 1;
7285 return true;
7286 }
7287 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7288 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7289 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7290 case GL_SHADER_STORAGE_BUFFER_BINDING:
7291 case GL_VERTEX_BINDING_BUFFER:
7292 case GL_VERTEX_BINDING_DIVISOR:
7293 case GL_VERTEX_BINDING_OFFSET:
7294 case GL_VERTEX_BINDING_STRIDE:
7295 case GL_SAMPLE_MASK_VALUE:
7296 case GL_IMAGE_BINDING_NAME:
7297 case GL_IMAGE_BINDING_LEVEL:
7298 case GL_IMAGE_BINDING_LAYER:
7299 case GL_IMAGE_BINDING_ACCESS:
7300 case GL_IMAGE_BINDING_FORMAT:
7301 {
7302 *type = GL_INT;
7303 *numParams = 1;
7304 return true;
7305 }
7306 case GL_ATOMIC_COUNTER_BUFFER_START:
7307 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7308 case GL_SHADER_STORAGE_BUFFER_START:
7309 case GL_SHADER_STORAGE_BUFFER_SIZE:
7310 {
7311 *type = GL_INT_64_ANGLEX;
7312 *numParams = 1;
7313 return true;
7314 }
7315 }
7316
7317 return false;
7318}
7319
7320Program *Context::getProgram(GLuint handle) const
7321{
7322 return mState.mShaderPrograms->getProgram(handle);
7323}
7324
7325Shader *Context::getShader(GLuint handle) const
7326{
7327 return mState.mShaderPrograms->getShader(handle);
7328}
7329
7330bool Context::isTextureGenerated(GLuint texture) const
7331{
7332 return mState.mTextures->isHandleGenerated(texture);
7333}
7334
7335bool Context::isBufferGenerated(GLuint buffer) const
7336{
7337 return mState.mBuffers->isHandleGenerated(buffer);
7338}
7339
7340bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7341{
7342 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7343}
7344
7345bool Context::isFramebufferGenerated(GLuint framebuffer) const
7346{
7347 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7348}
7349
7350bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7351{
7352 return mState.mPipelines->isHandleGenerated(pipeline);
7353}
7354
7355bool Context::usingDisplayTextureShareGroup() const
7356{
7357 return mDisplayTextureShareGroup;
7358}
7359
7360GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7361{
7362 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7363 internalformat == GL_DEPTH_STENCIL
7364 ? GL_DEPTH24_STENCIL8
7365 : internalformat;
7366}
7367
Jamie Madillc29968b2016-01-20 11:17:23 -05007368} // namespace gl