blob: aea253abbda09f48a8b881daca3bc77d01b74c2a [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000011
Jamie Madill231c7f52017-04-26 13:45:37 -040012#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050013#include <iterator>
14#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030015#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050016
Sami Väisänene45e53b2016-05-25 10:36:04 +030017#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040018#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050019#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050020#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050021#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050022#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040023#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050024#include "libANGLE/Fence.h"
25#include "libANGLE/Framebuffer.h"
26#include "libANGLE/FramebufferAttachment.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030027#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050028#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080029#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050031#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/ResourceManager.h"
33#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050034#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050035#include "libANGLE/Texture.h"
36#include "libANGLE/TransformFeedback.h"
37#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070038#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040039#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030040#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040041#include "libANGLE/queryutils.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040042#include "libANGLE/renderer/ContextImpl.h"
43#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040044#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000046
Geoff Langf6db0982015-08-25 13:04:00 -040047namespace
48{
49
Jamie Madillb6664922017-07-25 12:55:04 -040050#define ANGLE_HANDLE_ERR(X) \
51 handleError(X); \
52 return;
53#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
54
Ian Ewell3ffd78b2016-01-22 16:09:42 -050055template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050056std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030057 GLsizei numPaths,
58 const void *paths,
59 GLuint pathBase)
60{
61 std::vector<gl::Path *> ret;
62 ret.reserve(numPaths);
63
64 const auto *nameArray = static_cast<const T *>(paths);
65
66 for (GLsizei i = 0; i < numPaths; ++i)
67 {
68 const GLuint pathName = nameArray[i] + pathBase;
69
70 ret.push_back(resourceManager.getPath(pathName));
71 }
72
73 return ret;
74}
75
Geoff Lang4ddf5af2016-12-01 14:30:44 -050076std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030077 GLsizei numPaths,
78 GLenum pathNameType,
79 const void *paths,
80 GLuint pathBase)
81{
82 switch (pathNameType)
83 {
84 case GL_UNSIGNED_BYTE:
85 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
86
87 case GL_BYTE:
88 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_UNSIGNED_SHORT:
91 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_SHORT:
94 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_UNSIGNED_INT:
97 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_INT:
100 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
101 }
102
103 UNREACHABLE();
104 return std::vector<gl::Path *>();
105}
106
107template <typename T>
Geoff Lang2186c382016-10-14 10:54:54 -0400108gl::Error GetQueryObjectParameter(gl::Query *query, GLenum pname, T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500109{
Geoff Lang2186c382016-10-14 10:54:54 -0400110 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500111
112 switch (pname)
113 {
114 case GL_QUERY_RESULT_EXT:
Geoff Lang2186c382016-10-14 10:54:54 -0400115 return query->getResult(params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500116 case GL_QUERY_RESULT_AVAILABLE_EXT:
117 {
118 bool available;
Geoff Lang2186c382016-10-14 10:54:54 -0400119 gl::Error error = query->isResultAvailable(&available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500120 if (!error.isError())
121 {
jchen10a99ed552017-09-22 08:10:32 +0800122 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500123 }
124 return error;
125 }
126 default:
127 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500128 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500129 }
130}
131
Jamie Madill09463932018-04-04 05:26:59 -0400132void MarkTransformFeedbackBufferUsage(const gl::Context *context,
133 gl::TransformFeedback *transformFeedback,
James Darpinian30b604d2018-03-12 17:26:57 -0700134 GLsizei count,
135 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400136{
Geoff Lang1a683462015-09-29 15:09:59 -0400137 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400138 {
Jamie Madill09463932018-04-04 05:26:59 -0400139 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400140 }
141}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500142
143// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300144EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500145{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400146 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500147}
148
Martin Radev1be913c2016-07-11 17:59:16 +0300149EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
150{
151 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
152}
153
Geoff Langeb66a6e2016-10-31 13:06:12 -0400154gl::Version GetClientVersion(const egl::AttributeMap &attribs)
155{
156 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
157}
158
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500159GLenum GetResetStrategy(const egl::AttributeMap &attribs)
160{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800161 EGLAttrib attrib =
162 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500163 switch (attrib)
164 {
165 case EGL_NO_RESET_NOTIFICATION:
166 return GL_NO_RESET_NOTIFICATION_EXT;
167 case EGL_LOSE_CONTEXT_ON_RESET:
168 return GL_LOSE_CONTEXT_ON_RESET_EXT;
169 default:
170 UNREACHABLE();
171 return GL_NONE;
172 }
173}
174
175bool GetRobustAccess(const egl::AttributeMap &attribs)
176{
Geoff Lang077f20a2016-11-01 10:08:02 -0400177 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
178 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
179 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500180}
181
182bool GetDebug(const egl::AttributeMap &attribs)
183{
Geoff Lang077f20a2016-11-01 10:08:02 -0400184 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
185 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500186}
187
188bool GetNoError(const egl::AttributeMap &attribs)
189{
190 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
191}
192
Geoff Langc287ea62016-09-16 14:46:51 -0400193bool GetWebGLContext(const egl::AttributeMap &attribs)
194{
195 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
196}
197
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400198bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
199{
200 // If the context is WebGL, extensions are disabled by default
201 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
202 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
203}
204
Geoff Langf41a7152016-09-19 15:11:17 -0400205bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
206{
207 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
208}
209
Geoff Langfeb8c682017-02-13 16:07:35 -0500210bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
211{
212 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
213}
214
Geoff Langb433e872017-10-05 14:01:47 -0400215bool GetRobustResourceInit(const egl::AttributeMap &attribs)
216{
217 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
218}
219
Martin Radev9d901792016-07-15 15:58:58 +0300220std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
221{
222 std::string labelName;
223 if (label != nullptr)
224 {
225 size_t labelLength = length < 0 ? strlen(label) : length;
226 labelName = std::string(label, labelLength);
227 }
228 return labelName;
229}
230
231void GetObjectLabelBase(const std::string &objectLabel,
232 GLsizei bufSize,
233 GLsizei *length,
234 GLchar *label)
235{
236 size_t writeLength = objectLabel.length();
237 if (label != nullptr && bufSize > 0)
238 {
239 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
240 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
241 label[writeLength] = '\0';
242 }
243
244 if (length != nullptr)
245 {
246 *length = static_cast<GLsizei>(writeLength);
247 }
248}
249
Jamie Madill0f80ed82017-09-19 00:24:56 -0400250template <typename CapT, typename MaxT>
251void LimitCap(CapT *cap, MaxT maximum)
252{
253 *cap = std::min(*cap, static_cast<CapT>(maximum));
254}
255
Geoff Langf6db0982015-08-25 13:04:00 -0400256} // anonymous namespace
257
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000258namespace gl
259{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000260
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400261Context::Context(rx::EGLImplFactory *implFactory,
262 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400263 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500264 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400265 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500266 const egl::AttributeMap &attribs,
Geoff Langb433e872017-10-05 14:01:47 -0400267 const egl::DisplayExtensions &displayExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500268 : mState(reinterpret_cast<ContextID>(this),
269 shareContext ? &shareContext->mState : nullptr,
270 shareTextures,
271 GetClientVersion(attribs),
272 &mGLState,
273 mCaps,
274 mTextureCaps,
275 mExtensions,
276 mLimitations),
277 mSkipValidation(GetNoError(attribs)),
278 mDisplayTextureShareGroup(shareTextures != nullptr),
279 mSavedArgsType(nullptr),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700280 mImplementation(implFactory->createContext(mState)),
Jamie Madill2f348d22017-06-05 10:50:59 -0400281 mCompiler(),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400282 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500283 mClientType(EGL_OPENGL_ES_API),
284 mHasBeenCurrent(false),
285 mContextLost(false),
286 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700287 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500288 mResetStrategy(GetResetStrategy(attribs)),
289 mRobustAccess(GetRobustAccess(attribs)),
Jamie Madill61e16b42017-06-19 11:13:23 -0400290 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
291 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500292 mSurfacelessFramebuffer(nullptr),
Jamie Madille14951e2017-03-09 18:55:16 -0500293 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400294 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400295 mMemoryProgramCache(memoryProgramCache),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400296 mScratchBuffer(1000u),
297 mZeroFilledBuffer(1000u)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000298{
Jamie Madill5b772312018-03-08 20:28:32 -0500299 // Needed to solve a Clang warning of unused variables.
300 UNUSED_VARIABLE(mSavedArgsType);
301 UNUSED_VARIABLE(mParamsBuffer);
302
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400303 mImplementation->setMemoryProgramCache(memoryProgramCache);
304
Geoff Langb433e872017-10-05 14:01:47 -0400305 bool robustResourceInit = GetRobustResourceInit(attribs);
306 initCaps(displayExtensions, robustResourceInit);
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700307 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400308
Jamie Madill4928b7c2017-06-20 12:57:39 -0400309 mGLState.initialize(this, GetDebug(attribs), GetBindGeneratesResource(attribs),
Jamie Madillc43be722017-07-13 16:22:14 -0400310 GetClientArraysEnabled(attribs), robustResourceInit,
311 mMemoryProgramCache != nullptr);
Régis Fénéon83107972015-02-05 12:57:44 +0100312
Shannon Woods53a94a82014-06-24 15:20:36 -0400313 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400314
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000315 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400316 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000317 // and cube map texture state vectors respectively associated with them.
318 // In order that access to these initial textures not be lost, they are treated as texture
319 // objects all of whose names are 0.
320
Corentin Wallez99d492c2018-02-27 15:17:10 -0500321 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800322 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500323
Corentin Wallez99d492c2018-02-27 15:17:10 -0500324 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800325 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400326
Geoff Langeb66a6e2016-10-31 13:06:12 -0400327 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400328 {
329 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500330 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800331 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400332
Corentin Wallez99d492c2018-02-27 15:17:10 -0500333 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800334 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400335 }
Geoff Lang3b573612016-10-31 14:08:10 -0400336 if (getClientVersion() >= Version(3, 1))
337 {
338 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500339 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800340 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800341
Jiajia Qin6eafb042016-12-27 17:04:07 +0800342 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
343 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800344 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800345 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800346
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800347 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
348 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400349 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800350 }
Geoff Lang3b573612016-10-31 14:08:10 -0400351 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000352
Geoff Lang4751aab2017-10-30 15:14:52 -0400353 const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
354 if (nativeExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400355 {
356 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500357 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800358 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400359 }
360
Geoff Lang4751aab2017-10-30 15:14:52 -0400361 if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400362 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500363 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800364 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400365 }
366
Jamie Madill4928b7c2017-06-20 12:57:39 -0400367 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500368
Jamie Madill57a89722013-07-02 11:57:03 -0400369 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000370
Geoff Langeb66a6e2016-10-31 13:06:12 -0400371 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400372 {
373 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
374 // In the initial state, a default transform feedback object is bound and treated as
375 // a transform feedback object with a name of zero. That object is bound any time
376 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400377 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400378 }
Geoff Langc8058452014-02-03 12:04:11 -0500379
Corentin Wallez336129f2017-10-17 15:55:40 -0400380 for (auto type : angle::AllEnums<BufferBinding>())
381 {
382 bindBuffer(type, 0);
383 }
384
385 bindRenderbuffer(GL_RENDERBUFFER, 0);
386
387 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
388 {
389 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
390 }
391
Jamie Madillad9f24e2016-02-12 09:27:24 -0500392 // Initialize dirty bit masks
Jamie Madillc67323a2017-11-02 23:11:41 -0400393 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500394 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500395 // No dirty objects.
396
397 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400398 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500399 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500400 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
401
402 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
403 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
404 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
405 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
406 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
407 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
408 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
409 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
410 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
411 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
412 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
413 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
414
415 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
416 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700417 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500418 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
419 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400420
Xinghua Cao10a4d432017-11-28 14:46:26 +0800421 // TODO(xinghua.cao@intel.com): add other dirty bits and dirty objects.
422 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
423 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
424 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
425 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
426 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800427 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800428 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800429
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400430 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000431}
432
Jamie Madill4928b7c2017-06-20 12:57:39 -0400433egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000434{
Jamie Madille7b3fe22018-04-05 09:42:46 -0400435 // Delete the Surface first to trigger a finish() in Vulkan.
436 SafeDelete(mSurfacelessFramebuffer);
437
438 ANGLE_TRY(releaseSurface(display));
439
Corentin Wallez80b24112015-08-25 16:41:57 -0400440 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000441 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400442 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000443 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400444 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000445
Corentin Wallez80b24112015-08-25 16:41:57 -0400446 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000447 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400448 if (query.second != nullptr)
449 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400450 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400451 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000452 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400453 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000454
Corentin Wallez80b24112015-08-25 16:41:57 -0400455 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400456 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400457 if (vertexArray.second)
458 {
459 vertexArray.second->onDestroy(this);
460 }
Jamie Madill57a89722013-07-02 11:57:03 -0400461 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400462 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400463
Corentin Wallez80b24112015-08-25 16:41:57 -0400464 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500465 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500466 if (transformFeedback.second != nullptr)
467 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500468 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500469 }
Geoff Langc8058452014-02-03 12:04:11 -0500470 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400471 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500472
Jamie Madill5b772312018-03-08 20:28:32 -0500473 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400474 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800475 if (zeroTexture.get() != nullptr)
476 {
477 ANGLE_TRY(zeroTexture->onDestroy(this));
478 zeroTexture.set(this, nullptr);
479 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400480 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000481
Jamie Madill2f348d22017-06-05 10:50:59 -0400482 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500483
Jamie Madill4928b7c2017-06-20 12:57:39 -0400484 mGLState.reset(this);
485
Jamie Madill6c1f6712017-02-14 19:08:04 -0500486 mState.mBuffers->release(this);
487 mState.mShaderPrograms->release(this);
488 mState.mTextures->release(this);
489 mState.mRenderbuffers->release(this);
490 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400491 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500492 mState.mPaths->release(this);
493 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800494 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400495
Jamie Madill76e471e2017-10-21 09:56:01 -0400496 mImplementation->onDestroy(this);
497
Jamie Madill4928b7c2017-06-20 12:57:39 -0400498 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000499}
500
Jamie Madill70ee0f62017-02-06 16:04:20 -0500501Context::~Context()
502{
503}
504
Jamie Madill4928b7c2017-06-20 12:57:39 -0400505egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000506{
Jamie Madill61e16b42017-06-19 11:13:23 -0400507 mCurrentDisplay = display;
508
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000509 if (!mHasBeenCurrent)
510 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000511 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500512 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400513 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000514
Corentin Wallezc295e512017-01-27 17:47:50 -0500515 int width = 0;
516 int height = 0;
517 if (surface != nullptr)
518 {
519 width = surface->getWidth();
520 height = surface->getHeight();
521 }
522
523 mGLState.setViewportParams(0, 0, width, height);
524 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000525
526 mHasBeenCurrent = true;
527 }
528
Jamie Madill1b94d432015-08-07 13:23:23 -0400529 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700530 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400531 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400532
Jamie Madill4928b7c2017-06-20 12:57:39 -0400533 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500534
535 Framebuffer *newDefault = nullptr;
536 if (surface != nullptr)
537 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400538 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500539 mCurrentSurface = surface;
540 newDefault = surface->getDefaultFramebuffer();
541 }
542 else
543 {
544 if (mSurfacelessFramebuffer == nullptr)
545 {
546 mSurfacelessFramebuffer = new Framebuffer(mImplementation.get());
547 }
548
549 newDefault = mSurfacelessFramebuffer;
550 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000551
Corentin Wallez37c39792015-08-20 14:19:46 -0400552 // Update default framebuffer, the binding of the previous default
553 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400554 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700555 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400556 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700557 mGLState.setReadFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400558 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700559 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400560 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700561 mGLState.setDrawFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400562 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500563 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400564 }
Ian Ewell292f0052016-02-04 10:37:32 -0500565
566 // Notify the renderer of a context switch
Jamie Madill4928b7c2017-06-20 12:57:39 -0400567 mImplementation->onMakeCurrent(this);
568 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000569}
570
Jamie Madill4928b7c2017-06-20 12:57:39 -0400571egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400572{
Corentin Wallez37c39792015-08-20 14:19:46 -0400573 // Remove the default framebuffer
Corentin Wallezc295e512017-01-27 17:47:50 -0500574 Framebuffer *currentDefault = nullptr;
575 if (mCurrentSurface != nullptr)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400576 {
Corentin Wallezc295e512017-01-27 17:47:50 -0500577 currentDefault = mCurrentSurface->getDefaultFramebuffer();
578 }
579 else if (mSurfacelessFramebuffer != nullptr)
580 {
581 currentDefault = mSurfacelessFramebuffer;
Corentin Wallez51706ea2015-08-07 14:39:22 -0400582 }
583
Corentin Wallezc295e512017-01-27 17:47:50 -0500584 if (mGLState.getReadFramebuffer() == currentDefault)
585 {
586 mGLState.setReadFramebufferBinding(nullptr);
587 }
588 if (mGLState.getDrawFramebuffer() == currentDefault)
589 {
590 mGLState.setDrawFramebufferBinding(nullptr);
591 }
592 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
593
594 if (mCurrentSurface)
595 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400596 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500597 mCurrentSurface = nullptr;
598 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400599
600 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400601}
602
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000603GLuint Context::createBuffer()
604{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500605 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000606}
607
608GLuint Context::createProgram()
609{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500610 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000611}
612
Jiawei Shao385b3e02018-03-21 09:43:28 +0800613GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000614{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500615 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000616}
617
618GLuint Context::createTexture()
619{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500620 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000621}
622
623GLuint Context::createRenderbuffer()
624{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500625 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000626}
627
Brandon Jones59770802018-04-02 13:18:42 -0700628GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300629{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500630 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300631 if (resultOrError.isError())
632 {
633 handleError(resultOrError.getError());
634 return 0;
635 }
636 return resultOrError.getResult();
637}
638
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000639// Returns an unused framebuffer name
640GLuint Context::createFramebuffer()
641{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500642 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000643}
644
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500645void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000646{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500647 for (int i = 0; i < n; i++)
648 {
649 GLuint handle = mFenceNVHandleAllocator.allocate();
650 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
651 fences[i] = handle;
652 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000653}
654
Yunchao Hea336b902017-08-02 16:05:21 +0800655GLuint Context::createProgramPipeline()
656{
657 return mState.mPipelines->createProgramPipeline();
658}
659
Jiawei Shao385b3e02018-03-21 09:43:28 +0800660GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800661{
662 UNIMPLEMENTED();
663 return 0u;
664}
665
James Darpinian4d9d4832018-03-13 12:43:28 -0700666void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000667{
James Darpinian4d9d4832018-03-13 12:43:28 -0700668 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
669 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000670 {
671 detachBuffer(buffer);
672 }
Jamie Madill893ab082014-05-16 16:56:10 -0400673
James Darpinian4d9d4832018-03-13 12:43:28 -0700674 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000675}
676
677void Context::deleteShader(GLuint shader)
678{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500679 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000680}
681
682void Context::deleteProgram(GLuint program)
683{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500684 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000685}
686
687void Context::deleteTexture(GLuint texture)
688{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500689 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000690 {
691 detachTexture(texture);
692 }
693
Jamie Madill6c1f6712017-02-14 19:08:04 -0500694 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000695}
696
697void Context::deleteRenderbuffer(GLuint renderbuffer)
698{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500699 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000700 {
701 detachRenderbuffer(renderbuffer);
702 }
Jamie Madill893ab082014-05-16 16:56:10 -0400703
Jamie Madill6c1f6712017-02-14 19:08:04 -0500704 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000705}
706
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400707void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400708{
709 // The spec specifies the underlying Fence object is not deleted until all current
710 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
711 // and since our API is currently designed for being called from a single thread, we can delete
712 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400713 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400714}
715
Yunchao Hea336b902017-08-02 16:05:21 +0800716void Context::deleteProgramPipeline(GLuint pipeline)
717{
718 if (mState.mPipelines->getProgramPipeline(pipeline))
719 {
720 detachProgramPipeline(pipeline);
721 }
722
723 mState.mPipelines->deleteObject(this, pipeline);
724}
725
Sami Väisänene45e53b2016-05-25 10:36:04 +0300726void Context::deletePaths(GLuint first, GLsizei range)
727{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500728 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300729}
730
Brandon Jones59770802018-04-02 13:18:42 -0700731bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300732{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500733 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300734 if (pathObj == nullptr)
735 return false;
736
737 return pathObj->hasPathData();
738}
739
Brandon Jones59770802018-04-02 13:18:42 -0700740bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300741{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500742 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300743}
744
Brandon Jones59770802018-04-02 13:18:42 -0700745void Context::pathCommands(GLuint path,
746 GLsizei numCommands,
747 const GLubyte *commands,
748 GLsizei numCoords,
749 GLenum coordType,
750 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300751{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500752 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300753
754 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
755}
756
Jamie Madill007530e2017-12-28 14:27:04 -0500757void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300758{
Jamie Madill007530e2017-12-28 14:27:04 -0500759 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300760
761 switch (pname)
762 {
763 case GL_PATH_STROKE_WIDTH_CHROMIUM:
764 pathObj->setStrokeWidth(value);
765 break;
766 case GL_PATH_END_CAPS_CHROMIUM:
767 pathObj->setEndCaps(static_cast<GLenum>(value));
768 break;
769 case GL_PATH_JOIN_STYLE_CHROMIUM:
770 pathObj->setJoinStyle(static_cast<GLenum>(value));
771 break;
772 case GL_PATH_MITER_LIMIT_CHROMIUM:
773 pathObj->setMiterLimit(value);
774 break;
775 case GL_PATH_STROKE_BOUND_CHROMIUM:
776 pathObj->setStrokeBound(value);
777 break;
778 default:
779 UNREACHABLE();
780 break;
781 }
782}
783
Jamie Madill007530e2017-12-28 14:27:04 -0500784void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300785{
Jamie Madill007530e2017-12-28 14:27:04 -0500786 // TODO(jmadill): Should use proper clamping/casting.
787 pathParameterf(path, pname, static_cast<GLfloat>(value));
788}
789
790void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
791{
792 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300793
794 switch (pname)
795 {
796 case GL_PATH_STROKE_WIDTH_CHROMIUM:
797 *value = pathObj->getStrokeWidth();
798 break;
799 case GL_PATH_END_CAPS_CHROMIUM:
800 *value = static_cast<GLfloat>(pathObj->getEndCaps());
801 break;
802 case GL_PATH_JOIN_STYLE_CHROMIUM:
803 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
804 break;
805 case GL_PATH_MITER_LIMIT_CHROMIUM:
806 *value = pathObj->getMiterLimit();
807 break;
808 case GL_PATH_STROKE_BOUND_CHROMIUM:
809 *value = pathObj->getStrokeBound();
810 break;
811 default:
812 UNREACHABLE();
813 break;
814 }
815}
816
Jamie Madill007530e2017-12-28 14:27:04 -0500817void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
818{
819 GLfloat val = 0.0f;
820 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
821 if (value)
822 *value = static_cast<GLint>(val);
823}
824
Brandon Jones59770802018-04-02 13:18:42 -0700825void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300826{
827 mGLState.setPathStencilFunc(func, ref, mask);
828}
829
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000830void Context::deleteFramebuffer(GLuint framebuffer)
831{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500832 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000833 {
834 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000835 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500836
Jamie Madill6c1f6712017-02-14 19:08:04 -0500837 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000838}
839
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500840void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000841{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500842 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000843 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500844 GLuint fence = fences[i];
845
846 FenceNV *fenceObject = nullptr;
847 if (mFenceNVMap.erase(fence, &fenceObject))
848 {
849 mFenceNVHandleAllocator.release(fence);
850 delete fenceObject;
851 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000852 }
853}
854
Geoff Lang70d0f492015-12-10 17:45:46 -0500855Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000856{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500857 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000858}
859
Jamie Madill570f7c82014-07-03 10:38:54 -0400860Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000861{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500862 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000863}
864
Geoff Lang70d0f492015-12-10 17:45:46 -0500865Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000866{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500867 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000868}
869
Jamie Madill70b5bb02017-08-28 13:32:37 -0400870Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400871{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400872 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400873}
874
Jamie Madill57a89722013-07-02 11:57:03 -0400875VertexArray *Context::getVertexArray(GLuint handle) const
876{
Jamie Madill96a483b2017-06-27 16:49:21 -0400877 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400878}
879
Jamie Madilldc356042013-07-19 16:36:57 -0400880Sampler *Context::getSampler(GLuint handle) const
881{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500882 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400883}
884
Geoff Langc8058452014-02-03 12:04:11 -0500885TransformFeedback *Context::getTransformFeedback(GLuint handle) const
886{
Jamie Madill96a483b2017-06-27 16:49:21 -0400887 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500888}
889
Yunchao Hea336b902017-08-02 16:05:21 +0800890ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
891{
892 return mState.mPipelines->getProgramPipeline(handle);
893}
894
Geoff Lang70d0f492015-12-10 17:45:46 -0500895LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
896{
897 switch (identifier)
898 {
899 case GL_BUFFER:
900 return getBuffer(name);
901 case GL_SHADER:
902 return getShader(name);
903 case GL_PROGRAM:
904 return getProgram(name);
905 case GL_VERTEX_ARRAY:
906 return getVertexArray(name);
907 case GL_QUERY:
908 return getQuery(name);
909 case GL_TRANSFORM_FEEDBACK:
910 return getTransformFeedback(name);
911 case GL_SAMPLER:
912 return getSampler(name);
913 case GL_TEXTURE:
914 return getTexture(name);
915 case GL_RENDERBUFFER:
916 return getRenderbuffer(name);
917 case GL_FRAMEBUFFER:
918 return getFramebuffer(name);
919 default:
920 UNREACHABLE();
921 return nullptr;
922 }
923}
924
925LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
926{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400927 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -0500928}
929
Martin Radev9d901792016-07-15 15:58:58 +0300930void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
931{
932 LabeledObject *object = getLabeledObject(identifier, name);
933 ASSERT(object != nullptr);
934
935 std::string labelName = GetObjectLabelFromPointer(length, label);
936 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -0400937
938 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
939 // specified object is active until we do this.
940 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +0300941}
942
943void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
944{
945 LabeledObject *object = getLabeledObjectFromPtr(ptr);
946 ASSERT(object != nullptr);
947
948 std::string labelName = GetObjectLabelFromPointer(length, label);
949 object->setLabel(labelName);
950}
951
952void Context::getObjectLabel(GLenum identifier,
953 GLuint name,
954 GLsizei bufSize,
955 GLsizei *length,
956 GLchar *label) const
957{
958 LabeledObject *object = getLabeledObject(identifier, name);
959 ASSERT(object != nullptr);
960
961 const std::string &objectLabel = object->getLabel();
962 GetObjectLabelBase(objectLabel, bufSize, length, label);
963}
964
965void Context::getObjectPtrLabel(const void *ptr,
966 GLsizei bufSize,
967 GLsizei *length,
968 GLchar *label) const
969{
970 LabeledObject *object = getLabeledObjectFromPtr(ptr);
971 ASSERT(object != nullptr);
972
973 const std::string &objectLabel = object->getLabel();
974 GetObjectLabelBase(objectLabel, bufSize, length, label);
975}
976
Jamie Madilldc356042013-07-19 16:36:57 -0400977bool Context::isSampler(GLuint samplerName) const
978{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500979 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -0400980}
981
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800982void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000983{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500984 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000985
Jamie Madilldedd7b92014-11-05 16:30:36 -0500986 if (handle == 0)
987 {
988 texture = mZeroTextures[target].get();
989 }
990 else
991 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500992 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500993 }
994
995 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400996 mGLState.setSamplerTexture(this, target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000997}
998
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500999void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001000{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001001 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1002 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001003 mGLState.setReadFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001004}
1005
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001006void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001007{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001008 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1009 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001010 mGLState.setDrawFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001011}
1012
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001013void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001014{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001015 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001016 mGLState.setVertexArrayBinding(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -04001017}
1018
Shao80957d92017-02-20 21:25:59 +08001019void Context::bindVertexBuffer(GLuint bindingIndex,
1020 GLuint bufferHandle,
1021 GLintptr offset,
1022 GLsizei stride)
1023{
1024 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001025 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +08001026}
1027
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001028void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001029{
Geoff Lang76b10c92014-09-05 16:28:14 -04001030 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001031 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001032 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001033 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001034}
1035
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001036void Context::bindImageTexture(GLuint unit,
1037 GLuint texture,
1038 GLint level,
1039 GLboolean layered,
1040 GLint layer,
1041 GLenum access,
1042 GLenum format)
1043{
1044 Texture *tex = mState.mTextures->getTexture(texture);
1045 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1046}
1047
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001048void Context::useProgram(GLuint program)
1049{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001050 mGLState.setProgram(this, getProgram(program));
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001051}
1052
Jiajia Qin5451d532017-11-16 17:16:34 +08001053void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1054{
1055 UNIMPLEMENTED();
1056}
1057
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001058void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001059{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001060 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001061 TransformFeedback *transformFeedback =
1062 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001063 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001064}
1065
Yunchao Hea336b902017-08-02 16:05:21 +08001066void Context::bindProgramPipeline(GLuint pipelineHandle)
1067{
1068 ProgramPipeline *pipeline =
1069 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1070 mGLState.setProgramPipelineBinding(this, pipeline);
1071}
1072
Jamie Madillf0e04492017-08-26 15:28:42 -04001073void Context::beginQuery(GLenum target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001074{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001075 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001076 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001077
Geoff Lang5aad9672014-09-08 11:10:42 -04001078 // begin query
Jamie Madillf0e04492017-08-26 15:28:42 -04001079 ANGLE_CONTEXT_TRY(queryObject->begin());
Geoff Lang5aad9672014-09-08 11:10:42 -04001080
1081 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001082 mGLState.setActiveQuery(this, target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001083}
1084
Jamie Madillf0e04492017-08-26 15:28:42 -04001085void Context::endQuery(GLenum target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001086{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001087 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001088 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001089
Jamie Madillf0e04492017-08-26 15:28:42 -04001090 handleError(queryObject->end());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001091
Geoff Lang5aad9672014-09-08 11:10:42 -04001092 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001093 mGLState.setActiveQuery(this, target, nullptr);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001094}
1095
Jamie Madillf0e04492017-08-26 15:28:42 -04001096void Context::queryCounter(GLuint id, GLenum target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001097{
1098 ASSERT(target == GL_TIMESTAMP_EXT);
1099
1100 Query *queryObject = getQuery(id, true, target);
1101 ASSERT(queryObject);
1102
Jamie Madillf0e04492017-08-26 15:28:42 -04001103 handleError(queryObject->queryCounter());
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001104}
1105
1106void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
1107{
1108 switch (pname)
1109 {
1110 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001111 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001112 break;
1113 case GL_QUERY_COUNTER_BITS_EXT:
1114 switch (target)
1115 {
1116 case GL_TIME_ELAPSED_EXT:
1117 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1118 break;
1119 case GL_TIMESTAMP_EXT:
1120 params[0] = getExtensions().queryCounterBitsTimestamp;
1121 break;
1122 default:
1123 UNREACHABLE();
1124 params[0] = 0;
1125 break;
1126 }
1127 break;
1128 default:
1129 UNREACHABLE();
1130 return;
1131 }
1132}
1133
Brandon Jones59770802018-04-02 13:18:42 -07001134void Context::getQueryivRobust(GLenum target,
1135 GLenum pname,
1136 GLsizei bufSize,
1137 GLsizei *length,
1138 GLint *params)
1139{
1140 getQueryiv(target, pname, params);
1141}
1142
Geoff Lang2186c382016-10-14 10:54:54 -04001143void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001144{
Geoff Lang2186c382016-10-14 10:54:54 -04001145 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001146}
1147
Brandon Jones59770802018-04-02 13:18:42 -07001148void Context::getQueryObjectivRobust(GLuint id,
1149 GLenum pname,
1150 GLsizei bufSize,
1151 GLsizei *length,
1152 GLint *params)
1153{
1154 getQueryObjectiv(id, pname, params);
1155}
1156
Geoff Lang2186c382016-10-14 10:54:54 -04001157void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001158{
Geoff Lang2186c382016-10-14 10:54:54 -04001159 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001160}
1161
Brandon Jones59770802018-04-02 13:18:42 -07001162void Context::getQueryObjectuivRobust(GLuint id,
1163 GLenum pname,
1164 GLsizei bufSize,
1165 GLsizei *length,
1166 GLuint *params)
1167{
1168 getQueryObjectuiv(id, pname, params);
1169}
1170
Geoff Lang2186c382016-10-14 10:54:54 -04001171void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001172{
Geoff Lang2186c382016-10-14 10:54:54 -04001173 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001174}
1175
Brandon Jones59770802018-04-02 13:18:42 -07001176void Context::getQueryObjecti64vRobust(GLuint id,
1177 GLenum pname,
1178 GLsizei bufSize,
1179 GLsizei *length,
1180 GLint64 *params)
1181{
1182 getQueryObjecti64v(id, pname, params);
1183}
1184
Geoff Lang2186c382016-10-14 10:54:54 -04001185void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001186{
Geoff Lang2186c382016-10-14 10:54:54 -04001187 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001188}
1189
Brandon Jones59770802018-04-02 13:18:42 -07001190void Context::getQueryObjectui64vRobust(GLuint id,
1191 GLenum pname,
1192 GLsizei bufSize,
1193 GLsizei *length,
1194 GLuint64 *params)
1195{
1196 getQueryObjectui64v(id, pname, params);
1197}
1198
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001199Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001200{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001201 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001202}
1203
Jamie Madill2f348d22017-06-05 10:50:59 -04001204FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001205{
Jamie Madill96a483b2017-06-27 16:49:21 -04001206 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001207}
1208
Jamie Madill2f348d22017-06-05 10:50:59 -04001209Query *Context::getQuery(GLuint handle, bool create, GLenum type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001210{
Jamie Madill96a483b2017-06-27 16:49:21 -04001211 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001212 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001213 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001214 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001215
1216 Query *query = mQueryMap.query(handle);
1217 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001218 {
Jamie Madill96a483b2017-06-27 16:49:21 -04001219 query = new Query(mImplementation->createQuery(type), handle);
1220 query->addRef();
1221 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001222 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001223 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001224}
1225
Geoff Lang70d0f492015-12-10 17:45:46 -05001226Query *Context::getQuery(GLuint handle) const
1227{
Jamie Madill96a483b2017-06-27 16:49:21 -04001228 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001229}
1230
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001231Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001232{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001233 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1234 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001235}
1236
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001237Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001238{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001239 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001240}
1241
Geoff Lang492a7e42014-11-05 13:27:06 -05001242Compiler *Context::getCompiler() const
1243{
Jamie Madill2f348d22017-06-05 10:50:59 -04001244 if (mCompiler.get() == nullptr)
1245 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001246 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001247 }
1248 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001249}
1250
Jamie Madillc1d770e2017-04-13 17:31:24 -04001251void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001252{
1253 switch (pname)
1254 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001255 case GL_SHADER_COMPILER:
1256 *params = GL_TRUE;
1257 break;
1258 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1259 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1260 break;
1261 default:
1262 mGLState.getBooleanv(pname, params);
1263 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001264 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001265}
1266
Jamie Madillc1d770e2017-04-13 17:31:24 -04001267void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001268{
Shannon Woods53a94a82014-06-24 15:20:36 -04001269 // Queries about context capabilities and maximums are answered by Context.
1270 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001271 switch (pname)
1272 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001273 case GL_ALIASED_LINE_WIDTH_RANGE:
1274 params[0] = mCaps.minAliasedLineWidth;
1275 params[1] = mCaps.maxAliasedLineWidth;
1276 break;
1277 case GL_ALIASED_POINT_SIZE_RANGE:
1278 params[0] = mCaps.minAliasedPointSize;
1279 params[1] = mCaps.maxAliasedPointSize;
1280 break;
1281 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1282 ASSERT(mExtensions.textureFilterAnisotropic);
1283 *params = mExtensions.maxTextureAnisotropy;
1284 break;
1285 case GL_MAX_TEXTURE_LOD_BIAS:
1286 *params = mCaps.maxLODBias;
1287 break;
1288
1289 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1290 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1291 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001292 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1293 // GLES1 constants for modelview/projection matrix.
1294 if (getClientVersion() < Version(2, 0))
1295 {
1296 mGLState.getFloatv(pname, params);
1297 }
1298 else
1299 {
1300 ASSERT(mExtensions.pathRendering);
1301 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1302 memcpy(params, m, 16 * sizeof(GLfloat));
1303 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001304 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001305 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001306
Jamie Madill231c7f52017-04-26 13:45:37 -04001307 default:
1308 mGLState.getFloatv(pname, params);
1309 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001310 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001311}
1312
Jamie Madillc1d770e2017-04-13 17:31:24 -04001313void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001314{
Shannon Woods53a94a82014-06-24 15:20:36 -04001315 // Queries about context capabilities and maximums are answered by Context.
1316 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001317
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001318 switch (pname)
1319 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001320 case GL_MAX_VERTEX_ATTRIBS:
1321 *params = mCaps.maxVertexAttributes;
1322 break;
1323 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1324 *params = mCaps.maxVertexUniformVectors;
1325 break;
1326 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
1327 *params = mCaps.maxVertexUniformComponents;
1328 break;
1329 case GL_MAX_VARYING_VECTORS:
1330 *params = mCaps.maxVaryingVectors;
1331 break;
1332 case GL_MAX_VARYING_COMPONENTS:
1333 *params = mCaps.maxVertexOutputComponents;
1334 break;
1335 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1336 *params = mCaps.maxCombinedTextureImageUnits;
1337 break;
1338 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
1339 *params = mCaps.maxVertexTextureImageUnits;
1340 break;
1341 case GL_MAX_TEXTURE_IMAGE_UNITS:
1342 *params = mCaps.maxTextureImageUnits;
1343 break;
1344 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1345 *params = mCaps.maxFragmentUniformVectors;
1346 break;
1347 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
1348 *params = mCaps.maxFragmentUniformComponents;
1349 break;
1350 case GL_MAX_RENDERBUFFER_SIZE:
1351 *params = mCaps.maxRenderbufferSize;
1352 break;
1353 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1354 *params = mCaps.maxColorAttachments;
1355 break;
1356 case GL_MAX_DRAW_BUFFERS_EXT:
1357 *params = mCaps.maxDrawBuffers;
1358 break;
1359 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1360 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1361 case GL_SUBPIXEL_BITS:
1362 *params = 4;
1363 break;
1364 case GL_MAX_TEXTURE_SIZE:
1365 *params = mCaps.max2DTextureSize;
1366 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001367 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1368 *params = mCaps.maxRectangleTextureSize;
1369 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001370 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1371 *params = mCaps.maxCubeMapTextureSize;
1372 break;
1373 case GL_MAX_3D_TEXTURE_SIZE:
1374 *params = mCaps.max3DTextureSize;
1375 break;
1376 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1377 *params = mCaps.maxArrayTextureLayers;
1378 break;
1379 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1380 *params = mCaps.uniformBufferOffsetAlignment;
1381 break;
1382 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1383 *params = mCaps.maxUniformBufferBindings;
1384 break;
1385 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
1386 *params = mCaps.maxVertexUniformBlocks;
1387 break;
1388 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
1389 *params = mCaps.maxFragmentUniformBlocks;
1390 break;
1391 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1392 *params = mCaps.maxCombinedTextureImageUnits;
1393 break;
1394 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1395 *params = mCaps.maxVertexOutputComponents;
1396 break;
1397 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1398 *params = mCaps.maxFragmentInputComponents;
1399 break;
1400 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1401 *params = mCaps.minProgramTexelOffset;
1402 break;
1403 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1404 *params = mCaps.maxProgramTexelOffset;
1405 break;
1406 case GL_MAJOR_VERSION:
1407 *params = getClientVersion().major;
1408 break;
1409 case GL_MINOR_VERSION:
1410 *params = getClientVersion().minor;
1411 break;
1412 case GL_MAX_ELEMENTS_INDICES:
1413 *params = mCaps.maxElementsIndices;
1414 break;
1415 case GL_MAX_ELEMENTS_VERTICES:
1416 *params = mCaps.maxElementsVertices;
1417 break;
1418 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1419 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1420 break;
1421 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1422 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1423 break;
1424 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1425 *params = mCaps.maxTransformFeedbackSeparateComponents;
1426 break;
1427 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1428 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1429 break;
1430 case GL_MAX_SAMPLES_ANGLE:
1431 *params = mCaps.maxSamples;
1432 break;
1433 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001434 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001435 params[0] = mCaps.maxViewportWidth;
1436 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001437 }
1438 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001439 case GL_COMPRESSED_TEXTURE_FORMATS:
1440 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1441 params);
1442 break;
1443 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1444 *params = mResetStrategy;
1445 break;
1446 case GL_NUM_SHADER_BINARY_FORMATS:
1447 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1448 break;
1449 case GL_SHADER_BINARY_FORMATS:
1450 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1451 break;
1452 case GL_NUM_PROGRAM_BINARY_FORMATS:
1453 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1454 break;
1455 case GL_PROGRAM_BINARY_FORMATS:
1456 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1457 break;
1458 case GL_NUM_EXTENSIONS:
1459 *params = static_cast<GLint>(mExtensionStrings.size());
1460 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001461
Jamie Madill231c7f52017-04-26 13:45:37 -04001462 // GL_KHR_debug
1463 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1464 *params = mExtensions.maxDebugMessageLength;
1465 break;
1466 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1467 *params = mExtensions.maxDebugLoggedMessages;
1468 break;
1469 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1470 *params = mExtensions.maxDebugGroupStackDepth;
1471 break;
1472 case GL_MAX_LABEL_LENGTH:
1473 *params = mExtensions.maxLabelLength;
1474 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001475
Martin Radeve5285d22017-07-14 16:23:53 +03001476 // GL_ANGLE_multiview
1477 case GL_MAX_VIEWS_ANGLE:
1478 *params = mExtensions.maxViews;
1479 break;
1480
Jamie Madill231c7f52017-04-26 13:45:37 -04001481 // GL_EXT_disjoint_timer_query
1482 case GL_GPU_DISJOINT_EXT:
1483 *params = mImplementation->getGPUDisjoint();
1484 break;
1485 case GL_MAX_FRAMEBUFFER_WIDTH:
1486 *params = mCaps.maxFramebufferWidth;
1487 break;
1488 case GL_MAX_FRAMEBUFFER_HEIGHT:
1489 *params = mCaps.maxFramebufferHeight;
1490 break;
1491 case GL_MAX_FRAMEBUFFER_SAMPLES:
1492 *params = mCaps.maxFramebufferSamples;
1493 break;
1494 case GL_MAX_SAMPLE_MASK_WORDS:
1495 *params = mCaps.maxSampleMaskWords;
1496 break;
1497 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1498 *params = mCaps.maxColorTextureSamples;
1499 break;
1500 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1501 *params = mCaps.maxDepthTextureSamples;
1502 break;
1503 case GL_MAX_INTEGER_SAMPLES:
1504 *params = mCaps.maxIntegerSamples;
1505 break;
1506 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1507 *params = mCaps.maxVertexAttribRelativeOffset;
1508 break;
1509 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1510 *params = mCaps.maxVertexAttribBindings;
1511 break;
1512 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1513 *params = mCaps.maxVertexAttribStride;
1514 break;
1515 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
1516 *params = mCaps.maxVertexAtomicCounterBuffers;
1517 break;
1518 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
1519 *params = mCaps.maxVertexAtomicCounters;
1520 break;
1521 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
1522 *params = mCaps.maxVertexImageUniforms;
1523 break;
1524 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
1525 *params = mCaps.maxVertexShaderStorageBlocks;
1526 break;
1527 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
1528 *params = mCaps.maxFragmentAtomicCounterBuffers;
1529 break;
1530 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
1531 *params = mCaps.maxFragmentAtomicCounters;
1532 break;
1533 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
1534 *params = mCaps.maxFragmentImageUniforms;
1535 break;
1536 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
1537 *params = mCaps.maxFragmentShaderStorageBlocks;
1538 break;
1539 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1540 *params = mCaps.minProgramTextureGatherOffset;
1541 break;
1542 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1543 *params = mCaps.maxProgramTextureGatherOffset;
1544 break;
1545 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1546 *params = mCaps.maxComputeWorkGroupInvocations;
1547 break;
1548 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
1549 *params = mCaps.maxComputeUniformBlocks;
1550 break;
1551 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
1552 *params = mCaps.maxComputeTextureImageUnits;
1553 break;
1554 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1555 *params = mCaps.maxComputeSharedMemorySize;
1556 break;
1557 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
1558 *params = mCaps.maxComputeUniformComponents;
1559 break;
1560 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
1561 *params = mCaps.maxComputeAtomicCounterBuffers;
1562 break;
1563 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
1564 *params = mCaps.maxComputeAtomicCounters;
1565 break;
1566 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
1567 *params = mCaps.maxComputeImageUniforms;
1568 break;
1569 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
1570 *params = mCaps.maxCombinedComputeUniformComponents;
1571 break;
1572 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
1573 *params = mCaps.maxComputeShaderStorageBlocks;
1574 break;
1575 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1576 *params = mCaps.maxCombinedShaderOutputResources;
1577 break;
1578 case GL_MAX_UNIFORM_LOCATIONS:
1579 *params = mCaps.maxUniformLocations;
1580 break;
1581 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1582 *params = mCaps.maxAtomicCounterBufferBindings;
1583 break;
1584 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1585 *params = mCaps.maxAtomicCounterBufferSize;
1586 break;
1587 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1588 *params = mCaps.maxCombinedAtomicCounterBuffers;
1589 break;
1590 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1591 *params = mCaps.maxCombinedAtomicCounters;
1592 break;
1593 case GL_MAX_IMAGE_UNITS:
1594 *params = mCaps.maxImageUnits;
1595 break;
1596 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1597 *params = mCaps.maxCombinedImageUniforms;
1598 break;
1599 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1600 *params = mCaps.maxShaderStorageBufferBindings;
1601 break;
1602 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1603 *params = mCaps.maxCombinedShaderStorageBlocks;
1604 break;
1605 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1606 *params = mCaps.shaderStorageBufferOffsetAlignment;
1607 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001608
1609 // GL_EXT_geometry_shader
1610 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1611 *params = mCaps.maxFramebufferLayers;
1612 break;
1613 case GL_LAYER_PROVOKING_VERTEX_EXT:
1614 *params = mCaps.layerProvokingVertex;
1615 break;
1616 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1617 *params = mCaps.maxGeometryUniformComponents;
1618 break;
1619 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
1620 *params = mCaps.maxGeometryUniformBlocks;
1621 break;
1622 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1623 *params = mCaps.maxCombinedGeometryUniformComponents;
1624 break;
1625 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1626 *params = mCaps.maxGeometryInputComponents;
1627 break;
1628 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1629 *params = mCaps.maxGeometryOutputComponents;
1630 break;
1631 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1632 *params = mCaps.maxGeometryOutputVertices;
1633 break;
1634 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1635 *params = mCaps.maxGeometryTotalOutputComponents;
1636 break;
1637 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1638 *params = mCaps.maxGeometryShaderInvocations;
1639 break;
1640 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
1641 *params = mCaps.maxGeometryTextureImageUnits;
1642 break;
1643 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
1644 *params = mCaps.maxGeometryAtomicCounterBuffers;
1645 break;
1646 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
1647 *params = mCaps.maxGeometryAtomicCounters;
1648 break;
1649 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
1650 *params = mCaps.maxGeometryImageUniforms;
1651 break;
1652 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
1653 *params = mCaps.maxGeometryShaderStorageBlocks;
1654 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001655 // GLES1 emulation: Caps queries
1656 case GL_MAX_TEXTURE_UNITS:
1657 *params = mCaps.maxMultitextureUnits;
1658 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001659 case GL_MAX_MODELVIEW_STACK_DEPTH:
1660 *params = mCaps.maxModelviewMatrixStackDepth;
1661 break;
1662 case GL_MAX_PROJECTION_STACK_DEPTH:
1663 *params = mCaps.maxProjectionMatrixStackDepth;
1664 break;
1665 case GL_MAX_TEXTURE_STACK_DEPTH:
1666 *params = mCaps.maxTextureMatrixStackDepth;
1667 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001668 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001669 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001670 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001671 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001672}
1673
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001674void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001675{
Shannon Woods53a94a82014-06-24 15:20:36 -04001676 // Queries about context capabilities and maximums are answered by Context.
1677 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001678 switch (pname)
1679 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001680 case GL_MAX_ELEMENT_INDEX:
1681 *params = mCaps.maxElementIndex;
1682 break;
1683 case GL_MAX_UNIFORM_BLOCK_SIZE:
1684 *params = mCaps.maxUniformBlockSize;
1685 break;
1686 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
1687 *params = mCaps.maxCombinedVertexUniformComponents;
1688 break;
1689 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
1690 *params = mCaps.maxCombinedFragmentUniformComponents;
1691 break;
1692 case GL_MAX_SERVER_WAIT_TIMEOUT:
1693 *params = mCaps.maxServerWaitTimeout;
1694 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001695
Jamie Madill231c7f52017-04-26 13:45:37 -04001696 // GL_EXT_disjoint_timer_query
1697 case GL_TIMESTAMP_EXT:
1698 *params = mImplementation->getTimestamp();
1699 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001700
Jamie Madill231c7f52017-04-26 13:45:37 -04001701 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1702 *params = mCaps.maxShaderStorageBlockSize;
1703 break;
1704 default:
1705 UNREACHABLE();
1706 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001707 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001708}
1709
Geoff Lang70d0f492015-12-10 17:45:46 -05001710void Context::getPointerv(GLenum pname, void **params) const
1711{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001712 mGLState.getPointerv(pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001713}
1714
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001715void Context::getPointervRobustANGLERobust(GLenum pname,
1716 GLsizei bufSize,
1717 GLsizei *length,
1718 void **params)
1719{
1720 UNIMPLEMENTED();
1721}
1722
Martin Radev66fb8202016-07-28 11:45:20 +03001723void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001724{
Shannon Woods53a94a82014-06-24 15:20:36 -04001725 // Queries about context capabilities and maximums are answered by Context.
1726 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001727
1728 GLenum nativeType;
1729 unsigned int numParams;
1730 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1731 ASSERT(queryStatus);
1732
1733 if (nativeType == GL_INT)
1734 {
1735 switch (target)
1736 {
1737 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1738 ASSERT(index < 3u);
1739 *data = mCaps.maxComputeWorkGroupCount[index];
1740 break;
1741 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1742 ASSERT(index < 3u);
1743 *data = mCaps.maxComputeWorkGroupSize[index];
1744 break;
1745 default:
1746 mGLState.getIntegeri_v(target, index, data);
1747 }
1748 }
1749 else
1750 {
1751 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1752 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001753}
1754
Brandon Jones59770802018-04-02 13:18:42 -07001755void Context::getIntegeri_vRobust(GLenum target,
1756 GLuint index,
1757 GLsizei bufSize,
1758 GLsizei *length,
1759 GLint *data)
1760{
1761 getIntegeri_v(target, index, data);
1762}
1763
Martin Radev66fb8202016-07-28 11:45:20 +03001764void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001765{
Shannon Woods53a94a82014-06-24 15:20:36 -04001766 // Queries about context capabilities and maximums are answered by Context.
1767 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001768
1769 GLenum nativeType;
1770 unsigned int numParams;
1771 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1772 ASSERT(queryStatus);
1773
1774 if (nativeType == GL_INT_64_ANGLEX)
1775 {
1776 mGLState.getInteger64i_v(target, index, data);
1777 }
1778 else
1779 {
1780 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1781 }
1782}
1783
Brandon Jones59770802018-04-02 13:18:42 -07001784void Context::getInteger64i_vRobust(GLenum target,
1785 GLuint index,
1786 GLsizei bufSize,
1787 GLsizei *length,
1788 GLint64 *data)
1789{
1790 getInteger64i_v(target, index, data);
1791}
1792
Martin Radev66fb8202016-07-28 11:45:20 +03001793void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1794{
1795 // Queries about context capabilities and maximums are answered by Context.
1796 // Queries about current GL state values are answered by State.
1797
1798 GLenum nativeType;
1799 unsigned int numParams;
1800 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1801 ASSERT(queryStatus);
1802
1803 if (nativeType == GL_BOOL)
1804 {
1805 mGLState.getBooleani_v(target, index, data);
1806 }
1807 else
1808 {
1809 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1810 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001811}
1812
Brandon Jones59770802018-04-02 13:18:42 -07001813void Context::getBooleani_vRobust(GLenum target,
1814 GLuint index,
1815 GLsizei bufSize,
1816 GLsizei *length,
1817 GLboolean *data)
1818{
1819 getBooleani_v(target, index, data);
1820}
1821
Corentin Wallez336129f2017-10-17 15:55:40 -04001822void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001823{
1824 Buffer *buffer = mGLState.getTargetBuffer(target);
1825 QueryBufferParameteriv(buffer, pname, params);
1826}
1827
Brandon Jones59770802018-04-02 13:18:42 -07001828void Context::getBufferParameterivRobust(BufferBinding target,
1829 GLenum pname,
1830 GLsizei bufSize,
1831 GLsizei *length,
1832 GLint *params)
1833{
1834 getBufferParameteriv(target, pname, params);
1835}
1836
He Yunchao010e4db2017-03-03 14:22:06 +08001837void Context::getFramebufferAttachmentParameteriv(GLenum target,
1838 GLenum attachment,
1839 GLenum pname,
1840 GLint *params)
1841{
1842 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08001843 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08001844}
1845
Brandon Jones59770802018-04-02 13:18:42 -07001846void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
1847 GLenum attachment,
1848 GLenum pname,
1849 GLsizei bufSize,
1850 GLsizei *length,
1851 GLint *params)
1852{
1853 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
1854}
1855
He Yunchao010e4db2017-03-03 14:22:06 +08001856void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
1857{
1858 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
1859 QueryRenderbufferiv(this, renderbuffer, pname, params);
1860}
1861
Brandon Jones59770802018-04-02 13:18:42 -07001862void Context::getRenderbufferParameterivRobust(GLenum target,
1863 GLenum pname,
1864 GLsizei bufSize,
1865 GLsizei *length,
1866 GLint *params)
1867{
1868 getRenderbufferParameteriv(target, pname, params);
1869}
1870
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001871void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001872{
1873 Texture *texture = getTargetTexture(target);
1874 QueryTexParameterfv(texture, pname, params);
1875}
1876
Brandon Jones59770802018-04-02 13:18:42 -07001877void Context::getTexParameterfvRobust(TextureType target,
1878 GLenum pname,
1879 GLsizei bufSize,
1880 GLsizei *length,
1881 GLfloat *params)
1882{
1883 getTexParameterfv(target, pname, params);
1884}
1885
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001886void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001887{
1888 Texture *texture = getTargetTexture(target);
1889 QueryTexParameteriv(texture, pname, params);
1890}
Jiajia Qin5451d532017-11-16 17:16:34 +08001891
Brandon Jones59770802018-04-02 13:18:42 -07001892void Context::getTexParameterivRobust(TextureType target,
1893 GLenum pname,
1894 GLsizei bufSize,
1895 GLsizei *length,
1896 GLint *params)
1897{
1898 getTexParameteriv(target, pname, params);
1899}
1900
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001901void Context::getTexParameterIivRobust(TextureType target,
1902 GLenum pname,
1903 GLsizei bufSize,
1904 GLsizei *length,
1905 GLint *params)
1906{
1907 UNIMPLEMENTED();
1908}
1909
1910void Context::getTexParameterIuivRobust(TextureType target,
1911 GLenum pname,
1912 GLsizei bufSize,
1913 GLsizei *length,
1914 GLuint *params)
1915{
1916 UNIMPLEMENTED();
1917}
1918
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001919void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08001920{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001921 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05001922 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08001923}
1924
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001925void Context::getTexLevelParameterivRobust(TextureTarget target,
1926 GLint level,
1927 GLenum pname,
1928 GLsizei bufSize,
1929 GLsizei *length,
1930 GLint *params)
1931{
1932 UNIMPLEMENTED();
1933}
1934
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001935void Context::getTexLevelParameterfv(TextureTarget target,
1936 GLint level,
1937 GLenum pname,
1938 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08001939{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001940 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05001941 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08001942}
1943
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001944void Context::getTexLevelParameterfvRobust(TextureTarget target,
1945 GLint level,
1946 GLenum pname,
1947 GLsizei bufSize,
1948 GLsizei *length,
1949 GLfloat *params)
1950{
1951 UNIMPLEMENTED();
1952}
1953
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001954void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08001955{
1956 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001957 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001958 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001959}
1960
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001961void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001962{
1963 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001964 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001965 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001966}
1967
Brandon Jones59770802018-04-02 13:18:42 -07001968void Context::texParameterfvRobust(TextureType target,
1969 GLenum pname,
1970 GLsizei bufSize,
1971 const GLfloat *params)
1972{
1973 texParameterfv(target, pname, params);
1974}
1975
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001976void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08001977{
1978 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001979 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001980 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001981}
1982
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001983void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001984{
1985 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001986 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001987 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001988}
1989
Brandon Jones59770802018-04-02 13:18:42 -07001990void Context::texParameterivRobust(TextureType target,
1991 GLenum pname,
1992 GLsizei bufSize,
1993 const GLint *params)
1994{
1995 texParameteriv(target, pname, params);
1996}
1997
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001998void Context::texParameterIivRobust(TextureType target,
1999 GLenum pname,
2000 GLsizei bufSize,
2001 const GLint *params)
2002{
2003 UNIMPLEMENTED();
2004}
2005
2006void Context::texParameterIuivRobust(TextureType target,
2007 GLenum pname,
2008 GLsizei bufSize,
2009 const GLuint *params)
2010{
2011 UNIMPLEMENTED();
2012}
2013
Jamie Madill675fe712016-12-19 13:07:54 -05002014void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002015{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002016 // No-op if zero count
2017 if (count == 0)
2018 {
2019 return;
2020 }
2021
Jamie Madill05b35b22017-10-03 09:01:44 -04002022 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002023 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002024 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002025}
2026
Jamie Madill675fe712016-12-19 13:07:54 -05002027void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002028{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002029 // No-op if zero count
2030 if (count == 0 || instanceCount == 0)
2031 {
2032 return;
2033 }
2034
Jamie Madill05b35b22017-10-03 09:01:44 -04002035 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002036 ANGLE_CONTEXT_TRY(
2037 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002038 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2039 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002040}
2041
Jamie Madill876429b2017-04-20 15:46:24 -04002042void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002043{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002044 // No-op if zero count
2045 if (count == 0)
2046 {
2047 return;
2048 }
2049
Jamie Madill05b35b22017-10-03 09:01:44 -04002050 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002051 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002052}
2053
Jamie Madill675fe712016-12-19 13:07:54 -05002054void Context::drawElementsInstanced(GLenum mode,
2055 GLsizei count,
2056 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002057 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002058 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002059{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002060 // No-op if zero count
2061 if (count == 0 || instances == 0)
2062 {
2063 return;
2064 }
2065
Jamie Madill05b35b22017-10-03 09:01:44 -04002066 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002067 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002068 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002069}
2070
Jamie Madill675fe712016-12-19 13:07:54 -05002071void Context::drawRangeElements(GLenum mode,
2072 GLuint start,
2073 GLuint end,
2074 GLsizei count,
2075 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002076 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002077{
Jamie Madill9fdaa492018-02-16 10:52:11 -05002078 // No-op if zero count
2079 if (count == 0)
2080 {
2081 return;
2082 }
2083
Jamie Madill05b35b22017-10-03 09:01:44 -04002084 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002085 ANGLE_CONTEXT_TRY(
2086 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002087}
2088
Jamie Madill876429b2017-04-20 15:46:24 -04002089void Context::drawArraysIndirect(GLenum mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002090{
Jamie Madill05b35b22017-10-03 09:01:44 -04002091 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002092 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002093}
2094
Jamie Madill876429b2017-04-20 15:46:24 -04002095void Context::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002096{
Jamie Madill05b35b22017-10-03 09:01:44 -04002097 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04002098 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002099}
2100
Jamie Madill675fe712016-12-19 13:07:54 -05002101void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002102{
Jamie Madillafa02a22017-11-23 12:57:38 -05002103 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002104}
2105
Jamie Madill675fe712016-12-19 13:07:54 -05002106void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002107{
Jamie Madillafa02a22017-11-23 12:57:38 -05002108 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002109}
2110
Austin Kinross6ee1e782015-05-29 17:05:37 -07002111void Context::insertEventMarker(GLsizei length, const char *marker)
2112{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002113 ASSERT(mImplementation);
2114 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002115}
2116
2117void Context::pushGroupMarker(GLsizei length, const char *marker)
2118{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002119 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002120
2121 if (marker == nullptr)
2122 {
2123 // From the EXT_debug_marker spec,
2124 // "If <marker> is null then an empty string is pushed on the stack."
2125 mImplementation->pushGroupMarker(length, "");
2126 }
2127 else
2128 {
2129 mImplementation->pushGroupMarker(length, marker);
2130 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002131}
2132
2133void Context::popGroupMarker()
2134{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002135 ASSERT(mImplementation);
2136 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002137}
2138
Geoff Langd8605522016-04-13 10:19:12 -04002139void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2140{
2141 Program *programObject = getProgram(program);
2142 ASSERT(programObject);
2143
2144 programObject->bindUniformLocation(location, name);
2145}
2146
Brandon Jones59770802018-04-02 13:18:42 -07002147void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002148{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002149 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002150}
2151
Brandon Jones59770802018-04-02 13:18:42 -07002152void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002153{
2154 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2155}
2156
Brandon Jones59770802018-04-02 13:18:42 -07002157void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002158{
2159 GLfloat I[16];
2160 angle::Matrix<GLfloat>::setToIdentity(I);
2161
2162 mGLState.loadPathRenderingMatrix(matrixMode, I);
2163}
2164
2165void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2166{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002167 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002168 if (!pathObj)
2169 return;
2170
2171 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002172 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002173
2174 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2175}
2176
2177void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2178{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002179 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002180 if (!pathObj)
2181 return;
2182
2183 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002184 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002185
2186 mImplementation->stencilStrokePath(pathObj, reference, mask);
2187}
2188
2189void Context::coverFillPath(GLuint path, GLenum coverMode)
2190{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002191 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002192 if (!pathObj)
2193 return;
2194
2195 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002196 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002197
2198 mImplementation->coverFillPath(pathObj, coverMode);
2199}
2200
2201void Context::coverStrokePath(GLuint path, GLenum coverMode)
2202{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002203 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002204 if (!pathObj)
2205 return;
2206
2207 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002208 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002209
2210 mImplementation->coverStrokePath(pathObj, coverMode);
2211}
2212
2213void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2214{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002215 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002216 if (!pathObj)
2217 return;
2218
2219 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002220 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002221
2222 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2223}
2224
2225void Context::stencilThenCoverStrokePath(GLuint path,
2226 GLint reference,
2227 GLuint mask,
2228 GLenum coverMode)
2229{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002230 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002231 if (!pathObj)
2232 return;
2233
2234 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002235 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002236
2237 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2238}
2239
Sami Väisänend59ca052016-06-21 16:10:00 +03002240void Context::coverFillPathInstanced(GLsizei numPaths,
2241 GLenum pathNameType,
2242 const void *paths,
2243 GLuint pathBase,
2244 GLenum coverMode,
2245 GLenum transformType,
2246 const GLfloat *transformValues)
2247{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002248 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002249
2250 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002251 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002252
2253 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2254}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002255
Sami Väisänend59ca052016-06-21 16:10:00 +03002256void Context::coverStrokePathInstanced(GLsizei numPaths,
2257 GLenum pathNameType,
2258 const void *paths,
2259 GLuint pathBase,
2260 GLenum coverMode,
2261 GLenum transformType,
2262 const GLfloat *transformValues)
2263{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002264 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002265
2266 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002267 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002268
2269 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2270 transformValues);
2271}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002272
Sami Väisänend59ca052016-06-21 16:10:00 +03002273void Context::stencilFillPathInstanced(GLsizei numPaths,
2274 GLenum pathNameType,
2275 const void *paths,
2276 GLuint pathBase,
2277 GLenum fillMode,
2278 GLuint mask,
2279 GLenum transformType,
2280 const GLfloat *transformValues)
2281{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002282 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002283
2284 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002285 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002286
2287 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2288 transformValues);
2289}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002290
Sami Väisänend59ca052016-06-21 16:10:00 +03002291void Context::stencilStrokePathInstanced(GLsizei numPaths,
2292 GLenum pathNameType,
2293 const void *paths,
2294 GLuint pathBase,
2295 GLint reference,
2296 GLuint mask,
2297 GLenum transformType,
2298 const GLfloat *transformValues)
2299{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002300 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002301
2302 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002303 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002304
2305 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2306 transformValues);
2307}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002308
Sami Väisänend59ca052016-06-21 16:10:00 +03002309void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2310 GLenum pathNameType,
2311 const void *paths,
2312 GLuint pathBase,
2313 GLenum fillMode,
2314 GLuint mask,
2315 GLenum coverMode,
2316 GLenum transformType,
2317 const GLfloat *transformValues)
2318{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002319 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002320
2321 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002322 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002323
2324 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2325 transformType, transformValues);
2326}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002327
Sami Väisänend59ca052016-06-21 16:10:00 +03002328void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2329 GLenum pathNameType,
2330 const void *paths,
2331 GLuint pathBase,
2332 GLint reference,
2333 GLuint mask,
2334 GLenum coverMode,
2335 GLenum transformType,
2336 const GLfloat *transformValues)
2337{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002338 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002339
2340 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Langa8cb2872018-03-09 16:09:40 -05002341 ANGLE_CONTEXT_TRY(syncState());
Sami Väisänend59ca052016-06-21 16:10:00 +03002342
2343 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2344 transformType, transformValues);
2345}
2346
Sami Väisänen46eaa942016-06-29 10:26:37 +03002347void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2348{
2349 auto *programObject = getProgram(program);
2350
2351 programObject->bindFragmentInputLocation(location, name);
2352}
2353
2354void Context::programPathFragmentInputGen(GLuint program,
2355 GLint location,
2356 GLenum genMode,
2357 GLint components,
2358 const GLfloat *coeffs)
2359{
2360 auto *programObject = getProgram(program);
2361
Jamie Madillbd044ed2017-06-05 12:59:21 -04002362 programObject->pathFragmentInputGen(this, location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002363}
2364
jchen1015015f72017-03-16 13:54:21 +08002365GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2366{
jchen10fd7c3b52017-03-21 15:36:03 +08002367 const auto *programObject = getProgram(program);
jchen1015015f72017-03-16 13:54:21 +08002368 return QueryProgramResourceIndex(programObject, programInterface, name);
2369}
2370
jchen10fd7c3b52017-03-21 15:36:03 +08002371void Context::getProgramResourceName(GLuint program,
2372 GLenum programInterface,
2373 GLuint index,
2374 GLsizei bufSize,
2375 GLsizei *length,
2376 GLchar *name)
2377{
2378 const auto *programObject = getProgram(program);
2379 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2380}
2381
jchen10191381f2017-04-11 13:59:04 +08002382GLint Context::getProgramResourceLocation(GLuint program,
2383 GLenum programInterface,
2384 const GLchar *name)
2385{
2386 const auto *programObject = getProgram(program);
2387 return QueryProgramResourceLocation(programObject, programInterface, name);
2388}
2389
jchen10880683b2017-04-12 16:21:55 +08002390void Context::getProgramResourceiv(GLuint program,
2391 GLenum programInterface,
2392 GLuint index,
2393 GLsizei propCount,
2394 const GLenum *props,
2395 GLsizei bufSize,
2396 GLsizei *length,
2397 GLint *params)
2398{
2399 const auto *programObject = getProgram(program);
2400 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2401 length, params);
2402}
2403
jchen10d9cd7b72017-08-30 15:04:25 +08002404void Context::getProgramInterfaceiv(GLuint program,
2405 GLenum programInterface,
2406 GLenum pname,
2407 GLint *params)
2408{
2409 const auto *programObject = getProgram(program);
2410 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2411}
2412
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002413void Context::getProgramInterfaceivRobust(GLuint program,
2414 GLenum programInterface,
2415 GLenum pname,
2416 GLsizei bufSize,
2417 GLsizei *length,
2418 GLint *params)
2419{
2420 UNIMPLEMENTED();
2421}
2422
Jamie Madill71c88b32017-09-14 22:20:29 -04002423void Context::handleError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002424{
Geoff Langda5777c2014-07-11 09:52:58 -04002425 if (error.isError())
2426 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002427 GLenum code = error.getCode();
2428 mErrors.insert(code);
2429 if (code == GL_OUT_OF_MEMORY && getWorkarounds().loseContextOnOutOfMemory)
2430 {
2431 markContextLost();
2432 }
Geoff Lang70d0f492015-12-10 17:45:46 -05002433
Geoff Langee6884e2017-11-09 16:51:11 -05002434 ASSERT(!error.getMessage().empty());
2435 mGLState.getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
2436 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
Geoff Langda5777c2014-07-11 09:52:58 -04002437 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002438}
2439
2440// Get one of the recorded errors and clear its flag, if any.
2441// [OpenGL ES 2.0.24] section 2.5 page 13.
2442GLenum Context::getError()
2443{
Geoff Langda5777c2014-07-11 09:52:58 -04002444 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002445 {
Geoff Langda5777c2014-07-11 09:52:58 -04002446 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002447 }
Geoff Langda5777c2014-07-11 09:52:58 -04002448 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002449 {
Geoff Langda5777c2014-07-11 09:52:58 -04002450 GLenum error = *mErrors.begin();
2451 mErrors.erase(mErrors.begin());
2452 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002453 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002454}
2455
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002456// NOTE: this function should not assume that this context is current!
2457void Context::markContextLost()
2458{
2459 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002460 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002461 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002462 mContextLostForced = true;
2463 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002464 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002465}
2466
2467bool Context::isContextLost()
2468{
2469 return mContextLost;
2470}
2471
Jamie Madillfa920eb2018-01-04 11:45:50 -05002472GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002473{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002474 // Even if the application doesn't want to know about resets, we want to know
2475 // as it will allow us to skip all the calls.
2476 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002477 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002478 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002479 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002480 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002481 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002482
2483 // EXT_robustness, section 2.6: If the reset notification behavior is
2484 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2485 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2486 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002487 }
2488
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002489 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2490 // status should be returned at least once, and GL_NO_ERROR should be returned
2491 // once the device has finished resetting.
2492 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002493 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002494 ASSERT(mResetStatus == GL_NO_ERROR);
2495 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002496
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002497 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002498 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002499 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002500 }
2501 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002502 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002503 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002504 // If markContextLost was used to mark the context lost then
2505 // assume that is not recoverable, and continue to report the
2506 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002507 mResetStatus = mImplementation->getResetStatus();
2508 }
Jamie Madill893ab082014-05-16 16:56:10 -04002509
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002510 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002511}
2512
2513bool Context::isResetNotificationEnabled()
2514{
2515 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2516}
2517
Corentin Walleze3b10e82015-05-20 11:06:25 -04002518const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002519{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002520 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002521}
2522
2523EGLenum Context::getClientType() const
2524{
2525 return mClientType;
2526}
2527
2528EGLenum Context::getRenderBuffer() const
2529{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002530 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2531 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002532 {
2533 return EGL_NONE;
2534 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002535
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002536 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002537 ASSERT(backAttachment != nullptr);
2538 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002539}
2540
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002541VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002542{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002543 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002544 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2545 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002546 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002547 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2548 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002549
Jamie Madill96a483b2017-06-27 16:49:21 -04002550 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002551 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002552
2553 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002554}
2555
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002556TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002557{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002558 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002559 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2560 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002561 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002562 transformFeedback =
2563 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002564 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002565 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002566 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002567
2568 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002569}
2570
2571bool Context::isVertexArrayGenerated(GLuint vertexArray)
2572{
Jamie Madill96a483b2017-06-27 16:49:21 -04002573 ASSERT(mVertexArrayMap.contains(0));
2574 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002575}
2576
2577bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2578{
Jamie Madill96a483b2017-06-27 16:49:21 -04002579 ASSERT(mTransformFeedbackMap.contains(0));
2580 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002581}
2582
Shannon Woods53a94a82014-06-24 15:20:36 -04002583void Context::detachTexture(GLuint texture)
2584{
2585 // Simple pass-through to State's detachTexture method, as textures do not require
2586 // allocation map management either here or in the resource manager at detach time.
2587 // Zero textures are held by the Context, and we don't attempt to request them from
2588 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002589 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002590}
2591
James Darpinian4d9d4832018-03-13 12:43:28 -07002592void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002593{
Yuly Novikov5807a532015-12-03 13:01:22 -05002594 // Simple pass-through to State's detachBuffer method, since
2595 // only buffer attachments to container objects that are bound to the current context
2596 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002597
Yuly Novikov5807a532015-12-03 13:01:22 -05002598 // [OpenGL ES 3.2] section 5.1.2 page 45:
2599 // Attachments to unbound container objects, such as
2600 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2601 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002602 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002603}
2604
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002605void Context::detachFramebuffer(GLuint framebuffer)
2606{
Shannon Woods53a94a82014-06-24 15:20:36 -04002607 // Framebuffer detachment is handled by Context, because 0 is a valid
2608 // Framebuffer object, and a pointer to it must be passed from Context
2609 // to State at binding time.
2610
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002611 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002612 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2613 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2614 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002615
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002616 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002617 {
2618 bindReadFramebuffer(0);
2619 }
2620
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002621 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002622 {
2623 bindDrawFramebuffer(0);
2624 }
2625}
2626
2627void Context::detachRenderbuffer(GLuint renderbuffer)
2628{
Jamie Madilla02315b2017-02-23 14:14:47 -05002629 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002630}
2631
Jamie Madill57a89722013-07-02 11:57:03 -04002632void Context::detachVertexArray(GLuint vertexArray)
2633{
Jamie Madill77a72f62015-04-14 11:18:32 -04002634 // Vertex array detachment is handled by Context, because 0 is a valid
2635 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002636 // binding time.
2637
Jamie Madill57a89722013-07-02 11:57:03 -04002638 // [OpenGL ES 3.0.2] section 2.10 page 43:
2639 // If a vertex array object that is currently bound is deleted, the binding
2640 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002641 if (mGLState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002642 {
2643 bindVertexArray(0);
2644 }
2645}
2646
Geoff Langc8058452014-02-03 12:04:11 -05002647void Context::detachTransformFeedback(GLuint transformFeedback)
2648{
Corentin Walleza2257da2016-04-19 16:43:12 -04002649 // Transform feedback detachment is handled by Context, because 0 is a valid
2650 // transform feedback, and a pointer to it must be passed from Context to State at
2651 // binding time.
2652
2653 // The OpenGL specification doesn't mention what should happen when the currently bound
2654 // transform feedback object is deleted. Since it is a container object, we treat it like
2655 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002656 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002657 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002658 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002659 }
Geoff Langc8058452014-02-03 12:04:11 -05002660}
2661
Jamie Madilldc356042013-07-19 16:36:57 -04002662void Context::detachSampler(GLuint sampler)
2663{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002664 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002665}
2666
Yunchao Hea336b902017-08-02 16:05:21 +08002667void Context::detachProgramPipeline(GLuint pipeline)
2668{
2669 mGLState.detachProgramPipeline(this, pipeline);
2670}
2671
Jamie Madill3ef140a2017-08-26 23:11:21 -04002672void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002673{
Shaodde78e82017-05-22 14:13:27 +08002674 mGLState.setVertexAttribDivisor(this, index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002675}
2676
Jamie Madille29d1672013-07-19 16:36:57 -04002677void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2678{
Geoff Langc1984ed2016-10-07 12:41:00 -04002679 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002680 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002681 SetSamplerParameteri(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002682 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002683}
Jamie Madille29d1672013-07-19 16:36:57 -04002684
Geoff Langc1984ed2016-10-07 12:41:00 -04002685void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2686{
2687 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002688 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002689 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002690 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002691}
2692
Brandon Jones59770802018-04-02 13:18:42 -07002693void Context::samplerParameterivRobust(GLuint sampler,
2694 GLenum pname,
2695 GLsizei bufSize,
2696 const GLint *param)
2697{
2698 samplerParameteriv(sampler, pname, param);
2699}
2700
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002701void Context::samplerParameterIivRobust(GLuint sampler,
2702 GLenum pname,
2703 GLsizei bufSize,
2704 const GLint *param)
2705{
2706 UNIMPLEMENTED();
2707}
2708
2709void Context::samplerParameterIuivRobust(GLuint sampler,
2710 GLenum pname,
2711 GLsizei bufSize,
2712 const GLuint *param)
2713{
2714 UNIMPLEMENTED();
2715}
2716
Jamie Madille29d1672013-07-19 16:36:57 -04002717void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2718{
Geoff Langc1984ed2016-10-07 12:41:00 -04002719 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002720 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002721 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002722 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002723}
2724
Geoff Langc1984ed2016-10-07 12:41:00 -04002725void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002726{
Geoff Langc1984ed2016-10-07 12:41:00 -04002727 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002728 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002729 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002730 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002731}
2732
Brandon Jones59770802018-04-02 13:18:42 -07002733void Context::samplerParameterfvRobust(GLuint sampler,
2734 GLenum pname,
2735 GLsizei bufSize,
2736 const GLfloat *param)
2737{
2738 samplerParameterfv(sampler, pname, param);
2739}
2740
Geoff Langc1984ed2016-10-07 12:41:00 -04002741void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002742{
Geoff Langc1984ed2016-10-07 12:41:00 -04002743 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002744 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002745 QuerySamplerParameteriv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002746 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002747}
Jamie Madill9675b802013-07-19 16:36:59 -04002748
Brandon Jones59770802018-04-02 13:18:42 -07002749void Context::getSamplerParameterivRobust(GLuint sampler,
2750 GLenum pname,
2751 GLsizei bufSize,
2752 GLsizei *length,
2753 GLint *params)
2754{
2755 getSamplerParameteriv(sampler, pname, params);
2756}
2757
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002758void Context::getSamplerParameterIivRobust(GLuint sampler,
2759 GLenum pname,
2760 GLsizei bufSize,
2761 GLsizei *length,
2762 GLint *params)
2763{
2764 UNIMPLEMENTED();
2765}
2766
2767void Context::getSamplerParameterIuivRobust(GLuint sampler,
2768 GLenum pname,
2769 GLsizei bufSize,
2770 GLsizei *length,
2771 GLuint *params)
2772{
2773 UNIMPLEMENTED();
2774}
2775
Geoff Langc1984ed2016-10-07 12:41:00 -04002776void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2777{
2778 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002779 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002780 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002781 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002782}
2783
Brandon Jones59770802018-04-02 13:18:42 -07002784void Context::getSamplerParameterfvRobust(GLuint sampler,
2785 GLenum pname,
2786 GLsizei bufSize,
2787 GLsizei *length,
2788 GLfloat *params)
2789{
2790 getSamplerParameterfv(sampler, pname, params);
2791}
2792
Olli Etuahof0fee072016-03-30 15:11:58 +03002793void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2794{
2795 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002796 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002797}
2798
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002799void Context::initRendererString()
2800{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002801 std::ostringstream rendererString;
2802 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002803 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002804 rendererString << ")";
2805
Geoff Langcec35902014-04-16 10:52:36 -04002806 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002807}
2808
Geoff Langc339c4e2016-11-29 10:37:36 -05002809void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002810{
Geoff Langc339c4e2016-11-29 10:37:36 -05002811 const Version &clientVersion = getClientVersion();
2812
2813 std::ostringstream versionString;
2814 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2815 << ANGLE_VERSION_STRING << ")";
2816 mVersionString = MakeStaticString(versionString.str());
2817
2818 std::ostringstream shadingLanguageVersionString;
2819 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2820 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2821 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2822 << ")";
2823 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002824}
2825
Geoff Langcec35902014-04-16 10:52:36 -04002826void Context::initExtensionStrings()
2827{
Geoff Langc339c4e2016-11-29 10:37:36 -05002828 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2829 std::ostringstream combinedStringStream;
2830 std::copy(strings.begin(), strings.end(),
2831 std::ostream_iterator<const char *>(combinedStringStream, " "));
2832 return MakeStaticString(combinedStringStream.str());
2833 };
2834
2835 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002836 for (const auto &extensionString : mExtensions.getStrings())
2837 {
2838 mExtensionStrings.push_back(MakeStaticString(extensionString));
2839 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002840 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002841
Bryan Bernhart58806562017-01-05 13:09:31 -08002842 const gl::Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2843
Geoff Langc339c4e2016-11-29 10:37:36 -05002844 mRequestableExtensionStrings.clear();
2845 for (const auto &extensionInfo : GetExtensionInfoMap())
2846 {
2847 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002848 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
2849 nativeExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002850 {
2851 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2852 }
2853 }
2854 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002855}
2856
Geoff Langc339c4e2016-11-29 10:37:36 -05002857const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04002858{
Geoff Langc339c4e2016-11-29 10:37:36 -05002859 switch (name)
2860 {
2861 case GL_VENDOR:
2862 return reinterpret_cast<const GLubyte *>("Google Inc.");
2863
2864 case GL_RENDERER:
2865 return reinterpret_cast<const GLubyte *>(mRendererString);
2866
2867 case GL_VERSION:
2868 return reinterpret_cast<const GLubyte *>(mVersionString);
2869
2870 case GL_SHADING_LANGUAGE_VERSION:
2871 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
2872
2873 case GL_EXTENSIONS:
2874 return reinterpret_cast<const GLubyte *>(mExtensionString);
2875
2876 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2877 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
2878
2879 default:
2880 UNREACHABLE();
2881 return nullptr;
2882 }
Geoff Langcec35902014-04-16 10:52:36 -04002883}
2884
Geoff Langc339c4e2016-11-29 10:37:36 -05002885const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04002886{
Geoff Langc339c4e2016-11-29 10:37:36 -05002887 switch (name)
2888 {
2889 case GL_EXTENSIONS:
2890 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
2891
2892 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2893 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
2894
2895 default:
2896 UNREACHABLE();
2897 return nullptr;
2898 }
Geoff Langcec35902014-04-16 10:52:36 -04002899}
2900
2901size_t Context::getExtensionStringCount() const
2902{
2903 return mExtensionStrings.size();
2904}
2905
Geoff Lang111a99e2017-10-17 10:58:41 -04002906bool Context::isExtensionRequestable(const char *name)
2907{
2908 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2909 auto extension = extensionInfos.find(name);
2910
2911 const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2912 return extension != extensionInfos.end() && extension->second.Requestable &&
2913 nativeExtensions.*(extension->second.ExtensionsMember);
2914}
2915
Geoff Langc339c4e2016-11-29 10:37:36 -05002916void Context::requestExtension(const char *name)
2917{
2918 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2919 ASSERT(extensionInfos.find(name) != extensionInfos.end());
2920 const auto &extension = extensionInfos.at(name);
2921 ASSERT(extension.Requestable);
Geoff Lang111a99e2017-10-17 10:58:41 -04002922 ASSERT(mImplementation->getNativeExtensions().*(extension.ExtensionsMember));
Geoff Langc339c4e2016-11-29 10:37:36 -05002923
2924 if (mExtensions.*(extension.ExtensionsMember))
2925 {
2926 // Extension already enabled
2927 return;
2928 }
2929
2930 mExtensions.*(extension.ExtensionsMember) = true;
2931 updateCaps();
2932 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08002933
Jamie Madill2f348d22017-06-05 10:50:59 -04002934 // Release the shader compiler so it will be re-created with the requested extensions enabled.
2935 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04002936
Jamie Madill81c2e252017-09-09 23:32:46 -04002937 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
2938 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05002939 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04002940 for (auto &zeroTexture : mZeroTextures)
2941 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002942 if (zeroTexture.get() != nullptr)
2943 {
2944 zeroTexture->signalDirty(this, InitState::Initialized);
2945 }
Geoff Lang9aded172017-04-05 11:07:56 -04002946 }
2947
2948 mState.mFramebuffers->invalidateFramebufferComplenessCache();
Geoff Langc339c4e2016-11-29 10:37:36 -05002949}
2950
2951size_t Context::getRequestableExtensionStringCount() const
2952{
2953 return mRequestableExtensionStrings.size();
2954}
2955
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002956void Context::beginTransformFeedback(GLenum primitiveMode)
2957{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002958 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002959 ASSERT(transformFeedback != nullptr);
2960 ASSERT(!transformFeedback->isPaused());
2961
Jamie Madill6c1f6712017-02-14 19:08:04 -05002962 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002963}
2964
2965bool Context::hasActiveTransformFeedback(GLuint program) const
2966{
2967 for (auto pair : mTransformFeedbackMap)
2968 {
2969 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
2970 {
2971 return true;
2972 }
2973 }
2974 return false;
2975}
2976
Geoff Langb433e872017-10-05 14:01:47 -04002977void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit)
Geoff Lang493daf52014-07-03 13:38:44 -04002978{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002979 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04002980
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08002981 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
2982 if (getClientVersion() < Version(2, 0))
2983 {
2984 mCaps.maxMultitextureUnits = 4;
2985 mCaps.maxClipPlanes = 6;
2986 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07002987 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
2988 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
2989 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08002990 }
2991
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002992 mExtensions = mImplementation->getNativeExtensions();
Geoff Lang493daf52014-07-03 13:38:44 -04002993
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002994 mLimitations = mImplementation->getNativeLimitations();
Austin Kinross02df7962015-07-01 10:03:42 -07002995
Geoff Langeb66a6e2016-10-31 13:06:12 -04002996 if (getClientVersion() < Version(3, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002997 {
2998 // Disable ES3+ extensions
Jamie Madill231c7f52017-04-26 13:45:37 -04002999 mExtensions.colorBufferFloat = false;
Geoff Langb66a9092016-05-16 15:59:14 -04003000 mExtensions.eglImageExternalEssl3 = false;
Vincent Lang25ab4512016-05-13 18:13:59 +02003001 mExtensions.textureNorm16 = false;
Martin Radev137032d2017-07-13 10:11:12 +03003002 mExtensions.multiview = false;
3003 mExtensions.maxViews = 1u;
Geoff Lang493daf52014-07-03 13:38:44 -04003004 }
3005
Jiawei Shao89be29a2017-11-06 14:36:45 +08003006 if (getClientVersion() < ES_3_1)
3007 {
3008 // Disable ES3.1+ extensions
3009 mExtensions.geometryShader = false;
3010 }
3011
Geoff Langeb66a6e2016-10-31 13:06:12 -04003012 if (getClientVersion() > Version(2, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04003013 {
3014 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
Jamie Madill231c7f52017-04-26 13:45:37 -04003015 // mExtensions.sRGB = false;
Geoff Lang493daf52014-07-03 13:38:44 -04003016 }
3017
Jamie Madill00ed7a12016-05-19 13:13:38 -04003018 // Some extensions are always available because they are implemented in the GL layer.
Jamie Madill231c7f52017-04-26 13:45:37 -04003019 mExtensions.bindUniformLocation = true;
3020 mExtensions.vertexArrayObject = true;
Geoff Langf41a7152016-09-19 15:11:17 -04003021 mExtensions.bindGeneratesResource = true;
Geoff Langfeb8c682017-02-13 16:07:35 -05003022 mExtensions.clientArrays = true;
Geoff Langc339c4e2016-11-29 10:37:36 -05003023 mExtensions.requestExtension = true;
Jamie Madill00ed7a12016-05-19 13:13:38 -04003024
3025 // Enable the no error extension if the context was created with the flag.
3026 mExtensions.noError = mSkipValidation;
3027
Corentin Wallezccab69d2017-01-27 16:57:15 -05003028 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Corentin Wallezc295e512017-01-27 17:47:50 -05003029 mExtensions.surfacelessContext = displayExtensions.surfacelessContext;
Corentin Wallezccab69d2017-01-27 16:57:15 -05003030
Geoff Lang70d0f492015-12-10 17:45:46 -05003031 // Explicitly enable GL_KHR_debug
3032 mExtensions.debug = true;
3033 mExtensions.maxDebugMessageLength = 1024;
3034 mExtensions.maxDebugLoggedMessages = 1024;
3035 mExtensions.maxDebugGroupStackDepth = 1024;
3036 mExtensions.maxLabelLength = 1024;
3037
Geoff Langff5b2d52016-09-07 11:32:23 -04003038 // Explicitly enable GL_ANGLE_robust_client_memory
3039 mExtensions.robustClientMemory = true;
3040
Jamie Madille08a1d32017-03-07 17:24:06 -05003041 // Determine robust resource init availability from EGL.
Geoff Langb433e872017-10-05 14:01:47 -04003042 mExtensions.robustResourceInitialization = robustResourceInit;
Jamie Madille08a1d32017-03-07 17:24:06 -05003043
Jiajia Qin8a7b3a02017-08-25 16:05:48 +08003044 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3045 // supports it.
3046 mExtensions.robustBufferAccessBehavior =
3047 mRobustAccess && mExtensions.robustBufferAccessBehavior;
3048
Jamie Madillc43be722017-07-13 16:22:14 -04003049 // Enable the cache control query unconditionally.
3050 mExtensions.programCacheControl = true;
3051
Geoff Lang301d1612014-07-09 10:34:37 -04003052 // Apply implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003053 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003054
Jamie Madill0f80ed82017-09-19 00:24:56 -04003055 if (getClientVersion() < ES_3_1)
3056 {
3057 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3058 }
3059 else
3060 {
3061 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3062 }
Geoff Lang301d1612014-07-09 10:34:37 -04003063
Jamie Madill0f80ed82017-09-19 00:24:56 -04003064 LimitCap(&mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
3065 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3066 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3067
3068 // Limit textures as well, so we can use fast bitsets with texture bindings.
3069 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
3070 LimitCap(&mCaps.maxVertexTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3071 LimitCap(&mCaps.maxTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003072
Jiawei Shaodb342272017-09-27 10:21:45 +08003073 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3074
Geoff Langc287ea62016-09-16 14:46:51 -04003075 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003076 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003077 for (const auto &extensionInfo : GetExtensionInfoMap())
3078 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003079 // If the user has requested that extensions start disabled and they are requestable,
3080 // disable them.
3081 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003082 {
3083 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3084 }
3085 }
3086
3087 // Generate texture caps
3088 updateCaps();
3089}
3090
3091void Context::updateCaps()
3092{
Geoff Lang900013c2014-07-07 11:32:19 -04003093 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003094 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003095
Jamie Madill7b62cf92017-11-02 15:20:49 -04003096 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003097 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003098 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003099 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003100
Geoff Lang0d8b7242015-09-09 14:56:53 -04003101 // Update the format caps based on the client version and extensions.
3102 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3103 // ES3.
3104 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003105 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003106 formatCaps.renderable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003107 formatCaps.renderable && formatInfo.renderSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003108 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003109 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003110
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003111 // OpenGL ES does not support multisampling with non-rendererable formats
3112 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Olli Etuaho50c562d2017-06-06 14:43:30 +03003113 if (!formatCaps.renderable ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003114 (getClientVersion() < ES_3_1 &&
3115 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003116 {
Geoff Langd87878e2014-09-19 15:42:59 -04003117 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003118 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003119 else
3120 {
3121 // We may have limited the max samples for some required renderbuffer formats due to
3122 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3123 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3124
3125 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3126 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3127 // exception of signed and unsigned integer formats."
3128 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3129 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3130 {
3131 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3132 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3133 }
3134
3135 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3136 if (getClientVersion() >= ES_3_1)
3137 {
3138 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3139 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3140 // the exception that the signed and unsigned integer formats are required only to
3141 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3142 // multisamples, which must be at least one."
3143 if (formatInfo.componentType == GL_INT ||
3144 formatInfo.componentType == GL_UNSIGNED_INT)
3145 {
3146 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3147 }
3148
3149 // GLES 3.1 section 19.3.1.
3150 if (formatCaps.texturable)
3151 {
3152 if (formatInfo.depthBits > 0)
3153 {
3154 mCaps.maxDepthTextureSamples =
3155 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3156 }
3157 else if (formatInfo.redBits > 0)
3158 {
3159 mCaps.maxColorTextureSamples =
3160 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3161 }
3162 }
3163 }
3164 }
Geoff Langd87878e2014-09-19 15:42:59 -04003165
3166 if (formatCaps.texturable && formatInfo.compressed)
3167 {
Geoff Langca271392017-04-05 12:30:00 -04003168 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003169 }
3170
Geoff Langca271392017-04-05 12:30:00 -04003171 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003172 }
Jamie Madill32447362017-06-28 14:53:52 -04003173
3174 // If program binary is disabled, blank out the memory cache pointer.
3175 if (!mImplementation->getNativeExtensions().getProgramBinary)
3176 {
3177 mMemoryProgramCache = nullptr;
3178 }
Corentin Walleze4477002017-12-01 14:39:58 -05003179
3180 // Compute which buffer types are allowed
3181 mValidBufferBindings.reset();
3182 mValidBufferBindings.set(BufferBinding::ElementArray);
3183 mValidBufferBindings.set(BufferBinding::Array);
3184
3185 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3186 {
3187 mValidBufferBindings.set(BufferBinding::PixelPack);
3188 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3189 }
3190
3191 if (getClientVersion() >= ES_3_0)
3192 {
3193 mValidBufferBindings.set(BufferBinding::CopyRead);
3194 mValidBufferBindings.set(BufferBinding::CopyWrite);
3195 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3196 mValidBufferBindings.set(BufferBinding::Uniform);
3197 }
3198
3199 if (getClientVersion() >= ES_3_1)
3200 {
3201 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3202 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3203 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3204 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3205 }
Geoff Lang493daf52014-07-03 13:38:44 -04003206}
3207
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003208void Context::initWorkarounds()
3209{
Jamie Madill761b02c2017-06-23 16:27:06 -04003210 // Apply back-end workarounds.
3211 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3212
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003213 // Lose the context upon out of memory error if the application is
3214 // expecting to watch for those events.
3215 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3216}
3217
Jamie Madill05b35b22017-10-03 09:01:44 -04003218Error Context::prepareForDraw()
3219{
Geoff Langa8cb2872018-03-09 16:09:40 -05003220 ANGLE_TRY(syncDirtyObjects());
Jamie Madilla59fc192017-11-02 12:57:58 -04003221
3222 if (isRobustResourceInitEnabled())
3223 {
3224 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3225 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3226 }
3227
Geoff Langa8cb2872018-03-09 16:09:40 -05003228 ANGLE_TRY(syncDirtyBits());
Geoff Langd4fff502017-09-22 11:28:28 -04003229 return NoError();
3230}
3231
3232Error Context::prepareForClear(GLbitfield mask)
3233{
Geoff Langa8cb2872018-03-09 16:09:40 -05003234 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003235 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003236 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003237 return NoError();
3238}
3239
3240Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3241{
Geoff Langa8cb2872018-03-09 16:09:40 -05003242 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003243 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3244 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003245 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003246 return NoError();
3247}
3248
Geoff Langa8cb2872018-03-09 16:09:40 -05003249Error Context::syncState()
Jamie Madill1b94d432015-08-07 13:23:23 -04003250{
Geoff Langa8cb2872018-03-09 16:09:40 -05003251 ANGLE_TRY(syncDirtyObjects());
3252 ANGLE_TRY(syncDirtyBits());
Jamie Madillbc918e72018-03-08 09:47:21 -05003253 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003254}
3255
Geoff Langa8cb2872018-03-09 16:09:40 -05003256Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003257{
Geoff Langa8cb2872018-03-09 16:09:40 -05003258 ANGLE_TRY(syncDirtyObjects(objectMask));
3259 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003260 return NoError();
3261}
3262
Geoff Langa8cb2872018-03-09 16:09:40 -05003263Error Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003264{
3265 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
3266 mImplementation->syncState(this, dirtyBits);
3267 mGLState.clearDirtyBits();
3268 return NoError();
3269}
3270
Geoff Langa8cb2872018-03-09 16:09:40 -05003271Error Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003272{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003273 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madillfe548342017-06-19 11:13:24 -04003274 mImplementation->syncState(this, dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003275 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillbc918e72018-03-08 09:47:21 -05003276 return NoError();
Jamie Madill1b94d432015-08-07 13:23:23 -04003277}
Jamie Madillc29968b2016-01-20 11:17:23 -05003278
Geoff Langa8cb2872018-03-09 16:09:40 -05003279Error Context::syncDirtyObjects()
Geoff Langd4fff502017-09-22 11:28:28 -04003280{
3281 return mGLState.syncDirtyObjects(this);
3282}
3283
Geoff Langa8cb2872018-03-09 16:09:40 -05003284Error Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003285{
3286 return mGLState.syncDirtyObjects(this, objectMask);
3287}
3288
Jamie Madillc29968b2016-01-20 11:17:23 -05003289void Context::blitFramebuffer(GLint srcX0,
3290 GLint srcY0,
3291 GLint srcX1,
3292 GLint srcY1,
3293 GLint dstX0,
3294 GLint dstY0,
3295 GLint dstX1,
3296 GLint dstY1,
3297 GLbitfield mask,
3298 GLenum filter)
3299{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003300 if (mask == 0)
3301 {
3302 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3303 // buffers are copied.
3304 return;
3305 }
3306
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003307 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003308 ASSERT(drawFramebuffer);
3309
3310 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3311 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3312
Jamie Madillbc918e72018-03-08 09:47:21 -05003313 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003314
Jamie Madillc564c072017-06-01 12:45:42 -04003315 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003316}
Jamie Madillc29968b2016-01-20 11:17:23 -05003317
3318void Context::clear(GLbitfield mask)
3319{
Geoff Langd4fff502017-09-22 11:28:28 -04003320 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3321 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003322}
3323
3324void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3325{
Geoff Langd4fff502017-09-22 11:28:28 -04003326 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3327 ANGLE_CONTEXT_TRY(
3328 mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003329}
3330
3331void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3332{
Geoff Langd4fff502017-09-22 11:28:28 -04003333 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3334 ANGLE_CONTEXT_TRY(
3335 mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003336}
3337
3338void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3339{
Geoff Langd4fff502017-09-22 11:28:28 -04003340 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3341 ANGLE_CONTEXT_TRY(
3342 mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003343}
3344
3345void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3346{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003347 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003348 ASSERT(framebufferObject);
3349
3350 // If a buffer is not present, the clear has no effect
3351 if (framebufferObject->getDepthbuffer() == nullptr &&
3352 framebufferObject->getStencilbuffer() == nullptr)
3353 {
3354 return;
3355 }
3356
Geoff Langd4fff502017-09-22 11:28:28 -04003357 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3358 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003359}
3360
3361void Context::readPixels(GLint x,
3362 GLint y,
3363 GLsizei width,
3364 GLsizei height,
3365 GLenum format,
3366 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003367 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003368{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003369 if (width == 0 || height == 0)
3370 {
3371 return;
3372 }
3373
Jamie Madillbc918e72018-03-08 09:47:21 -05003374 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003375
Jamie Madillb6664922017-07-25 12:55:04 -04003376 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3377 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003378
3379 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003380 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003381}
3382
Brandon Jones59770802018-04-02 13:18:42 -07003383void Context::readPixelsRobust(GLint x,
3384 GLint y,
3385 GLsizei width,
3386 GLsizei height,
3387 GLenum format,
3388 GLenum type,
3389 GLsizei bufSize,
3390 GLsizei *length,
3391 GLsizei *columns,
3392 GLsizei *rows,
3393 void *pixels)
3394{
3395 readPixels(x, y, width, height, format, type, pixels);
3396}
3397
3398void Context::readnPixelsRobust(GLint x,
3399 GLint y,
3400 GLsizei width,
3401 GLsizei height,
3402 GLenum format,
3403 GLenum type,
3404 GLsizei bufSize,
3405 GLsizei *length,
3406 GLsizei *columns,
3407 GLsizei *rows,
3408 void *data)
3409{
3410 readPixels(x, y, width, height, format, type, data);
3411}
3412
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003413void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003414 GLint level,
3415 GLenum internalformat,
3416 GLint x,
3417 GLint y,
3418 GLsizei width,
3419 GLsizei height,
3420 GLint border)
3421{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003422 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003423 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003424
Jamie Madillc29968b2016-01-20 11:17:23 -05003425 Rectangle sourceArea(x, y, width, height);
3426
Jamie Madill05b35b22017-10-03 09:01:44 -04003427 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003428 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003429 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003430}
3431
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003432void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003433 GLint level,
3434 GLint xoffset,
3435 GLint yoffset,
3436 GLint x,
3437 GLint y,
3438 GLsizei width,
3439 GLsizei height)
3440{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003441 if (width == 0 || height == 0)
3442 {
3443 return;
3444 }
3445
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003446 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003447 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003448
Jamie Madillc29968b2016-01-20 11:17:23 -05003449 Offset destOffset(xoffset, yoffset, 0);
3450 Rectangle sourceArea(x, y, width, height);
3451
Jamie Madill05b35b22017-10-03 09:01:44 -04003452 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003453 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003454 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003455}
3456
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003457void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003458 GLint level,
3459 GLint xoffset,
3460 GLint yoffset,
3461 GLint zoffset,
3462 GLint x,
3463 GLint y,
3464 GLsizei width,
3465 GLsizei height)
3466{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003467 if (width == 0 || height == 0)
3468 {
3469 return;
3470 }
3471
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003472 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003473 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003474
Jamie Madillc29968b2016-01-20 11:17:23 -05003475 Offset destOffset(xoffset, yoffset, zoffset);
3476 Rectangle sourceArea(x, y, width, height);
3477
Jamie Madill05b35b22017-10-03 09:01:44 -04003478 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3479 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003480 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3481 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003482}
3483
3484void Context::framebufferTexture2D(GLenum target,
3485 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003486 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003487 GLuint texture,
3488 GLint level)
3489{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003490 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003491 ASSERT(framebuffer);
3492
3493 if (texture != 0)
3494 {
3495 Texture *textureObj = getTexture(texture);
3496
3497 ImageIndex index = ImageIndex::MakeInvalid();
3498
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003499 if (textarget == TextureTarget::_2D)
Jamie Madillc29968b2016-01-20 11:17:23 -05003500 {
3501 index = ImageIndex::Make2D(level);
3502 }
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003503 else if (textarget == TextureTarget::Rectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04003504 {
3505 index = ImageIndex::MakeRectangle(level);
3506 }
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003507 else if (textarget == TextureTarget::_2DMultisample)
JiangYizhoubddc46b2016-12-09 09:50:51 +08003508 {
3509 ASSERT(level == 0);
3510 index = ImageIndex::Make2DMultisample();
3511 }
Jamie Madillc29968b2016-01-20 11:17:23 -05003512 else
3513 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003514 ASSERT(TextureTargetToType(textarget) == TextureType::CubeMap);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003515 index = ImageIndex::MakeCube(textarget, level);
Jamie Madillc29968b2016-01-20 11:17:23 -05003516 }
3517
Jamie Madilla02315b2017-02-23 14:14:47 -05003518 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003519 }
3520 else
3521 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003522 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003523 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003524
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003525 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003526}
3527
3528void Context::framebufferRenderbuffer(GLenum target,
3529 GLenum attachment,
3530 GLenum renderbuffertarget,
3531 GLuint renderbuffer)
3532{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003533 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003534 ASSERT(framebuffer);
3535
3536 if (renderbuffer != 0)
3537 {
3538 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003539
3540 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003541 renderbufferObject);
3542 }
3543 else
3544 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003545 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003546 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003547
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003548 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003549}
3550
3551void Context::framebufferTextureLayer(GLenum target,
3552 GLenum attachment,
3553 GLuint texture,
3554 GLint level,
3555 GLint layer)
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 (texture != 0)
3561 {
3562 Texture *textureObject = getTexture(texture);
3563
3564 ImageIndex index = ImageIndex::MakeInvalid();
3565
Corentin Wallez99d492c2018-02-27 15:17:10 -05003566 if (textureObject->getType() == TextureType::_3D)
Jamie Madillc29968b2016-01-20 11:17:23 -05003567 {
3568 index = ImageIndex::Make3D(level, layer);
3569 }
3570 else
3571 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05003572 ASSERT(textureObject->getType() == TextureType::_2DArray);
Jamie Madillc29968b2016-01-20 11:17:23 -05003573 index = ImageIndex::Make2DArray(level, layer);
3574 }
3575
Jamie Madilla02315b2017-02-23 14:14:47 -05003576 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003577 }
3578 else
3579 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003580 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003581 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003582
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003583 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003584}
3585
Brandon Jones59770802018-04-02 13:18:42 -07003586void Context::framebufferTextureMultiviewLayered(GLenum target,
3587 GLenum attachment,
3588 GLuint texture,
3589 GLint level,
3590 GLint baseViewIndex,
3591 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003592{
Martin Radev82ef7742017-08-08 17:44:58 +03003593 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3594 ASSERT(framebuffer);
3595
3596 if (texture != 0)
3597 {
3598 Texture *textureObj = getTexture(texture);
3599
Martin Radev18b75ba2017-08-15 15:50:40 +03003600 ImageIndex index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
Martin Radev82ef7742017-08-08 17:44:58 +03003601 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3602 numViews, baseViewIndex);
3603 }
3604 else
3605 {
3606 framebuffer->resetAttachment(this, attachment);
3607 }
3608
3609 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003610}
3611
Brandon Jones59770802018-04-02 13:18:42 -07003612void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3613 GLenum attachment,
3614 GLuint texture,
3615 GLint level,
3616 GLsizei numViews,
3617 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003618{
Martin Radev5dae57b2017-07-14 16:15:55 +03003619 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3620 ASSERT(framebuffer);
3621
3622 if (texture != 0)
3623 {
3624 Texture *textureObj = getTexture(texture);
3625
3626 ImageIndex index = ImageIndex::Make2D(level);
3627 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3628 textureObj, numViews, viewportOffsets);
3629 }
3630 else
3631 {
3632 framebuffer->resetAttachment(this, attachment);
3633 }
3634
3635 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003636}
3637
Jamie Madillc29968b2016-01-20 11:17:23 -05003638void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3639{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003640 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003641 ASSERT(framebuffer);
3642 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003643 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003644}
3645
3646void Context::readBuffer(GLenum mode)
3647{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003648 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003649 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003650 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003651}
3652
3653void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3654{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003655 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003656 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003657
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003658 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003659 ASSERT(framebuffer);
3660
3661 // The specification isn't clear what should be done when the framebuffer isn't complete.
3662 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003663 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003664}
3665
3666void Context::invalidateFramebuffer(GLenum target,
3667 GLsizei numAttachments,
3668 const GLenum *attachments)
3669{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003670 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003671 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003672
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003673 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003674 ASSERT(framebuffer);
3675
Jamie Madille98b1b52018-03-08 09:47:23 -05003676 bool complete = false;
3677 ANGLE_CONTEXT_TRY(framebuffer->isComplete(this, &complete));
3678 if (!complete)
Jamie Madillc29968b2016-01-20 11:17:23 -05003679 {
Jamie Madill437fa652016-05-03 15:13:24 -04003680 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003681 }
Jamie Madill437fa652016-05-03 15:13:24 -04003682
Jamie Madill4928b7c2017-06-20 12:57:39 -04003683 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003684}
3685
3686void Context::invalidateSubFramebuffer(GLenum target,
3687 GLsizei numAttachments,
3688 const GLenum *attachments,
3689 GLint x,
3690 GLint y,
3691 GLsizei width,
3692 GLsizei height)
3693{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003694 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003695 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003696
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003697 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003698 ASSERT(framebuffer);
3699
Jamie Madille98b1b52018-03-08 09:47:23 -05003700 bool complete = false;
3701 ANGLE_CONTEXT_TRY(framebuffer->isComplete(this, &complete));
3702 if (!complete)
Jamie Madillc29968b2016-01-20 11:17:23 -05003703 {
Jamie Madill437fa652016-05-03 15:13:24 -04003704 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003705 }
Jamie Madill437fa652016-05-03 15:13:24 -04003706
3707 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003708 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003709}
3710
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003711void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003712 GLint level,
3713 GLint internalformat,
3714 GLsizei width,
3715 GLsizei height,
3716 GLint border,
3717 GLenum format,
3718 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003719 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003720{
Jamie Madillbc918e72018-03-08 09:47:21 -05003721 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003722
3723 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003724 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003725 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3726 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003727}
3728
Brandon Jones59770802018-04-02 13:18:42 -07003729void Context::texImage2DRobust(TextureTarget target,
3730 GLint level,
3731 GLint internalformat,
3732 GLsizei width,
3733 GLsizei height,
3734 GLint border,
3735 GLenum format,
3736 GLenum type,
3737 GLsizei bufSize,
3738 const void *pixels)
3739{
3740 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
3741}
3742
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003743void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003744 GLint level,
3745 GLint internalformat,
3746 GLsizei width,
3747 GLsizei height,
3748 GLsizei depth,
3749 GLint border,
3750 GLenum format,
3751 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003752 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003753{
Jamie Madillbc918e72018-03-08 09:47:21 -05003754 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003755
3756 Extents size(width, height, depth);
3757 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003758 handleError(texture->setImage(this, mGLState.getUnpackState(),
3759 NonCubeTextureTypeToTarget(target), level, internalformat, size,
3760 format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003761}
3762
Brandon Jones59770802018-04-02 13:18:42 -07003763void Context::texImage3DRobust(TextureType target,
3764 GLint level,
3765 GLint internalformat,
3766 GLsizei width,
3767 GLsizei height,
3768 GLsizei depth,
3769 GLint border,
3770 GLenum format,
3771 GLenum type,
3772 GLsizei bufSize,
3773 const void *pixels)
3774{
3775 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
3776}
3777
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003778void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003779 GLint level,
3780 GLint xoffset,
3781 GLint yoffset,
3782 GLsizei width,
3783 GLsizei height,
3784 GLenum format,
3785 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003786 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003787{
3788 // Zero sized uploads are valid but no-ops
3789 if (width == 0 || height == 0)
3790 {
3791 return;
3792 }
3793
Jamie Madillbc918e72018-03-08 09:47:21 -05003794 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003795
3796 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003797 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003798 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3799 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003800}
3801
Brandon Jones59770802018-04-02 13:18:42 -07003802void Context::texSubImage2DRobust(TextureTarget target,
3803 GLint level,
3804 GLint xoffset,
3805 GLint yoffset,
3806 GLsizei width,
3807 GLsizei height,
3808 GLenum format,
3809 GLenum type,
3810 GLsizei bufSize,
3811 const void *pixels)
3812{
3813 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
3814}
3815
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003816void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003817 GLint level,
3818 GLint xoffset,
3819 GLint yoffset,
3820 GLint zoffset,
3821 GLsizei width,
3822 GLsizei height,
3823 GLsizei depth,
3824 GLenum format,
3825 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003826 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003827{
3828 // Zero sized uploads are valid but no-ops
3829 if (width == 0 || height == 0 || depth == 0)
3830 {
3831 return;
3832 }
3833
Jamie Madillbc918e72018-03-08 09:47:21 -05003834 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003835
3836 Box area(xoffset, yoffset, zoffset, width, height, depth);
3837 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003838 handleError(texture->setSubImage(this, mGLState.getUnpackState(),
3839 NonCubeTextureTypeToTarget(target), level, area, format, type,
3840 reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003841}
3842
Brandon Jones59770802018-04-02 13:18:42 -07003843void Context::texSubImage3DRobust(TextureType target,
3844 GLint level,
3845 GLint xoffset,
3846 GLint yoffset,
3847 GLint zoffset,
3848 GLsizei width,
3849 GLsizei height,
3850 GLsizei depth,
3851 GLenum format,
3852 GLenum type,
3853 GLsizei bufSize,
3854 const void *pixels)
3855{
3856 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
3857 pixels);
3858}
3859
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003860void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003861 GLint level,
3862 GLenum internalformat,
3863 GLsizei width,
3864 GLsizei height,
3865 GLint border,
3866 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003867 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003868{
Jamie Madillbc918e72018-03-08 09:47:21 -05003869 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003870
3871 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003872 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003873 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
3874 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003875 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003876}
3877
Brandon Jones59770802018-04-02 13:18:42 -07003878void Context::compressedTexImage2DRobust(TextureTarget target,
3879 GLint level,
3880 GLenum internalformat,
3881 GLsizei width,
3882 GLsizei height,
3883 GLint border,
3884 GLsizei imageSize,
3885 GLsizei dataSize,
3886 const GLvoid *data)
3887{
3888 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
3889}
3890
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003891void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003892 GLint level,
3893 GLenum internalformat,
3894 GLsizei width,
3895 GLsizei height,
3896 GLsizei depth,
3897 GLint border,
3898 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003899 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003900{
Jamie Madillbc918e72018-03-08 09:47:21 -05003901 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003902
3903 Extents size(width, height, depth);
3904 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003905 handleError(texture->setCompressedImage(
3906 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
3907 size, imageSize, reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003908}
3909
Brandon Jones59770802018-04-02 13:18:42 -07003910void Context::compressedTexImage3DRobust(TextureType target,
3911 GLint level,
3912 GLenum internalformat,
3913 GLsizei width,
3914 GLsizei height,
3915 GLsizei depth,
3916 GLint border,
3917 GLsizei imageSize,
3918 GLsizei dataSize,
3919 const GLvoid *data)
3920{
3921 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
3922 data);
3923}
3924
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003925void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003926 GLint level,
3927 GLint xoffset,
3928 GLint yoffset,
3929 GLsizei width,
3930 GLsizei height,
3931 GLenum format,
3932 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003933 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003934{
Jamie Madillbc918e72018-03-08 09:47:21 -05003935 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003936
3937 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003938 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003939 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
3940 format, imageSize,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003941 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003942}
3943
Brandon Jones59770802018-04-02 13:18:42 -07003944void Context::compressedTexSubImage2DRobust(TextureTarget target,
3945 GLint level,
3946 GLint xoffset,
3947 GLint yoffset,
3948 GLsizei width,
3949 GLsizei height,
3950 GLenum format,
3951 GLsizei imageSize,
3952 GLsizei dataSize,
3953 const GLvoid *data)
3954{
3955 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
3956 data);
3957}
3958
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003959void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003960 GLint level,
3961 GLint xoffset,
3962 GLint yoffset,
3963 GLint zoffset,
3964 GLsizei width,
3965 GLsizei height,
3966 GLsizei depth,
3967 GLenum format,
3968 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003969 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003970{
3971 // Zero sized uploads are valid but no-ops
3972 if (width == 0 || height == 0)
3973 {
3974 return;
3975 }
3976
Jamie Madillbc918e72018-03-08 09:47:21 -05003977 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003978
3979 Box area(xoffset, yoffset, zoffset, width, height, depth);
3980 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003981 handleError(texture->setCompressedSubImage(
3982 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
3983 imageSize, reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003984}
3985
Brandon Jones59770802018-04-02 13:18:42 -07003986void Context::compressedTexSubImage3DRobust(TextureType target,
3987 GLint level,
3988 GLint xoffset,
3989 GLint yoffset,
3990 GLint zoffset,
3991 GLsizei width,
3992 GLsizei height,
3993 GLsizei depth,
3994 GLenum format,
3995 GLsizei imageSize,
3996 GLsizei dataSize,
3997 const GLvoid *data)
3998{
3999 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4000 imageSize, data);
4001}
4002
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004003void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004004{
4005 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004006 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004007}
4008
Jamie Madill007530e2017-12-28 14:27:04 -05004009void Context::copyTexture(GLuint sourceId,
4010 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004011 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004012 GLuint destId,
4013 GLint destLevel,
4014 GLint internalFormat,
4015 GLenum destType,
4016 GLboolean unpackFlipY,
4017 GLboolean unpackPremultiplyAlpha,
4018 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004019{
Jamie Madillbc918e72018-03-08 09:47:21 -05004020 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004021
4022 gl::Texture *sourceTexture = getTexture(sourceId);
4023 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004024 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4025 sourceLevel, ConvertToBool(unpackFlipY),
4026 ConvertToBool(unpackPremultiplyAlpha),
4027 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004028}
4029
Jamie Madill007530e2017-12-28 14:27:04 -05004030void Context::copySubTexture(GLuint sourceId,
4031 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004032 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004033 GLuint destId,
4034 GLint destLevel,
4035 GLint xoffset,
4036 GLint yoffset,
4037 GLint x,
4038 GLint y,
4039 GLsizei width,
4040 GLsizei height,
4041 GLboolean unpackFlipY,
4042 GLboolean unpackPremultiplyAlpha,
4043 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004044{
4045 // Zero sized copies are valid but no-ops
4046 if (width == 0 || height == 0)
4047 {
4048 return;
4049 }
4050
Jamie Madillbc918e72018-03-08 09:47:21 -05004051 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004052
4053 gl::Texture *sourceTexture = getTexture(sourceId);
4054 gl::Texture *destTexture = getTexture(destId);
4055 Offset offset(xoffset, yoffset, 0);
4056 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05004057 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
4058 ConvertToBool(unpackFlipY),
4059 ConvertToBool(unpackPremultiplyAlpha),
4060 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004061}
4062
Jamie Madill007530e2017-12-28 14:27:04 -05004063void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004064{
Jamie Madillbc918e72018-03-08 09:47:21 -05004065 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004066
4067 gl::Texture *sourceTexture = getTexture(sourceId);
4068 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004069 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004070}
4071
Corentin Wallez336129f2017-10-17 15:55:40 -04004072void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004073{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004074 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004075 ASSERT(buffer);
4076
Geoff Lang496c02d2016-10-20 11:38:11 -07004077 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004078}
4079
Brandon Jones59770802018-04-02 13:18:42 -07004080void Context::getBufferPointervRobust(BufferBinding target,
4081 GLenum pname,
4082 GLsizei bufSize,
4083 GLsizei *length,
4084 void **params)
4085{
4086 getBufferPointerv(target, pname, params);
4087}
4088
Corentin Wallez336129f2017-10-17 15:55:40 -04004089void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004090{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004091 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004092 ASSERT(buffer);
4093
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004094 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004095 if (error.isError())
4096 {
Jamie Madill437fa652016-05-03 15:13:24 -04004097 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004098 return nullptr;
4099 }
4100
4101 return buffer->getMapPointer();
4102}
4103
Corentin Wallez336129f2017-10-17 15:55:40 -04004104GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004105{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004106 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004107 ASSERT(buffer);
4108
4109 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004110 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004111 if (error.isError())
4112 {
Jamie Madill437fa652016-05-03 15:13:24 -04004113 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004114 return GL_FALSE;
4115 }
4116
4117 return result;
4118}
4119
Corentin Wallez336129f2017-10-17 15:55:40 -04004120void *Context::mapBufferRange(BufferBinding target,
4121 GLintptr offset,
4122 GLsizeiptr length,
4123 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004124{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004125 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004126 ASSERT(buffer);
4127
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004128 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004129 if (error.isError())
4130 {
Jamie Madill437fa652016-05-03 15:13:24 -04004131 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004132 return nullptr;
4133 }
4134
4135 return buffer->getMapPointer();
4136}
4137
Corentin Wallez336129f2017-10-17 15:55:40 -04004138void Context::flushMappedBufferRange(BufferBinding /*target*/,
4139 GLintptr /*offset*/,
4140 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004141{
4142 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4143}
4144
Jamie Madillbc918e72018-03-08 09:47:21 -05004145Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004146{
Geoff Langa8cb2872018-03-09 16:09:40 -05004147 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004148}
4149
Jamie Madillbc918e72018-03-08 09:47:21 -05004150Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004151{
Geoff Langa8cb2872018-03-09 16:09:40 -05004152 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004153}
4154
Jamie Madillbc918e72018-03-08 09:47:21 -05004155Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004156{
Geoff Langa8cb2872018-03-09 16:09:40 -05004157 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004158}
4159
Jiajia Qin5451d532017-11-16 17:16:34 +08004160void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4161{
4162 UNIMPLEMENTED();
4163}
4164
Jamie Madillc20ab272016-06-09 07:20:46 -07004165void Context::activeTexture(GLenum texture)
4166{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004167 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004168}
4169
Jamie Madill876429b2017-04-20 15:46:24 -04004170void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004171{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004172 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004173}
4174
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004175void Context::blendEquation(GLenum mode)
4176{
4177 mGLState.setBlendEquation(mode, mode);
4178}
4179
Jamie Madillc20ab272016-06-09 07:20:46 -07004180void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4181{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004182 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004183}
4184
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004185void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4186{
4187 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4188}
4189
Jamie Madillc20ab272016-06-09 07:20:46 -07004190void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4191{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004192 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004193}
4194
Jamie Madill876429b2017-04-20 15:46:24 -04004195void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004196{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004197 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004198}
4199
Jamie Madill876429b2017-04-20 15:46:24 -04004200void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004201{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004202 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004203}
4204
4205void Context::clearStencil(GLint s)
4206{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004207 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004208}
4209
4210void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4211{
Geoff Lang92019432017-11-20 13:09:34 -05004212 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4213 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004214}
4215
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004216void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004217{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004218 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004219}
4220
4221void Context::depthFunc(GLenum func)
4222{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004223 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004224}
4225
4226void Context::depthMask(GLboolean flag)
4227{
Geoff Lang92019432017-11-20 13:09:34 -05004228 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004229}
4230
Jamie Madill876429b2017-04-20 15:46:24 -04004231void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004232{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004233 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004234}
4235
4236void Context::disable(GLenum cap)
4237{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004238 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07004239}
4240
4241void Context::disableVertexAttribArray(GLuint index)
4242{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004243 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07004244}
4245
4246void Context::enable(GLenum cap)
4247{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004248 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07004249}
4250
4251void Context::enableVertexAttribArray(GLuint index)
4252{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004253 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07004254}
4255
4256void Context::frontFace(GLenum mode)
4257{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004258 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004259}
4260
4261void Context::hint(GLenum target, GLenum mode)
4262{
4263 switch (target)
4264 {
4265 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004266 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004267 break;
4268
4269 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004270 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004271 break;
4272
4273 default:
4274 UNREACHABLE();
4275 return;
4276 }
4277}
4278
4279void Context::lineWidth(GLfloat width)
4280{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004281 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004282}
4283
4284void Context::pixelStorei(GLenum pname, GLint param)
4285{
4286 switch (pname)
4287 {
4288 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004289 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004290 break;
4291
4292 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004293 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004294 break;
4295
4296 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004297 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004298 break;
4299
4300 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004301 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004302 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004303 break;
4304
4305 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004306 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004307 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004308 break;
4309
4310 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004311 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004312 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004313 break;
4314
4315 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004316 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004317 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004318 break;
4319
4320 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004321 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004322 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004323 break;
4324
4325 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004326 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004327 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004328 break;
4329
4330 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004331 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004332 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004333 break;
4334
4335 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004336 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004337 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004338 break;
4339
4340 default:
4341 UNREACHABLE();
4342 return;
4343 }
4344}
4345
4346void Context::polygonOffset(GLfloat factor, GLfloat units)
4347{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004348 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004349}
4350
Jamie Madill876429b2017-04-20 15:46:24 -04004351void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004352{
Geoff Lang92019432017-11-20 13:09:34 -05004353 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004354}
4355
Jiawei Shaodb342272017-09-27 10:21:45 +08004356void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4357{
4358 mGLState.setSampleMaskParams(maskNumber, mask);
4359}
4360
Jamie Madillc20ab272016-06-09 07:20:46 -07004361void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4362{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004363 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004364}
4365
4366void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4367{
4368 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4369 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004370 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004371 }
4372
4373 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4374 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004375 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004376 }
4377}
4378
4379void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4380{
4381 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4382 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004383 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004384 }
4385
4386 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4387 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004388 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004389 }
4390}
4391
4392void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4393{
4394 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4395 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004396 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004397 }
4398
4399 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4400 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004401 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004402 }
4403}
4404
4405void Context::vertexAttrib1f(GLuint index, GLfloat x)
4406{
4407 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004408 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004409}
4410
4411void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4412{
4413 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004414 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004415}
4416
4417void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4418{
4419 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004420 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004421}
4422
4423void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4424{
4425 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004426 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004427}
4428
4429void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4430{
4431 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004432 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004433}
4434
4435void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4436{
4437 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004438 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004439}
4440
4441void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4442{
4443 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004444 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004445}
4446
4447void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4448{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004449 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07004450}
4451
4452void Context::vertexAttribPointer(GLuint index,
4453 GLint size,
4454 GLenum type,
4455 GLboolean normalized,
4456 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004457 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004458{
Corentin Wallez336129f2017-10-17 15:55:40 -04004459 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004460 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07004461}
4462
Shao80957d92017-02-20 21:25:59 +08004463void Context::vertexAttribFormat(GLuint attribIndex,
4464 GLint size,
4465 GLenum type,
4466 GLboolean normalized,
4467 GLuint relativeOffset)
4468{
Geoff Lang92019432017-11-20 13:09:34 -05004469 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004470 relativeOffset);
4471}
4472
4473void Context::vertexAttribIFormat(GLuint attribIndex,
4474 GLint size,
4475 GLenum type,
4476 GLuint relativeOffset)
4477{
4478 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
4479}
4480
4481void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4482{
Shaodde78e82017-05-22 14:13:27 +08004483 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08004484}
4485
Jiajia Qin5451d532017-11-16 17:16:34 +08004486void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004487{
4488 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
4489}
4490
Jamie Madillc20ab272016-06-09 07:20:46 -07004491void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4492{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004493 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004494}
4495
4496void Context::vertexAttribIPointer(GLuint index,
4497 GLint size,
4498 GLenum type,
4499 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004500 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004501{
Corentin Wallez336129f2017-10-17 15:55:40 -04004502 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4503 size, type, false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07004504}
4505
4506void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4507{
4508 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004509 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004510}
4511
4512void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4513{
4514 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004515 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07004516}
4517
4518void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4519{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004520 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004521}
4522
4523void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4524{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004525 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07004526}
4527
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004528void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4529{
4530 const VertexAttribCurrentValueData &currentValues =
4531 getGLState().getVertexAttribCurrentValue(index);
4532 const VertexArray *vao = getGLState().getVertexArray();
4533 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4534 currentValues, pname, params);
4535}
4536
Brandon Jones59770802018-04-02 13:18:42 -07004537void Context::getVertexAttribivRobust(GLuint index,
4538 GLenum pname,
4539 GLsizei bufSize,
4540 GLsizei *length,
4541 GLint *params)
4542{
4543 getVertexAttribiv(index, pname, params);
4544}
4545
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004546void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4547{
4548 const VertexAttribCurrentValueData &currentValues =
4549 getGLState().getVertexAttribCurrentValue(index);
4550 const VertexArray *vao = getGLState().getVertexArray();
4551 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4552 currentValues, pname, params);
4553}
4554
Brandon Jones59770802018-04-02 13:18:42 -07004555void Context::getVertexAttribfvRobust(GLuint index,
4556 GLenum pname,
4557 GLsizei bufSize,
4558 GLsizei *length,
4559 GLfloat *params)
4560{
4561 getVertexAttribfv(index, pname, params);
4562}
4563
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004564void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4565{
4566 const VertexAttribCurrentValueData &currentValues =
4567 getGLState().getVertexAttribCurrentValue(index);
4568 const VertexArray *vao = getGLState().getVertexArray();
4569 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4570 currentValues, pname, params);
4571}
4572
Brandon Jones59770802018-04-02 13:18:42 -07004573void Context::getVertexAttribIivRobust(GLuint index,
4574 GLenum pname,
4575 GLsizei bufSize,
4576 GLsizei *length,
4577 GLint *params)
4578{
4579 getVertexAttribIiv(index, pname, params);
4580}
4581
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004582void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4583{
4584 const VertexAttribCurrentValueData &currentValues =
4585 getGLState().getVertexAttribCurrentValue(index);
4586 const VertexArray *vao = getGLState().getVertexArray();
4587 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4588 currentValues, pname, params);
4589}
4590
Brandon Jones59770802018-04-02 13:18:42 -07004591void Context::getVertexAttribIuivRobust(GLuint index,
4592 GLenum pname,
4593 GLsizei bufSize,
4594 GLsizei *length,
4595 GLuint *params)
4596{
4597 getVertexAttribIuiv(index, pname, params);
4598}
4599
Jamie Madill876429b2017-04-20 15:46:24 -04004600void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004601{
4602 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4603 QueryVertexAttribPointerv(attrib, pname, pointer);
4604}
4605
Brandon Jones59770802018-04-02 13:18:42 -07004606void Context::getVertexAttribPointervRobust(GLuint index,
4607 GLenum pname,
4608 GLsizei bufSize,
4609 GLsizei *length,
4610 void **pointer)
4611{
4612 getVertexAttribPointerv(index, pname, pointer);
4613}
4614
Jamie Madillc20ab272016-06-09 07:20:46 -07004615void Context::debugMessageControl(GLenum source,
4616 GLenum type,
4617 GLenum severity,
4618 GLsizei count,
4619 const GLuint *ids,
4620 GLboolean enabled)
4621{
4622 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004623 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004624 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004625}
4626
4627void Context::debugMessageInsert(GLenum source,
4628 GLenum type,
4629 GLuint id,
4630 GLenum severity,
4631 GLsizei length,
4632 const GLchar *buf)
4633{
4634 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004635 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004636}
4637
4638void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4639{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004640 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004641}
4642
4643GLuint Context::getDebugMessageLog(GLuint count,
4644 GLsizei bufSize,
4645 GLenum *sources,
4646 GLenum *types,
4647 GLuint *ids,
4648 GLenum *severities,
4649 GLsizei *lengths,
4650 GLchar *messageLog)
4651{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004652 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4653 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004654}
4655
4656void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4657{
4658 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004659 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004660 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004661}
4662
4663void Context::popDebugGroup()
4664{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004665 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004666 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004667}
4668
Corentin Wallez336129f2017-10-17 15:55:40 -04004669void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004670{
4671 Buffer *buffer = mGLState.getTargetBuffer(target);
4672 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004673 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004674}
4675
Corentin Wallez336129f2017-10-17 15:55:40 -04004676void Context::bufferSubData(BufferBinding target,
4677 GLintptr offset,
4678 GLsizeiptr size,
4679 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004680{
4681 if (data == nullptr)
4682 {
4683 return;
4684 }
4685
4686 Buffer *buffer = mGLState.getTargetBuffer(target);
4687 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004688 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004689}
4690
Jamie Madillef300b12016-10-07 15:12:09 -04004691void Context::attachShader(GLuint program, GLuint shader)
4692{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004693 Program *programObject = mState.mShaderPrograms->getProgram(program);
4694 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004695 ASSERT(programObject && shaderObject);
4696 programObject->attachShader(shaderObject);
4697}
4698
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004699const Workarounds &Context::getWorkarounds() const
4700{
4701 return mWorkarounds;
4702}
4703
Corentin Wallez336129f2017-10-17 15:55:40 -04004704void Context::copyBufferSubData(BufferBinding readTarget,
4705 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04004706 GLintptr readOffset,
4707 GLintptr writeOffset,
4708 GLsizeiptr size)
4709{
4710 // if size is zero, the copy is a successful no-op
4711 if (size == 0)
4712 {
4713 return;
4714 }
4715
4716 // TODO(jmadill): cache these.
4717 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
4718 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4719
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004720 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004721}
4722
Jamie Madill01a80ee2016-11-07 12:06:18 -05004723void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4724{
4725 Program *programObject = getProgram(program);
4726 // TODO(jmadill): Re-use this from the validation if possible.
4727 ASSERT(programObject);
4728 programObject->bindAttributeLocation(index, name);
4729}
4730
Corentin Wallez336129f2017-10-17 15:55:40 -04004731void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004732{
Corentin Wallez336129f2017-10-17 15:55:40 -04004733 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4734 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004735}
4736
Corentin Wallez336129f2017-10-17 15:55:40 -04004737void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08004738{
4739 bindBufferRange(target, index, buffer, 0, 0);
4740}
4741
Corentin Wallez336129f2017-10-17 15:55:40 -04004742void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08004743 GLuint index,
4744 GLuint buffer,
4745 GLintptr offset,
4746 GLsizeiptr size)
4747{
Corentin Wallez336129f2017-10-17 15:55:40 -04004748 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4749 mGLState.setIndexedBufferBinding(this, target, index, bufferObject, offset, size);
Jiajia Qin6eafb042016-12-27 17:04:07 +08004750}
4751
Jamie Madill01a80ee2016-11-07 12:06:18 -05004752void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4753{
4754 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4755 {
4756 bindReadFramebuffer(framebuffer);
4757 }
4758
4759 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4760 {
4761 bindDrawFramebuffer(framebuffer);
4762 }
4763}
4764
4765void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4766{
4767 ASSERT(target == GL_RENDERBUFFER);
4768 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004769 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004770 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004771}
4772
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004773void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08004774 GLsizei samples,
4775 GLenum internalformat,
4776 GLsizei width,
4777 GLsizei height,
4778 GLboolean fixedsamplelocations)
4779{
4780 Extents size(width, height, 1);
4781 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004782 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
4783 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004784}
4785
4786void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
4787{
JiangYizhou5b03f472017-01-09 10:22:53 +08004788 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
4789 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05004790 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08004791 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08004792
4793 switch (pname)
4794 {
4795 case GL_SAMPLE_POSITION:
4796 handleError(framebuffer->getSamplePosition(index, val));
4797 break;
4798 default:
4799 UNREACHABLE();
4800 }
4801}
4802
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07004803void Context::getMultisamplefvRobust(GLenum pname,
4804 GLuint index,
4805 GLsizei bufSize,
4806 GLsizei *length,
4807 GLfloat *val)
4808{
4809 UNIMPLEMENTED();
4810}
4811
Jamie Madille8fb6402017-02-14 17:56:40 -05004812void Context::renderbufferStorage(GLenum target,
4813 GLenum internalformat,
4814 GLsizei width,
4815 GLsizei height)
4816{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004817 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4818 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
4819
Jamie Madille8fb6402017-02-14 17:56:40 -05004820 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04004821 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004822}
4823
4824void Context::renderbufferStorageMultisample(GLenum target,
4825 GLsizei samples,
4826 GLenum internalformat,
4827 GLsizei width,
4828 GLsizei height)
4829{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004830 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4831 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05004832
4833 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004834 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04004835 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004836}
4837
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004838void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
4839{
Jamie Madill70b5bb02017-08-28 13:32:37 -04004840 const Sync *syncObject = getSync(sync);
Geoff Lang82483b92017-04-11 15:33:00 -04004841 handleError(QuerySynciv(syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004842}
4843
JiangYizhoue18e6392017-02-20 10:32:23 +08004844void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
4845{
4846 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4847 QueryFramebufferParameteriv(framebuffer, pname, params);
4848}
4849
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07004850void Context::getFramebufferParameterivRobust(GLenum target,
4851 GLenum pname,
4852 GLsizei bufSize,
4853 GLsizei *length,
4854 GLint *params)
4855{
4856 UNIMPLEMENTED();
4857}
4858
Jiajia Qin5451d532017-11-16 17:16:34 +08004859void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08004860{
4861 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4862 SetFramebufferParameteri(framebuffer, pname, param);
4863}
4864
Jamie Madillb3f26b92017-07-19 15:07:41 -04004865Error Context::getScratchBuffer(size_t requstedSizeBytes,
4866 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05004867{
Jamie Madillb3f26b92017-07-19 15:07:41 -04004868 if (!mScratchBuffer.get(requstedSizeBytes, scratchBufferOut))
4869 {
4870 return OutOfMemory() << "Failed to allocate internal buffer.";
4871 }
4872 return NoError();
4873}
4874
4875Error Context::getZeroFilledBuffer(size_t requstedSizeBytes,
4876 angle::MemoryBuffer **zeroBufferOut) const
4877{
4878 if (!mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0))
Jamie Madille14951e2017-03-09 18:55:16 -05004879 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004880 return OutOfMemory() << "Failed to allocate internal buffer.";
Jamie Madille14951e2017-03-09 18:55:16 -05004881 }
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004882 return NoError();
Jamie Madille14951e2017-03-09 18:55:16 -05004883}
4884
Xinghua Cao10a4d432017-11-28 14:46:26 +08004885Error Context::prepareForDispatch()
4886{
Geoff Langa8cb2872018-03-09 16:09:40 -05004887 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08004888
4889 if (isRobustResourceInitEnabled())
4890 {
4891 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
4892 }
4893
4894 return NoError();
4895}
4896
Xinghua Cao2b396592017-03-29 15:36:04 +08004897void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
4898{
4899 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
4900 {
4901 return;
4902 }
4903
Xinghua Cao10a4d432017-11-28 14:46:26 +08004904 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04004905 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08004906}
4907
Jiajia Qin5451d532017-11-16 17:16:34 +08004908void Context::dispatchComputeIndirect(GLintptr indirect)
4909{
Qin Jiajia62fcf622017-11-30 16:16:12 +08004910 ANGLE_CONTEXT_TRY(prepareForDispatch());
4911 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08004912}
4913
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004914void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08004915 GLsizei levels,
4916 GLenum internalFormat,
4917 GLsizei width,
4918 GLsizei height)
4919{
4920 Extents size(width, height, 1);
4921 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004922 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08004923}
4924
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004925void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08004926 GLsizei levels,
4927 GLenum internalFormat,
4928 GLsizei width,
4929 GLsizei height,
4930 GLsizei depth)
4931{
4932 Extents size(width, height, depth);
4933 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004934 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08004935}
4936
Jiajia Qin5451d532017-11-16 17:16:34 +08004937void Context::memoryBarrier(GLbitfield barriers)
4938{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004939 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004940}
4941
4942void Context::memoryBarrierByRegion(GLbitfield barriers)
4943{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004944 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004945}
4946
Jamie Madillc1d770e2017-04-13 17:31:24 -04004947GLenum Context::checkFramebufferStatus(GLenum target)
4948{
4949 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4950 ASSERT(framebuffer);
4951
Jamie Madille98b1b52018-03-08 09:47:23 -05004952 GLenum status = GL_NONE;
4953 Error err = framebuffer->checkStatus(this, &status);
4954 if (err.isError())
4955 {
4956 handleError(err);
4957 return 0;
4958 }
4959 return status;
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{
5694 return (getQuery(id, false, GL_NONE) != nullptr) ? GL_TRUE : GL_FALSE;
5695}
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 Yang13b708f2018-03-21 12:14:10 -07007023 *type = GL_INT;
7024 *numParams = 1;
7025 return true;
7026 case GL_ALPHA_TEST_REF:
7027 *type = GL_FLOAT;
7028 *numParams = 1;
7029 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007030 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007031 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007032 *type = GL_FLOAT;
7033 *numParams = 4;
7034 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007035 case GL_CURRENT_NORMAL:
7036 *type = GL_FLOAT;
7037 *numParams = 3;
7038 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007039 case GL_MODELVIEW_MATRIX:
7040 case GL_PROJECTION_MATRIX:
7041 case GL_TEXTURE_MATRIX:
7042 *type = GL_FLOAT;
7043 *numParams = 16;
7044 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007045 }
7046 }
7047
Jamie Madill5b772312018-03-08 20:28:32 -05007048 if (getClientVersion() < Version(3, 0))
7049 {
7050 return false;
7051 }
7052
7053 // Check for ES3.0+ parameter names
7054 switch (pname)
7055 {
7056 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7057 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7058 case GL_UNIFORM_BUFFER_BINDING:
7059 case GL_TRANSFORM_FEEDBACK_BINDING:
7060 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7061 case GL_COPY_READ_BUFFER_BINDING:
7062 case GL_COPY_WRITE_BUFFER_BINDING:
7063 case GL_SAMPLER_BINDING:
7064 case GL_READ_BUFFER:
7065 case GL_TEXTURE_BINDING_3D:
7066 case GL_TEXTURE_BINDING_2D_ARRAY:
7067 case GL_MAX_3D_TEXTURE_SIZE:
7068 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7069 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7070 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7071 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7072 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7073 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7074 case GL_MAX_VARYING_COMPONENTS:
7075 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7076 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7077 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7078 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7079 case GL_NUM_EXTENSIONS:
7080 case GL_MAJOR_VERSION:
7081 case GL_MINOR_VERSION:
7082 case GL_MAX_ELEMENTS_INDICES:
7083 case GL_MAX_ELEMENTS_VERTICES:
7084 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7085 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7086 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7087 case GL_UNPACK_IMAGE_HEIGHT:
7088 case GL_UNPACK_SKIP_IMAGES:
7089 {
7090 *type = GL_INT;
7091 *numParams = 1;
7092 return true;
7093 }
7094
7095 case GL_MAX_ELEMENT_INDEX:
7096 case GL_MAX_UNIFORM_BLOCK_SIZE:
7097 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7098 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7099 case GL_MAX_SERVER_WAIT_TIMEOUT:
7100 {
7101 *type = GL_INT_64_ANGLEX;
7102 *numParams = 1;
7103 return true;
7104 }
7105
7106 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7107 case GL_TRANSFORM_FEEDBACK_PAUSED:
7108 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7109 case GL_RASTERIZER_DISCARD:
7110 {
7111 *type = GL_BOOL;
7112 *numParams = 1;
7113 return true;
7114 }
7115
7116 case GL_MAX_TEXTURE_LOD_BIAS:
7117 {
7118 *type = GL_FLOAT;
7119 *numParams = 1;
7120 return true;
7121 }
7122 }
7123
7124 if (getExtensions().requestExtension)
7125 {
7126 switch (pname)
7127 {
7128 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7129 *type = GL_INT;
7130 *numParams = 1;
7131 return true;
7132 }
7133 }
7134
7135 if (getClientVersion() < Version(3, 1))
7136 {
7137 return false;
7138 }
7139
7140 switch (pname)
7141 {
7142 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7143 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7144 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7145 case GL_MAX_FRAMEBUFFER_WIDTH:
7146 case GL_MAX_FRAMEBUFFER_HEIGHT:
7147 case GL_MAX_FRAMEBUFFER_SAMPLES:
7148 case GL_MAX_SAMPLE_MASK_WORDS:
7149 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7150 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7151 case GL_MAX_INTEGER_SAMPLES:
7152 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7153 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7154 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7155 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7156 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7157 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7158 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7159 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7160 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7161 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7162 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7163 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7164 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7165 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7166 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7167 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7168 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7169 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7170 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7171 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7172 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7173 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7174 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7175 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7176 case GL_MAX_UNIFORM_LOCATIONS:
7177 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7178 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7179 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7180 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7181 case GL_MAX_IMAGE_UNITS:
7182 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7183 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7184 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7185 case GL_SHADER_STORAGE_BUFFER_BINDING:
7186 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7187 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
7188 *type = GL_INT;
7189 *numParams = 1;
7190 return true;
7191 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7192 *type = GL_INT_64_ANGLEX;
7193 *numParams = 1;
7194 return true;
7195 case GL_SAMPLE_MASK:
7196 *type = GL_BOOL;
7197 *numParams = 1;
7198 return true;
7199 }
7200
7201 if (getExtensions().geometryShader)
7202 {
7203 switch (pname)
7204 {
7205 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7206 case GL_LAYER_PROVOKING_VERTEX_EXT:
7207 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7208 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7209 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7210 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7211 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7212 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7213 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7214 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7215 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7216 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7217 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7218 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7219 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7220 *type = GL_INT;
7221 *numParams = 1;
7222 return true;
7223 }
7224 }
7225
7226 return false;
7227}
7228
7229bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7230{
7231 if (getClientVersion() < Version(3, 0))
7232 {
7233 return false;
7234 }
7235
7236 switch (target)
7237 {
7238 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7239 case GL_UNIFORM_BUFFER_BINDING:
7240 {
7241 *type = GL_INT;
7242 *numParams = 1;
7243 return true;
7244 }
7245 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7246 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7247 case GL_UNIFORM_BUFFER_START:
7248 case GL_UNIFORM_BUFFER_SIZE:
7249 {
7250 *type = GL_INT_64_ANGLEX;
7251 *numParams = 1;
7252 return true;
7253 }
7254 }
7255
7256 if (getClientVersion() < Version(3, 1))
7257 {
7258 return false;
7259 }
7260
7261 switch (target)
7262 {
7263 case GL_IMAGE_BINDING_LAYERED:
7264 {
7265 *type = GL_BOOL;
7266 *numParams = 1;
7267 return true;
7268 }
7269 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7270 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7271 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7272 case GL_SHADER_STORAGE_BUFFER_BINDING:
7273 case GL_VERTEX_BINDING_BUFFER:
7274 case GL_VERTEX_BINDING_DIVISOR:
7275 case GL_VERTEX_BINDING_OFFSET:
7276 case GL_VERTEX_BINDING_STRIDE:
7277 case GL_SAMPLE_MASK_VALUE:
7278 case GL_IMAGE_BINDING_NAME:
7279 case GL_IMAGE_BINDING_LEVEL:
7280 case GL_IMAGE_BINDING_LAYER:
7281 case GL_IMAGE_BINDING_ACCESS:
7282 case GL_IMAGE_BINDING_FORMAT:
7283 {
7284 *type = GL_INT;
7285 *numParams = 1;
7286 return true;
7287 }
7288 case GL_ATOMIC_COUNTER_BUFFER_START:
7289 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7290 case GL_SHADER_STORAGE_BUFFER_START:
7291 case GL_SHADER_STORAGE_BUFFER_SIZE:
7292 {
7293 *type = GL_INT_64_ANGLEX;
7294 *numParams = 1;
7295 return true;
7296 }
7297 }
7298
7299 return false;
7300}
7301
7302Program *Context::getProgram(GLuint handle) const
7303{
7304 return mState.mShaderPrograms->getProgram(handle);
7305}
7306
7307Shader *Context::getShader(GLuint handle) const
7308{
7309 return mState.mShaderPrograms->getShader(handle);
7310}
7311
7312bool Context::isTextureGenerated(GLuint texture) const
7313{
7314 return mState.mTextures->isHandleGenerated(texture);
7315}
7316
7317bool Context::isBufferGenerated(GLuint buffer) const
7318{
7319 return mState.mBuffers->isHandleGenerated(buffer);
7320}
7321
7322bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7323{
7324 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7325}
7326
7327bool Context::isFramebufferGenerated(GLuint framebuffer) const
7328{
7329 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7330}
7331
7332bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7333{
7334 return mState.mPipelines->isHandleGenerated(pipeline);
7335}
7336
7337bool Context::usingDisplayTextureShareGroup() const
7338{
7339 return mDisplayTextureShareGroup;
7340}
7341
7342GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7343{
7344 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7345 internalformat == GL_DEPTH_STENCIL
7346 ? GL_DEPTH24_STENCIL8
7347 : internalformat;
7348}
7349
Jamie Madillc29968b2016-01-20 11:17:23 -05007350} // namespace gl