blob: 3e7acb9869a7bd15b621444161ec26ae1e6f6b29 [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
Tobin Ehlisd7890bc2018-06-29 11:57:22 -060017#include "common/PackedEnums.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030018#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040019#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050020#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050021#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050022#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050023#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040024#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050025#include "libANGLE/Fence.h"
26#include "libANGLE/Framebuffer.h"
27#include "libANGLE/FramebufferAttachment.h"
Lingfeng Yang461b09a2018-04-23 09:02:09 -070028#include "libANGLE/GLES1Renderer.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030029#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080031#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050033#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/ResourceManager.h"
35#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050036#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050037#include "libANGLE/Texture.h"
38#include "libANGLE/TransformFeedback.h"
39#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070040#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040041#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030042#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040043#include "libANGLE/queryutils.h"
Jamie Madill6d32cef2018-08-14 02:34:28 -040044#include "libANGLE/renderer/BufferImpl.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/renderer/ContextImpl.h"
46#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040047#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040048#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000049
Geoff Langf6db0982015-08-25 13:04:00 -040050namespace
51{
52
Jamie Madillb6664922017-07-25 12:55:04 -040053#define ANGLE_HANDLE_ERR(X) \
54 handleError(X); \
55 return;
56#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
57
Ian Ewell3ffd78b2016-01-22 16:09:42 -050058template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050059std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030060 GLsizei numPaths,
61 const void *paths,
62 GLuint pathBase)
63{
64 std::vector<gl::Path *> ret;
65 ret.reserve(numPaths);
66
67 const auto *nameArray = static_cast<const T *>(paths);
68
69 for (GLsizei i = 0; i < numPaths; ++i)
70 {
71 const GLuint pathName = nameArray[i] + pathBase;
72
73 ret.push_back(resourceManager.getPath(pathName));
74 }
75
76 return ret;
77}
78
Geoff Lang4ddf5af2016-12-01 14:30:44 -050079std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030080 GLsizei numPaths,
81 GLenum pathNameType,
82 const void *paths,
83 GLuint pathBase)
84{
85 switch (pathNameType)
86 {
87 case GL_UNSIGNED_BYTE:
88 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_BYTE:
91 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_UNSIGNED_SHORT:
94 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_SHORT:
97 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_UNSIGNED_INT:
100 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
101
102 case GL_INT:
103 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
104 }
105
106 UNREACHABLE();
107 return std::vector<gl::Path *>();
108}
109
110template <typename T>
Jamie Madill666818e2018-11-14 09:54:33 -0500111angle::Result GetQueryObjectParameter(const gl::Context *context,
112 gl::Query *query,
113 GLenum pname,
114 T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500115{
Geoff Lang2186c382016-10-14 10:54:54 -0400116 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500117
118 switch (pname)
119 {
120 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400121 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500122 case GL_QUERY_RESULT_AVAILABLE_EXT:
123 {
124 bool available;
Jamie Madill666818e2018-11-14 09:54:33 -0500125 ANGLE_TRY(query->isResultAvailable(context, &available));
126 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
127 return angle::Result::Continue();
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500128 }
129 default:
130 UNREACHABLE();
Jamie Madill666818e2018-11-14 09:54:33 -0500131 return angle::Result::Stop();
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500132 }
133}
134
Jamie Madill956ab4d2018-10-10 16:13:03 -0400135ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const gl::Context *context,
136 gl::TransformFeedback *transformFeedback,
137 GLsizei count,
138 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400139{
Geoff Lang1a683462015-09-29 15:09:59 -0400140 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400141 {
Jamie Madill09463932018-04-04 05:26:59 -0400142 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400143 }
144}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500145
146// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300147EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400149 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500150}
151
Martin Radev1be913c2016-07-11 17:59:16 +0300152EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
153{
154 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
155}
156
Geoff Langeb66a6e2016-10-31 13:06:12 -0400157gl::Version GetClientVersion(const egl::AttributeMap &attribs)
158{
159 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
160}
161
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500162GLenum GetResetStrategy(const egl::AttributeMap &attribs)
163{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800164 EGLAttrib attrib =
165 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500166 switch (attrib)
167 {
168 case EGL_NO_RESET_NOTIFICATION:
169 return GL_NO_RESET_NOTIFICATION_EXT;
170 case EGL_LOSE_CONTEXT_ON_RESET:
171 return GL_LOSE_CONTEXT_ON_RESET_EXT;
172 default:
173 UNREACHABLE();
174 return GL_NONE;
175 }
176}
177
178bool GetRobustAccess(const egl::AttributeMap &attribs)
179{
Geoff Lang077f20a2016-11-01 10:08:02 -0400180 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
181 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
182 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500183}
184
185bool GetDebug(const egl::AttributeMap &attribs)
186{
Geoff Lang077f20a2016-11-01 10:08:02 -0400187 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
188 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500189}
190
191bool GetNoError(const egl::AttributeMap &attribs)
192{
193 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
194}
195
Geoff Langc287ea62016-09-16 14:46:51 -0400196bool GetWebGLContext(const egl::AttributeMap &attribs)
197{
Jamie Madill4230d482018-09-14 10:14:45 -0400198 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400199}
200
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400201bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
202{
203 // If the context is WebGL, extensions are disabled by default
204 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
205 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
206}
207
Geoff Langf41a7152016-09-19 15:11:17 -0400208bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
209{
Jamie Madill4230d482018-09-14 10:14:45 -0400210 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400211}
212
Geoff Langfeb8c682017-02-13 16:07:35 -0500213bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
214{
215 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
216}
217
Geoff Langb433e872017-10-05 14:01:47 -0400218bool GetRobustResourceInit(const egl::AttributeMap &attribs)
219{
220 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
221}
222
Martin Radev9d901792016-07-15 15:58:58 +0300223std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
224{
225 std::string labelName;
226 if (label != nullptr)
227 {
228 size_t labelLength = length < 0 ? strlen(label) : length;
229 labelName = std::string(label, labelLength);
230 }
231 return labelName;
232}
233
234void GetObjectLabelBase(const std::string &objectLabel,
235 GLsizei bufSize,
236 GLsizei *length,
237 GLchar *label)
238{
239 size_t writeLength = objectLabel.length();
240 if (label != nullptr && bufSize > 0)
241 {
242 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
243 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
244 label[writeLength] = '\0';
245 }
246
247 if (length != nullptr)
248 {
249 *length = static_cast<GLsizei>(writeLength);
250 }
251}
252
Jamie Madill0f80ed82017-09-19 00:24:56 -0400253template <typename CapT, typename MaxT>
254void LimitCap(CapT *cap, MaxT maximum)
255{
256 *cap = std::min(*cap, static_cast<CapT>(maximum));
257}
258
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600259constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
Jamie Madill526a6f62018-09-12 11:03:05 -0400260 1, /* Points */
261 2, /* Lines */
262 2, /* LineLoop */
263 2, /* LineStrip */
264 3, /* Triangles */
265 3, /* TriangleStrip */
266 3, /* TriangleFan */
267 2, /* LinesAdjacency */
268 2, /* LineStripAdjacency */
269 3, /* TrianglesAdjacency */
270 3, /* TriangleStripAdjacency */
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600271}};
272// Indices above are code-gen'd so make sure they don't change
273// if any of these static asserts are hit, must update kMinimumPrimitiveCounts abouve
274static_assert(static_cast<gl::PrimitiveMode>(0) == gl::PrimitiveMode::Points,
275 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
276static_assert(static_cast<gl::PrimitiveMode>(1) == gl::PrimitiveMode::Lines,
277 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
278static_assert(static_cast<gl::PrimitiveMode>(2) == gl::PrimitiveMode::LineLoop,
279 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
280static_assert(static_cast<gl::PrimitiveMode>(3) == gl::PrimitiveMode::LineStrip,
281 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
282static_assert(static_cast<gl::PrimitiveMode>(4) == gl::PrimitiveMode::Triangles,
283 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
284static_assert(static_cast<gl::PrimitiveMode>(5) == gl::PrimitiveMode::TriangleStrip,
285 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
286static_assert(static_cast<gl::PrimitiveMode>(6) == gl::PrimitiveMode::TriangleFan,
287 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
288static_assert(static_cast<gl::PrimitiveMode>(7) == gl::PrimitiveMode::LinesAdjacency,
289 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
290static_assert(static_cast<gl::PrimitiveMode>(8) == gl::PrimitiveMode::LineStripAdjacency,
291 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
292static_assert(static_cast<gl::PrimitiveMode>(9) == gl::PrimitiveMode::TrianglesAdjacency,
293 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
294static_assert(static_cast<gl::PrimitiveMode>(10) == gl::PrimitiveMode::TriangleStripAdjacency,
295 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
296static_assert(static_cast<gl::PrimitiveMode>(11) == gl::PrimitiveMode::EnumCount,
297 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
298
Jamie Madill6d32cef2018-08-14 02:34:28 -0400299enum SubjectIndexes : angle::SubjectIndex
300{
301 kTexture0SubjectIndex = 0,
302 kTextureMaxSubjectIndex = kTexture0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
303 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
304 kUniformBufferMaxSubjectIndex =
305 kUniformBuffer0SubjectIndex + gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400306 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
307 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
308 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400309 kReadFramebufferSubjectIndex,
310 kDrawFramebufferSubjectIndex
311};
Geoff Langf6db0982015-08-25 13:04:00 -0400312} // anonymous namespace
313
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000314namespace gl
315{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000316
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400317Context::Context(rx::EGLImplFactory *implFactory,
318 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400319 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500320 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400321 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500322 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700323 const egl::DisplayExtensions &displayExtensions,
324 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500325 : mState(reinterpret_cast<ContextID>(this),
326 shareContext ? &shareContext->mState : nullptr,
327 shareTextures,
328 GetClientVersion(attribs),
329 &mGLState,
330 mCaps,
331 mTextureCaps,
332 mExtensions,
333 mLimitations),
334 mSkipValidation(GetNoError(attribs)),
335 mDisplayTextureShareGroup(shareTextures != nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400336 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400337 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400338 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400339 mGLState(GetDebug(attribs),
340 GetBindGeneratesResource(attribs),
341 GetClientArraysEnabled(attribs),
342 GetRobustResourceInit(attribs),
343 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400344 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500345 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400346 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500347 mHasBeenCurrent(false),
348 mContextLost(false),
349 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700350 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500351 mResetStrategy(GetResetStrategy(attribs)),
352 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400353 mSurfacelessSupported(displayExtensions.surfacelessContext),
354 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400355 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
356 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500357 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400358 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400359 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400360 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
361 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
362 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400363 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800364 mZeroFilledBuffer(1000u),
365 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000366{
Jamie Madill6d32cef2018-08-14 02:34:28 -0400367 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
368 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
369 {
370 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
371 }
Jamie Madille25b8002018-09-20 13:39:49 -0400372
373 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
374 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
375 {
376 mSamplerObserverBindings.emplace_back(this, samplerIndex);
377 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400378}
Jamie Madill5b772312018-03-08 20:28:32 -0500379
Geoff Lang33f11fb2018-05-07 13:42:47 -0400380void Context::initialize()
381{
382 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400383
Geoff Lang33f11fb2018-05-07 13:42:47 -0400384 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700385 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400386
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400387 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100388
Shannon Woods53a94a82014-06-24 15:20:36 -0400389 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400390
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000391 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400392 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000393 // and cube map texture state vectors respectively associated with them.
394 // In order that access to these initial textures not be lost, they are treated as texture
395 // objects all of whose names are 0.
396
Corentin Wallez99d492c2018-02-27 15:17:10 -0500397 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800398 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500399
Corentin Wallez99d492c2018-02-27 15:17:10 -0500400 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800401 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400402
Geoff Langeb66a6e2016-10-31 13:06:12 -0400403 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400404 {
405 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500406 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800407 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400408
Corentin Wallez99d492c2018-02-27 15:17:10 -0500409 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800410 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400411 }
Yizhou Jiang7818a852018-09-06 15:02:04 +0800412 if (getClientVersion() >= Version(3, 1) || mSupportedExtensions.textureMultisample)
Geoff Lang3b573612016-10-31 14:08:10 -0400413 {
414 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500415 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800416 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Yizhou Jiang7818a852018-09-06 15:02:04 +0800417 }
418 if (getClientVersion() >= Version(3, 1))
419 {
Olli Etuahod310a432018-08-24 15:40:23 +0300420 Texture *zeroTexture2DMultisampleArray =
421 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
422 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800423
Jiajia Qin6eafb042016-12-27 17:04:07 +0800424 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
425 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800426 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800427 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800428
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800429 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
430 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400431 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800432 }
Geoff Lang3b573612016-10-31 14:08:10 -0400433 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000434
Geoff Langb0f917f2017-12-05 13:41:54 -0500435 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400436 {
437 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500438 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800439 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400440 }
441
Geoff Langb0f917f2017-12-05 13:41:54 -0500442 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400443 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500444 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800445 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400446 }
447
Jamie Madill4928b7c2017-06-20 12:57:39 -0400448 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500449
Jamie Madill57a89722013-07-02 11:57:03 -0400450 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000451
Geoff Langeb66a6e2016-10-31 13:06:12 -0400452 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400453 {
454 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
455 // In the initial state, a default transform feedback object is bound and treated as
456 // a transform feedback object with a name of zero. That object is bound any time
457 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400458 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400459 }
Geoff Langc8058452014-02-03 12:04:11 -0500460
Corentin Wallez336129f2017-10-17 15:55:40 -0400461 for (auto type : angle::AllEnums<BufferBinding>())
462 {
463 bindBuffer(type, 0);
464 }
465
466 bindRenderbuffer(GL_RENDERBUFFER, 0);
467
468 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
469 {
470 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
471 }
472
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700473 // Initialize GLES1 renderer if appropriate.
474 if (getClientVersion() < Version(2, 0))
475 {
476 mGLES1Renderer.reset(new GLES1Renderer());
477 }
478
Jamie Madillad9f24e2016-02-12 09:27:24 -0500479 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400480 mAllDirtyBits.set();
481
Geoff Lang9bf86f02018-07-26 11:46:34 -0400482 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
483 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
484 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400485 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400486 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400487
488 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
489 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
490 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400491 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400492
Jamie Madillc67323a2017-11-02 23:11:41 -0400493 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500494 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500495 // No dirty objects.
496
497 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400498 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500499 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400500 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500501 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
502
503 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
504 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
505 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
506 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
507 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
508 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
509 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
510 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
511 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
512 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
513 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400514 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500515 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
516
517 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
518 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700519 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400520 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
521 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500522 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
523 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400524
Xinghua Cao10a4d432017-11-28 14:46:26 +0800525 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800526 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
527 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800528 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
529 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
530 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
531 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800532 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800533 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800534 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400535 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400536 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800537
Jamie Madillb4927eb2018-07-16 11:39:46 -0400538 mImplementation->setErrorSet(&mErrors);
539
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400540 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000541}
542
Jamie Madill4928b7c2017-06-20 12:57:39 -0400543egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000544{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700545 if (mGLES1Renderer)
546 {
547 mGLES1Renderer->onDestroy(this, &mGLState);
548 }
549
Jamie Madille7b3fe22018-04-05 09:42:46 -0400550 ANGLE_TRY(releaseSurface(display));
551
Corentin Wallez80b24112015-08-25 16:41:57 -0400552 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000553 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400554 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000555 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400556 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000557
Corentin Wallez80b24112015-08-25 16:41:57 -0400558 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000559 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400560 if (query.second != nullptr)
561 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400562 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400563 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000564 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400565 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000566
Corentin Wallez80b24112015-08-25 16:41:57 -0400567 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400568 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400569 if (vertexArray.second)
570 {
571 vertexArray.second->onDestroy(this);
572 }
Jamie Madill57a89722013-07-02 11:57:03 -0400573 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400574 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400575
Corentin Wallez80b24112015-08-25 16:41:57 -0400576 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500577 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500578 if (transformFeedback.second != nullptr)
579 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500580 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500581 }
Geoff Langc8058452014-02-03 12:04:11 -0500582 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400583 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500584
Jamie Madill5b772312018-03-08 20:28:32 -0500585 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400586 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800587 if (zeroTexture.get() != nullptr)
588 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400589 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800590 zeroTexture.set(this, nullptr);
591 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400592 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000593
Jamie Madill2f348d22017-06-05 10:50:59 -0400594 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500595
Jamie Madill4928b7c2017-06-20 12:57:39 -0400596 mGLState.reset(this);
597
Jamie Madill6c1f6712017-02-14 19:08:04 -0500598 mState.mBuffers->release(this);
599 mState.mShaderPrograms->release(this);
600 mState.mTextures->release(this);
601 mState.mRenderbuffers->release(this);
602 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400603 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500604 mState.mPaths->release(this);
605 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800606 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400607
jchen107ae70d82018-07-06 13:47:01 +0800608 mThreadPool.reset();
609
Jamie Madill76e471e2017-10-21 09:56:01 -0400610 mImplementation->onDestroy(this);
611
Jamie Madill4928b7c2017-06-20 12:57:39 -0400612 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000613}
614
Jamie Madill70ee0f62017-02-06 16:04:20 -0500615Context::~Context()
616{
617}
618
Geoff Lang75359662018-04-11 01:42:27 -0400619void Context::setLabel(EGLLabelKHR label)
620{
621 mLabel = label;
622}
623
624EGLLabelKHR Context::getLabel() const
625{
626 return mLabel;
627}
628
Jamie Madill4928b7c2017-06-20 12:57:39 -0400629egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000630{
Jamie Madill61e16b42017-06-19 11:13:23 -0400631 mCurrentDisplay = display;
632
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000633 if (!mHasBeenCurrent)
634 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400635 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000636 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500637 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400638 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000639
Corentin Wallezc295e512017-01-27 17:47:50 -0500640 int width = 0;
641 int height = 0;
642 if (surface != nullptr)
643 {
644 width = surface->getWidth();
645 height = surface->getHeight();
646 }
647
648 mGLState.setViewportParams(0, 0, width, height);
649 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000650
651 mHasBeenCurrent = true;
652 }
653
Jamie Madill1b94d432015-08-07 13:23:23 -0400654 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700655 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400656 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400657
Jamie Madill4928b7c2017-06-20 12:57:39 -0400658 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500659
660 Framebuffer *newDefault = nullptr;
661 if (surface != nullptr)
662 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400663 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500664 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400665 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500666 }
667 else
668 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400669 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500670 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000671
Corentin Wallez37c39792015-08-20 14:19:46 -0400672 // Update default framebuffer, the binding of the previous default
673 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400674 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400675 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700676 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400677 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400678 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400679 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700680 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400681 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400682 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400683 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400684 }
Ian Ewell292f0052016-02-04 10:37:32 -0500685
Jamie Madill32643ce2018-10-19 11:38:03 -0400686 // Notify the renderer of a context switch.
687 // TODO(jmadill): Fix this error handling. http://anglebug.com/2491
688 (void)(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400689 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000690}
691
Jamie Madill4928b7c2017-06-20 12:57:39 -0400692egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400693{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400694 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400695
Geoff Langbf7b95d2018-05-01 16:48:21 -0400696 // Remove the default framebuffer
697 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500698 {
699 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400700 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500701 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400702
703 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500704 {
705 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400706 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500707 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400708
709 if (defaultFramebuffer)
710 {
711 defaultFramebuffer->onDestroy(this);
712 delete defaultFramebuffer;
713 }
714
Corentin Wallezc295e512017-01-27 17:47:50 -0500715 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
716
717 if (mCurrentSurface)
718 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400719 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500720 mCurrentSurface = nullptr;
721 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400722
723 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400724}
725
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000726GLuint Context::createBuffer()
727{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500728 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000729}
730
731GLuint Context::createProgram()
732{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500733 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000734}
735
Jiawei Shao385b3e02018-03-21 09:43:28 +0800736GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000737{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500738 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000739}
740
741GLuint Context::createTexture()
742{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500743 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000744}
745
746GLuint Context::createRenderbuffer()
747{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500748 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000749}
750
Jamie Madill13951342018-09-30 15:24:28 -0400751void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
752{
Jamie Madill526392d2018-11-16 09:35:14 -0500753 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(this, range, createdOut));
Jamie Madill13951342018-09-30 15:24:28 -0400754}
755
Brandon Jones59770802018-04-02 13:18:42 -0700756GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300757{
Jamie Madill13951342018-09-30 15:24:28 -0400758 GLuint created = 0;
759 tryGenPaths(range, &created);
760 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300761}
762
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000763// Returns an unused framebuffer name
764GLuint Context::createFramebuffer()
765{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500766 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000767}
768
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500769void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000770{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500771 for (int i = 0; i < n; i++)
772 {
773 GLuint handle = mFenceNVHandleAllocator.allocate();
774 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
775 fences[i] = handle;
776 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000777}
778
Yunchao Hea336b902017-08-02 16:05:21 +0800779GLuint Context::createProgramPipeline()
780{
781 return mState.mPipelines->createProgramPipeline();
782}
783
Jiawei Shao385b3e02018-03-21 09:43:28 +0800784GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800785{
786 UNIMPLEMENTED();
787 return 0u;
788}
789
James Darpinian4d9d4832018-03-13 12:43:28 -0700790void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000791{
James Darpinian4d9d4832018-03-13 12:43:28 -0700792 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
793 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000794 {
795 detachBuffer(buffer);
796 }
Jamie Madill893ab082014-05-16 16:56:10 -0400797
James Darpinian4d9d4832018-03-13 12:43:28 -0700798 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000799}
800
801void Context::deleteShader(GLuint shader)
802{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500803 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000804}
805
806void Context::deleteProgram(GLuint program)
807{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500808 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000809}
810
811void Context::deleteTexture(GLuint texture)
812{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500813 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000814 {
815 detachTexture(texture);
816 }
817
Jamie Madill6c1f6712017-02-14 19:08:04 -0500818 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000819}
820
821void Context::deleteRenderbuffer(GLuint renderbuffer)
822{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500823 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000824 {
825 detachRenderbuffer(renderbuffer);
826 }
Jamie Madill893ab082014-05-16 16:56:10 -0400827
Jamie Madill6c1f6712017-02-14 19:08:04 -0500828 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000829}
830
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400831void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400832{
833 // The spec specifies the underlying Fence object is not deleted until all current
834 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
835 // and since our API is currently designed for being called from a single thread, we can delete
836 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400837 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400838}
839
Yunchao Hea336b902017-08-02 16:05:21 +0800840void Context::deleteProgramPipeline(GLuint pipeline)
841{
842 if (mState.mPipelines->getProgramPipeline(pipeline))
843 {
844 detachProgramPipeline(pipeline);
845 }
846
847 mState.mPipelines->deleteObject(this, pipeline);
848}
849
Sami Väisänene45e53b2016-05-25 10:36:04 +0300850void Context::deletePaths(GLuint first, GLsizei range)
851{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500852 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300853}
854
Brandon Jones59770802018-04-02 13:18:42 -0700855bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300856{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500857 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300858 if (pathObj == nullptr)
859 return false;
860
861 return pathObj->hasPathData();
862}
863
Brandon Jones59770802018-04-02 13:18:42 -0700864bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300865{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500866 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300867}
868
Brandon Jones59770802018-04-02 13:18:42 -0700869void Context::pathCommands(GLuint path,
870 GLsizei numCommands,
871 const GLubyte *commands,
872 GLsizei numCoords,
873 GLenum coordType,
874 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300875{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500876 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300877
878 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
879}
880
Jamie Madill007530e2017-12-28 14:27:04 -0500881void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300882{
Jamie Madill007530e2017-12-28 14:27:04 -0500883 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300884
885 switch (pname)
886 {
887 case GL_PATH_STROKE_WIDTH_CHROMIUM:
888 pathObj->setStrokeWidth(value);
889 break;
890 case GL_PATH_END_CAPS_CHROMIUM:
891 pathObj->setEndCaps(static_cast<GLenum>(value));
892 break;
893 case GL_PATH_JOIN_STYLE_CHROMIUM:
894 pathObj->setJoinStyle(static_cast<GLenum>(value));
895 break;
896 case GL_PATH_MITER_LIMIT_CHROMIUM:
897 pathObj->setMiterLimit(value);
898 break;
899 case GL_PATH_STROKE_BOUND_CHROMIUM:
900 pathObj->setStrokeBound(value);
901 break;
902 default:
903 UNREACHABLE();
904 break;
905 }
906}
907
Jamie Madill007530e2017-12-28 14:27:04 -0500908void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300909{
Jamie Madill007530e2017-12-28 14:27:04 -0500910 // TODO(jmadill): Should use proper clamping/casting.
911 pathParameterf(path, pname, static_cast<GLfloat>(value));
912}
913
914void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
915{
916 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300917
918 switch (pname)
919 {
920 case GL_PATH_STROKE_WIDTH_CHROMIUM:
921 *value = pathObj->getStrokeWidth();
922 break;
923 case GL_PATH_END_CAPS_CHROMIUM:
924 *value = static_cast<GLfloat>(pathObj->getEndCaps());
925 break;
926 case GL_PATH_JOIN_STYLE_CHROMIUM:
927 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
928 break;
929 case GL_PATH_MITER_LIMIT_CHROMIUM:
930 *value = pathObj->getMiterLimit();
931 break;
932 case GL_PATH_STROKE_BOUND_CHROMIUM:
933 *value = pathObj->getStrokeBound();
934 break;
935 default:
936 UNREACHABLE();
937 break;
938 }
939}
940
Jamie Madill007530e2017-12-28 14:27:04 -0500941void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
942{
943 GLfloat val = 0.0f;
944 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
945 if (value)
946 *value = static_cast<GLint>(val);
947}
948
Brandon Jones59770802018-04-02 13:18:42 -0700949void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300950{
951 mGLState.setPathStencilFunc(func, ref, mask);
952}
953
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000954void Context::deleteFramebuffer(GLuint framebuffer)
955{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500956 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000957 {
958 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000959 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500960
Jamie Madill6c1f6712017-02-14 19:08:04 -0500961 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000962}
963
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500964void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000965{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500966 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000967 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500968 GLuint fence = fences[i];
969
970 FenceNV *fenceObject = nullptr;
971 if (mFenceNVMap.erase(fence, &fenceObject))
972 {
973 mFenceNVHandleAllocator.release(fence);
974 delete fenceObject;
975 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000976 }
977}
978
Geoff Lang70d0f492015-12-10 17:45:46 -0500979Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000980{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500981 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000982}
983
Geoff Lang70d0f492015-12-10 17:45:46 -0500984Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000985{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500986 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000987}
988
Jamie Madill70b5bb02017-08-28 13:32:37 -0400989Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400990{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400991 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400992}
993
Jamie Madill57a89722013-07-02 11:57:03 -0400994VertexArray *Context::getVertexArray(GLuint handle) const
995{
Jamie Madill96a483b2017-06-27 16:49:21 -0400996 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400997}
998
Jamie Madilldc356042013-07-19 16:36:57 -0400999Sampler *Context::getSampler(GLuint handle) const
1000{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001001 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001002}
1003
Geoff Langc8058452014-02-03 12:04:11 -05001004TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1005{
Jamie Madill96a483b2017-06-27 16:49:21 -04001006 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001007}
1008
Yunchao Hea336b902017-08-02 16:05:21 +08001009ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1010{
1011 return mState.mPipelines->getProgramPipeline(handle);
1012}
1013
Geoff Lang75359662018-04-11 01:42:27 -04001014gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001015{
1016 switch (identifier)
1017 {
1018 case GL_BUFFER:
1019 return getBuffer(name);
1020 case GL_SHADER:
1021 return getShader(name);
1022 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001023 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001024 case GL_VERTEX_ARRAY:
1025 return getVertexArray(name);
1026 case GL_QUERY:
1027 return getQuery(name);
1028 case GL_TRANSFORM_FEEDBACK:
1029 return getTransformFeedback(name);
1030 case GL_SAMPLER:
1031 return getSampler(name);
1032 case GL_TEXTURE:
1033 return getTexture(name);
1034 case GL_RENDERBUFFER:
1035 return getRenderbuffer(name);
1036 case GL_FRAMEBUFFER:
1037 return getFramebuffer(name);
1038 default:
1039 UNREACHABLE();
1040 return nullptr;
1041 }
1042}
1043
Geoff Lang75359662018-04-11 01:42:27 -04001044gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001045{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001046 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001047}
1048
Martin Radev9d901792016-07-15 15:58:58 +03001049void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1050{
Geoff Lang75359662018-04-11 01:42:27 -04001051 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001052 ASSERT(object != nullptr);
1053
1054 std::string labelName = GetObjectLabelFromPointer(length, label);
1055 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001056
1057 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1058 // specified object is active until we do this.
1059 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001060}
1061
1062void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1063{
Geoff Lang75359662018-04-11 01:42:27 -04001064 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001065 ASSERT(object != nullptr);
1066
1067 std::string labelName = GetObjectLabelFromPointer(length, label);
1068 object->setLabel(labelName);
1069}
1070
1071void Context::getObjectLabel(GLenum identifier,
1072 GLuint name,
1073 GLsizei bufSize,
1074 GLsizei *length,
1075 GLchar *label) const
1076{
Geoff Lang75359662018-04-11 01:42:27 -04001077 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001078 ASSERT(object != nullptr);
1079
1080 const std::string &objectLabel = object->getLabel();
1081 GetObjectLabelBase(objectLabel, bufSize, length, label);
1082}
1083
1084void Context::getObjectPtrLabel(const void *ptr,
1085 GLsizei bufSize,
1086 GLsizei *length,
1087 GLchar *label) const
1088{
Geoff Lang75359662018-04-11 01:42:27 -04001089 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001090 ASSERT(object != nullptr);
1091
1092 const std::string &objectLabel = object->getLabel();
1093 GetObjectLabelBase(objectLabel, bufSize, length, label);
1094}
1095
Jamie Madilldc356042013-07-19 16:36:57 -04001096bool Context::isSampler(GLuint samplerName) const
1097{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001098 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001099}
1100
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001101void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001102{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001103 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001104
Jamie Madilldedd7b92014-11-05 16:30:36 -05001105 if (handle == 0)
1106 {
1107 texture = mZeroTextures[target].get();
1108 }
1109 else
1110 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001111 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001112 }
1113
1114 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001115 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001116 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001117}
1118
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001119void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001120{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001121 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1122 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001123 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001124 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001125}
1126
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001127void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001128{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001129 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1130 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001131 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001132 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001133 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001134}
1135
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001136void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001137{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001138 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001139 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001140 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001141 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001142}
1143
Shao80957d92017-02-20 21:25:59 +08001144void Context::bindVertexBuffer(GLuint bindingIndex,
1145 GLuint bufferHandle,
1146 GLintptr offset,
1147 GLsizei stride)
1148{
1149 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001150 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001151 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001152}
1153
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001154void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001155{
Geoff Lang76b10c92014-09-05 16:28:14 -04001156 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001157 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001158 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001159 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001160 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001161}
1162
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001163void Context::bindImageTexture(GLuint unit,
1164 GLuint texture,
1165 GLint level,
1166 GLboolean layered,
1167 GLint layer,
1168 GLenum access,
1169 GLenum format)
1170{
1171 Texture *tex = mState.mTextures->getTexture(texture);
1172 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1173}
1174
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001175void Context::useProgram(GLuint program)
1176{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001177 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001178 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001179}
1180
Jiajia Qin5451d532017-11-16 17:16:34 +08001181void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1182{
1183 UNIMPLEMENTED();
1184}
1185
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001186void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001187{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001188 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001189 TransformFeedback *transformFeedback =
1190 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001191 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001192 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001193}
1194
Yunchao Hea336b902017-08-02 16:05:21 +08001195void Context::bindProgramPipeline(GLuint pipelineHandle)
1196{
1197 ProgramPipeline *pipeline =
1198 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1199 mGLState.setProgramPipelineBinding(this, pipeline);
1200}
1201
Corentin Wallezad3ae902018-03-09 13:40:42 -05001202void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001203{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001204 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001205 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001206
Geoff Lang5aad9672014-09-08 11:10:42 -04001207 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001208 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001209
1210 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001211 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001212 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001213}
1214
Corentin Wallezad3ae902018-03-09 13:40:42 -05001215void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001216{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001217 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001218 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001219
Jamie Madill5188a272018-07-25 10:53:56 -04001220 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001221
Geoff Lang5aad9672014-09-08 11:10:42 -04001222 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001223 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001224 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001225}
1226
Corentin Wallezad3ae902018-03-09 13:40:42 -05001227void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001228{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001229 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001230
1231 Query *queryObject = getQuery(id, true, target);
1232 ASSERT(queryObject);
1233
Jamie Madill5188a272018-07-25 10:53:56 -04001234 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001235}
1236
Corentin Wallezad3ae902018-03-09 13:40:42 -05001237void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001238{
1239 switch (pname)
1240 {
1241 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001242 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001243 break;
1244 case GL_QUERY_COUNTER_BITS_EXT:
1245 switch (target)
1246 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001247 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001248 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1249 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001250 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001251 params[0] = getExtensions().queryCounterBitsTimestamp;
1252 break;
1253 default:
1254 UNREACHABLE();
1255 params[0] = 0;
1256 break;
1257 }
1258 break;
1259 default:
1260 UNREACHABLE();
1261 return;
1262 }
1263}
1264
Corentin Wallezad3ae902018-03-09 13:40:42 -05001265void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001266 GLenum pname,
1267 GLsizei bufSize,
1268 GLsizei *length,
1269 GLint *params)
1270{
1271 getQueryiv(target, pname, params);
1272}
1273
Geoff Lang2186c382016-10-14 10:54:54 -04001274void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001275{
Jamie Madill5188a272018-07-25 10:53:56 -04001276 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001277}
1278
Brandon Jones59770802018-04-02 13:18:42 -07001279void Context::getQueryObjectivRobust(GLuint id,
1280 GLenum pname,
1281 GLsizei bufSize,
1282 GLsizei *length,
1283 GLint *params)
1284{
1285 getQueryObjectiv(id, pname, params);
1286}
1287
Geoff Lang2186c382016-10-14 10:54:54 -04001288void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001289{
Jamie Madill5188a272018-07-25 10:53:56 -04001290 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001291}
1292
Brandon Jones59770802018-04-02 13:18:42 -07001293void Context::getQueryObjectuivRobust(GLuint id,
1294 GLenum pname,
1295 GLsizei bufSize,
1296 GLsizei *length,
1297 GLuint *params)
1298{
1299 getQueryObjectuiv(id, pname, params);
1300}
1301
Geoff Lang2186c382016-10-14 10:54:54 -04001302void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001303{
Jamie Madill5188a272018-07-25 10:53:56 -04001304 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001305}
1306
Brandon Jones59770802018-04-02 13:18:42 -07001307void Context::getQueryObjecti64vRobust(GLuint id,
1308 GLenum pname,
1309 GLsizei bufSize,
1310 GLsizei *length,
1311 GLint64 *params)
1312{
1313 getQueryObjecti64v(id, pname, params);
1314}
1315
Geoff Lang2186c382016-10-14 10:54:54 -04001316void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001317{
Jamie Madill5188a272018-07-25 10:53:56 -04001318 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001319}
1320
Brandon Jones59770802018-04-02 13:18:42 -07001321void Context::getQueryObjectui64vRobust(GLuint id,
1322 GLenum pname,
1323 GLsizei bufSize,
1324 GLsizei *length,
1325 GLuint64 *params)
1326{
1327 getQueryObjectui64v(id, pname, params);
1328}
1329
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001330Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001331{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001332 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001333}
1334
Jamie Madill2f348d22017-06-05 10:50:59 -04001335FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001336{
Jamie Madill96a483b2017-06-27 16:49:21 -04001337 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001338}
1339
Corentin Wallezad3ae902018-03-09 13:40:42 -05001340Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001341{
Jamie Madill96a483b2017-06-27 16:49:21 -04001342 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001343 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001344 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001345 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001346
1347 Query *query = mQueryMap.query(handle);
1348 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001349 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001350 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001351 query = new Query(mImplementation->createQuery(type), handle);
1352 query->addRef();
1353 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001354 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001355 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001356}
1357
Geoff Lang70d0f492015-12-10 17:45:46 -05001358Query *Context::getQuery(GLuint handle) const
1359{
Jamie Madill96a483b2017-06-27 16:49:21 -04001360 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001361}
1362
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001363Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001364{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001365 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1366 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001367}
1368
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001369Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001370{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001371 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001372}
1373
Geoff Lang492a7e42014-11-05 13:27:06 -05001374Compiler *Context::getCompiler() const
1375{
Jamie Madill2f348d22017-06-05 10:50:59 -04001376 if (mCompiler.get() == nullptr)
1377 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001378 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001379 }
1380 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001381}
1382
Jamie Madillc1d770e2017-04-13 17:31:24 -04001383void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001384{
1385 switch (pname)
1386 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001387 case GL_SHADER_COMPILER:
1388 *params = GL_TRUE;
1389 break;
1390 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1391 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1392 break;
1393 default:
1394 mGLState.getBooleanv(pname, params);
1395 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001396 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001397}
1398
Jamie Madillc1d770e2017-04-13 17:31:24 -04001399void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001400{
Shannon Woods53a94a82014-06-24 15:20:36 -04001401 // Queries about context capabilities and maximums are answered by Context.
1402 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001403 switch (pname)
1404 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001405 case GL_ALIASED_LINE_WIDTH_RANGE:
1406 params[0] = mCaps.minAliasedLineWidth;
1407 params[1] = mCaps.maxAliasedLineWidth;
1408 break;
1409 case GL_ALIASED_POINT_SIZE_RANGE:
1410 params[0] = mCaps.minAliasedPointSize;
1411 params[1] = mCaps.maxAliasedPointSize;
1412 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001413 case GL_SMOOTH_POINT_SIZE_RANGE:
1414 params[0] = mCaps.minSmoothPointSize;
1415 params[1] = mCaps.maxSmoothPointSize;
1416 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001417 case GL_SMOOTH_LINE_WIDTH_RANGE:
1418 params[0] = mCaps.minSmoothLineWidth;
1419 params[1] = mCaps.maxSmoothLineWidth;
1420 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001421 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1422 ASSERT(mExtensions.textureFilterAnisotropic);
1423 *params = mExtensions.maxTextureAnisotropy;
1424 break;
1425 case GL_MAX_TEXTURE_LOD_BIAS:
1426 *params = mCaps.maxLODBias;
1427 break;
1428
1429 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1430 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1431 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001432 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1433 // GLES1 constants for modelview/projection matrix.
1434 if (getClientVersion() < Version(2, 0))
1435 {
1436 mGLState.getFloatv(pname, params);
1437 }
1438 else
1439 {
1440 ASSERT(mExtensions.pathRendering);
1441 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1442 memcpy(params, m, 16 * sizeof(GLfloat));
1443 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001444 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001445 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001446
Jamie Madill231c7f52017-04-26 13:45:37 -04001447 default:
1448 mGLState.getFloatv(pname, params);
1449 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001450 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001451}
1452
Jamie Madillc1d770e2017-04-13 17:31:24 -04001453void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001454{
Shannon Woods53a94a82014-06-24 15:20:36 -04001455 // Queries about context capabilities and maximums are answered by Context.
1456 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001457
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001458 switch (pname)
1459 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001460 case GL_MAX_VERTEX_ATTRIBS:
1461 *params = mCaps.maxVertexAttributes;
1462 break;
1463 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1464 *params = mCaps.maxVertexUniformVectors;
1465 break;
1466 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001467 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001468 break;
1469 case GL_MAX_VARYING_VECTORS:
1470 *params = mCaps.maxVaryingVectors;
1471 break;
1472 case GL_MAX_VARYING_COMPONENTS:
1473 *params = mCaps.maxVertexOutputComponents;
1474 break;
1475 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1476 *params = mCaps.maxCombinedTextureImageUnits;
1477 break;
1478 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001479 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001480 break;
1481 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001482 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001483 break;
1484 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1485 *params = mCaps.maxFragmentUniformVectors;
1486 break;
1487 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001488 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001489 break;
1490 case GL_MAX_RENDERBUFFER_SIZE:
1491 *params = mCaps.maxRenderbufferSize;
1492 break;
1493 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1494 *params = mCaps.maxColorAttachments;
1495 break;
1496 case GL_MAX_DRAW_BUFFERS_EXT:
1497 *params = mCaps.maxDrawBuffers;
1498 break;
1499 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1500 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1501 case GL_SUBPIXEL_BITS:
1502 *params = 4;
1503 break;
1504 case GL_MAX_TEXTURE_SIZE:
1505 *params = mCaps.max2DTextureSize;
1506 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001507 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1508 *params = mCaps.maxRectangleTextureSize;
1509 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001510 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1511 *params = mCaps.maxCubeMapTextureSize;
1512 break;
1513 case GL_MAX_3D_TEXTURE_SIZE:
1514 *params = mCaps.max3DTextureSize;
1515 break;
1516 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1517 *params = mCaps.maxArrayTextureLayers;
1518 break;
1519 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1520 *params = mCaps.uniformBufferOffsetAlignment;
1521 break;
1522 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1523 *params = mCaps.maxUniformBufferBindings;
1524 break;
1525 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001526 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001527 break;
1528 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001529 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001530 break;
1531 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1532 *params = mCaps.maxCombinedTextureImageUnits;
1533 break;
1534 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1535 *params = mCaps.maxVertexOutputComponents;
1536 break;
1537 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1538 *params = mCaps.maxFragmentInputComponents;
1539 break;
1540 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1541 *params = mCaps.minProgramTexelOffset;
1542 break;
1543 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1544 *params = mCaps.maxProgramTexelOffset;
1545 break;
1546 case GL_MAJOR_VERSION:
1547 *params = getClientVersion().major;
1548 break;
1549 case GL_MINOR_VERSION:
1550 *params = getClientVersion().minor;
1551 break;
1552 case GL_MAX_ELEMENTS_INDICES:
1553 *params = mCaps.maxElementsIndices;
1554 break;
1555 case GL_MAX_ELEMENTS_VERTICES:
1556 *params = mCaps.maxElementsVertices;
1557 break;
1558 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1559 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1560 break;
1561 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1562 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1563 break;
1564 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1565 *params = mCaps.maxTransformFeedbackSeparateComponents;
1566 break;
1567 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1568 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1569 break;
1570 case GL_MAX_SAMPLES_ANGLE:
1571 *params = mCaps.maxSamples;
1572 break;
1573 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001574 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001575 params[0] = mCaps.maxViewportWidth;
1576 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001577 }
1578 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001579 case GL_COMPRESSED_TEXTURE_FORMATS:
1580 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1581 params);
1582 break;
1583 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1584 *params = mResetStrategy;
1585 break;
1586 case GL_NUM_SHADER_BINARY_FORMATS:
1587 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1588 break;
1589 case GL_SHADER_BINARY_FORMATS:
1590 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1591 break;
1592 case GL_NUM_PROGRAM_BINARY_FORMATS:
1593 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1594 break;
1595 case GL_PROGRAM_BINARY_FORMATS:
1596 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1597 break;
1598 case GL_NUM_EXTENSIONS:
1599 *params = static_cast<GLint>(mExtensionStrings.size());
1600 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001601
Geoff Lang38f24ee2018-10-01 13:04:59 -04001602 // GL_ANGLE_request_extension
1603 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1604 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1605 break;
1606
Jamie Madill231c7f52017-04-26 13:45:37 -04001607 // GL_KHR_debug
1608 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1609 *params = mExtensions.maxDebugMessageLength;
1610 break;
1611 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1612 *params = mExtensions.maxDebugLoggedMessages;
1613 break;
1614 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1615 *params = mExtensions.maxDebugGroupStackDepth;
1616 break;
1617 case GL_MAX_LABEL_LENGTH:
1618 *params = mExtensions.maxLabelLength;
1619 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001620
Martin Radeve5285d22017-07-14 16:23:53 +03001621 // GL_ANGLE_multiview
1622 case GL_MAX_VIEWS_ANGLE:
1623 *params = mExtensions.maxViews;
1624 break;
1625
Jamie Madill231c7f52017-04-26 13:45:37 -04001626 // GL_EXT_disjoint_timer_query
1627 case GL_GPU_DISJOINT_EXT:
1628 *params = mImplementation->getGPUDisjoint();
1629 break;
1630 case GL_MAX_FRAMEBUFFER_WIDTH:
1631 *params = mCaps.maxFramebufferWidth;
1632 break;
1633 case GL_MAX_FRAMEBUFFER_HEIGHT:
1634 *params = mCaps.maxFramebufferHeight;
1635 break;
1636 case GL_MAX_FRAMEBUFFER_SAMPLES:
1637 *params = mCaps.maxFramebufferSamples;
1638 break;
1639 case GL_MAX_SAMPLE_MASK_WORDS:
1640 *params = mCaps.maxSampleMaskWords;
1641 break;
1642 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1643 *params = mCaps.maxColorTextureSamples;
1644 break;
1645 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1646 *params = mCaps.maxDepthTextureSamples;
1647 break;
1648 case GL_MAX_INTEGER_SAMPLES:
1649 *params = mCaps.maxIntegerSamples;
1650 break;
1651 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1652 *params = mCaps.maxVertexAttribRelativeOffset;
1653 break;
1654 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1655 *params = mCaps.maxVertexAttribBindings;
1656 break;
1657 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1658 *params = mCaps.maxVertexAttribStride;
1659 break;
1660 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001661 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001662 break;
1663 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001664 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001665 break;
1666 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001667 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001668 break;
1669 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001670 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001671 break;
1672 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001673 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001674 break;
1675 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001676 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001677 break;
1678 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001679 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001680 break;
1681 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001682 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001683 break;
1684 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1685 *params = mCaps.minProgramTextureGatherOffset;
1686 break;
1687 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1688 *params = mCaps.maxProgramTextureGatherOffset;
1689 break;
1690 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1691 *params = mCaps.maxComputeWorkGroupInvocations;
1692 break;
1693 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001694 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001695 break;
1696 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001697 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001698 break;
1699 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1700 *params = mCaps.maxComputeSharedMemorySize;
1701 break;
1702 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001703 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001704 break;
1705 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001706 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001707 break;
1708 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001709 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001710 break;
1711 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001712 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001713 break;
1714 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001715 *params =
1716 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001717 break;
1718 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001719 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001720 break;
1721 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1722 *params = mCaps.maxCombinedShaderOutputResources;
1723 break;
1724 case GL_MAX_UNIFORM_LOCATIONS:
1725 *params = mCaps.maxUniformLocations;
1726 break;
1727 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1728 *params = mCaps.maxAtomicCounterBufferBindings;
1729 break;
1730 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1731 *params = mCaps.maxAtomicCounterBufferSize;
1732 break;
1733 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1734 *params = mCaps.maxCombinedAtomicCounterBuffers;
1735 break;
1736 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1737 *params = mCaps.maxCombinedAtomicCounters;
1738 break;
1739 case GL_MAX_IMAGE_UNITS:
1740 *params = mCaps.maxImageUnits;
1741 break;
1742 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1743 *params = mCaps.maxCombinedImageUniforms;
1744 break;
1745 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1746 *params = mCaps.maxShaderStorageBufferBindings;
1747 break;
1748 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1749 *params = mCaps.maxCombinedShaderStorageBlocks;
1750 break;
1751 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1752 *params = mCaps.shaderStorageBufferOffsetAlignment;
1753 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001754
1755 // GL_EXT_geometry_shader
1756 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1757 *params = mCaps.maxFramebufferLayers;
1758 break;
1759 case GL_LAYER_PROVOKING_VERTEX_EXT:
1760 *params = mCaps.layerProvokingVertex;
1761 break;
1762 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001763 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001764 break;
1765 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001766 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001767 break;
1768 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001769 *params =
1770 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001771 break;
1772 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1773 *params = mCaps.maxGeometryInputComponents;
1774 break;
1775 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1776 *params = mCaps.maxGeometryOutputComponents;
1777 break;
1778 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1779 *params = mCaps.maxGeometryOutputVertices;
1780 break;
1781 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1782 *params = mCaps.maxGeometryTotalOutputComponents;
1783 break;
1784 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1785 *params = mCaps.maxGeometryShaderInvocations;
1786 break;
1787 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001788 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001789 break;
1790 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001791 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001792 break;
1793 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001794 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001795 break;
1796 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001797 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001798 break;
1799 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001800 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001801 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001802 // GLES1 emulation: Caps queries
1803 case GL_MAX_TEXTURE_UNITS:
1804 *params = mCaps.maxMultitextureUnits;
1805 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001806 case GL_MAX_MODELVIEW_STACK_DEPTH:
1807 *params = mCaps.maxModelviewMatrixStackDepth;
1808 break;
1809 case GL_MAX_PROJECTION_STACK_DEPTH:
1810 *params = mCaps.maxProjectionMatrixStackDepth;
1811 break;
1812 case GL_MAX_TEXTURE_STACK_DEPTH:
1813 *params = mCaps.maxTextureMatrixStackDepth;
1814 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001815 case GL_MAX_LIGHTS:
1816 *params = mCaps.maxLights;
1817 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001818 case GL_MAX_CLIP_PLANES:
1819 *params = mCaps.maxClipPlanes;
1820 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001821 // GLES1 emulation: Vertex attribute queries
1822 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1823 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1824 case GL_COLOR_ARRAY_BUFFER_BINDING:
1825 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1826 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1827 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1828 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1829 break;
1830 case GL_VERTEX_ARRAY_STRIDE:
1831 case GL_NORMAL_ARRAY_STRIDE:
1832 case GL_COLOR_ARRAY_STRIDE:
1833 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1834 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1835 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1836 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1837 break;
1838 case GL_VERTEX_ARRAY_SIZE:
1839 case GL_COLOR_ARRAY_SIZE:
1840 case GL_TEXTURE_COORD_ARRAY_SIZE:
1841 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1842 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1843 break;
1844 case GL_VERTEX_ARRAY_TYPE:
1845 case GL_COLOR_ARRAY_TYPE:
1846 case GL_NORMAL_ARRAY_TYPE:
1847 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1848 case GL_TEXTURE_COORD_ARRAY_TYPE:
1849 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1850 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1851 break;
1852
jchen1082af6202018-06-22 10:59:52 +08001853 // GL_KHR_parallel_shader_compile
1854 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1855 *params = mGLState.getMaxShaderCompilerThreads();
1856 break;
1857
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001858 // GL_EXT_blend_func_extended
1859 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1860 *params = mExtensions.maxDualSourceDrawBuffers;
1861 break;
1862
Jamie Madill231c7f52017-04-26 13:45:37 -04001863 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001864 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001865 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001866 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001867}
1868
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001869void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001870{
Shannon Woods53a94a82014-06-24 15:20:36 -04001871 // Queries about context capabilities and maximums are answered by Context.
1872 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001873 switch (pname)
1874 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001875 case GL_MAX_ELEMENT_INDEX:
1876 *params = mCaps.maxElementIndex;
1877 break;
1878 case GL_MAX_UNIFORM_BLOCK_SIZE:
1879 *params = mCaps.maxUniformBlockSize;
1880 break;
1881 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001882 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001883 break;
1884 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001885 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001886 break;
1887 case GL_MAX_SERVER_WAIT_TIMEOUT:
1888 *params = mCaps.maxServerWaitTimeout;
1889 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001890
Jamie Madill231c7f52017-04-26 13:45:37 -04001891 // GL_EXT_disjoint_timer_query
1892 case GL_TIMESTAMP_EXT:
1893 *params = mImplementation->getTimestamp();
1894 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001895
Jamie Madill231c7f52017-04-26 13:45:37 -04001896 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1897 *params = mCaps.maxShaderStorageBlockSize;
1898 break;
1899 default:
1900 UNREACHABLE();
1901 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001902 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001903}
1904
Geoff Lang70d0f492015-12-10 17:45:46 -05001905void Context::getPointerv(GLenum pname, void **params) const
1906{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001907 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001908}
1909
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001910void Context::getPointervRobustANGLERobust(GLenum pname,
1911 GLsizei bufSize,
1912 GLsizei *length,
1913 void **params)
1914{
1915 UNIMPLEMENTED();
1916}
1917
Martin Radev66fb8202016-07-28 11:45:20 +03001918void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001919{
Shannon Woods53a94a82014-06-24 15:20:36 -04001920 // Queries about context capabilities and maximums are answered by Context.
1921 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001922
1923 GLenum nativeType;
1924 unsigned int numParams;
1925 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1926 ASSERT(queryStatus);
1927
1928 if (nativeType == GL_INT)
1929 {
1930 switch (target)
1931 {
1932 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1933 ASSERT(index < 3u);
1934 *data = mCaps.maxComputeWorkGroupCount[index];
1935 break;
1936 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1937 ASSERT(index < 3u);
1938 *data = mCaps.maxComputeWorkGroupSize[index];
1939 break;
1940 default:
1941 mGLState.getIntegeri_v(target, index, data);
1942 }
1943 }
1944 else
1945 {
1946 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1947 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001948}
1949
Brandon Jones59770802018-04-02 13:18:42 -07001950void Context::getIntegeri_vRobust(GLenum target,
1951 GLuint index,
1952 GLsizei bufSize,
1953 GLsizei *length,
1954 GLint *data)
1955{
1956 getIntegeri_v(target, index, data);
1957}
1958
Martin Radev66fb8202016-07-28 11:45:20 +03001959void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001960{
Shannon Woods53a94a82014-06-24 15:20:36 -04001961 // Queries about context capabilities and maximums are answered by Context.
1962 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001963
1964 GLenum nativeType;
1965 unsigned int numParams;
1966 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1967 ASSERT(queryStatus);
1968
1969 if (nativeType == GL_INT_64_ANGLEX)
1970 {
1971 mGLState.getInteger64i_v(target, index, data);
1972 }
1973 else
1974 {
1975 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1976 }
1977}
1978
Brandon Jones59770802018-04-02 13:18:42 -07001979void Context::getInteger64i_vRobust(GLenum target,
1980 GLuint index,
1981 GLsizei bufSize,
1982 GLsizei *length,
1983 GLint64 *data)
1984{
1985 getInteger64i_v(target, index, data);
1986}
1987
Martin Radev66fb8202016-07-28 11:45:20 +03001988void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1989{
1990 // Queries about context capabilities and maximums are answered by Context.
1991 // Queries about current GL state values are answered by State.
1992
1993 GLenum nativeType;
1994 unsigned int numParams;
1995 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1996 ASSERT(queryStatus);
1997
1998 if (nativeType == GL_BOOL)
1999 {
2000 mGLState.getBooleani_v(target, index, data);
2001 }
2002 else
2003 {
2004 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2005 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002006}
2007
Brandon Jones59770802018-04-02 13:18:42 -07002008void Context::getBooleani_vRobust(GLenum target,
2009 GLuint index,
2010 GLsizei bufSize,
2011 GLsizei *length,
2012 GLboolean *data)
2013{
2014 getBooleani_v(target, index, data);
2015}
2016
Corentin Wallez336129f2017-10-17 15:55:40 -04002017void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002018{
2019 Buffer *buffer = mGLState.getTargetBuffer(target);
2020 QueryBufferParameteriv(buffer, pname, params);
2021}
2022
Brandon Jones59770802018-04-02 13:18:42 -07002023void Context::getBufferParameterivRobust(BufferBinding target,
2024 GLenum pname,
2025 GLsizei bufSize,
2026 GLsizei *length,
2027 GLint *params)
2028{
2029 getBufferParameteriv(target, pname, params);
2030}
2031
He Yunchao010e4db2017-03-03 14:22:06 +08002032void Context::getFramebufferAttachmentParameteriv(GLenum target,
2033 GLenum attachment,
2034 GLenum pname,
2035 GLint *params)
2036{
2037 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002038 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002039}
2040
Brandon Jones59770802018-04-02 13:18:42 -07002041void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2042 GLenum attachment,
2043 GLenum pname,
2044 GLsizei bufSize,
2045 GLsizei *length,
2046 GLint *params)
2047{
2048 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2049}
2050
He Yunchao010e4db2017-03-03 14:22:06 +08002051void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2052{
2053 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2054 QueryRenderbufferiv(this, renderbuffer, pname, params);
2055}
2056
Brandon Jones59770802018-04-02 13:18:42 -07002057void Context::getRenderbufferParameterivRobust(GLenum target,
2058 GLenum pname,
2059 GLsizei bufSize,
2060 GLsizei *length,
2061 GLint *params)
2062{
2063 getRenderbufferParameteriv(target, pname, params);
2064}
2065
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002066void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002067{
Till Rathmannb8543632018-10-02 19:46:14 +02002068 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002069 QueryTexParameterfv(texture, pname, params);
2070}
2071
Brandon Jones59770802018-04-02 13:18:42 -07002072void Context::getTexParameterfvRobust(TextureType target,
2073 GLenum pname,
2074 GLsizei bufSize,
2075 GLsizei *length,
2076 GLfloat *params)
2077{
2078 getTexParameterfv(target, pname, params);
2079}
2080
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002081void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002082{
Till Rathmannb8543632018-10-02 19:46:14 +02002083 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002084 QueryTexParameteriv(texture, pname, params);
2085}
Jiajia Qin5451d532017-11-16 17:16:34 +08002086
Till Rathmannb8543632018-10-02 19:46:14 +02002087void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2088{
2089 const Texture *const texture = getTargetTexture(target);
2090 QueryTexParameterIiv(texture, pname, params);
2091}
2092
2093void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2094{
2095 const Texture *const texture = getTargetTexture(target);
2096 QueryTexParameterIuiv(texture, pname, params);
2097}
2098
Brandon Jones59770802018-04-02 13:18:42 -07002099void Context::getTexParameterivRobust(TextureType target,
2100 GLenum pname,
2101 GLsizei bufSize,
2102 GLsizei *length,
2103 GLint *params)
2104{
2105 getTexParameteriv(target, pname, params);
2106}
2107
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002108void Context::getTexParameterIivRobust(TextureType target,
2109 GLenum pname,
2110 GLsizei bufSize,
2111 GLsizei *length,
2112 GLint *params)
2113{
2114 UNIMPLEMENTED();
2115}
2116
2117void Context::getTexParameterIuivRobust(TextureType target,
2118 GLenum pname,
2119 GLsizei bufSize,
2120 GLsizei *length,
2121 GLuint *params)
2122{
2123 UNIMPLEMENTED();
2124}
2125
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002126void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002127{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002128 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002129 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002130}
2131
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002132void Context::getTexLevelParameterivRobust(TextureTarget target,
2133 GLint level,
2134 GLenum pname,
2135 GLsizei bufSize,
2136 GLsizei *length,
2137 GLint *params)
2138{
2139 UNIMPLEMENTED();
2140}
2141
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002142void Context::getTexLevelParameterfv(TextureTarget target,
2143 GLint level,
2144 GLenum pname,
2145 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002146{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002147 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002148 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002149}
2150
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002151void Context::getTexLevelParameterfvRobust(TextureTarget target,
2152 GLint level,
2153 GLenum pname,
2154 GLsizei bufSize,
2155 GLsizei *length,
2156 GLfloat *params)
2157{
2158 UNIMPLEMENTED();
2159}
2160
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002161void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002162{
Till Rathmannb8543632018-10-02 19:46:14 +02002163 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002164 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002165 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002166}
2167
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002168void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002169{
Till Rathmannb8543632018-10-02 19:46:14 +02002170 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002171 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002172 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002173}
2174
Brandon Jones59770802018-04-02 13:18:42 -07002175void Context::texParameterfvRobust(TextureType target,
2176 GLenum pname,
2177 GLsizei bufSize,
2178 const GLfloat *params)
2179{
2180 texParameterfv(target, pname, params);
2181}
2182
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002183void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002184{
Till Rathmannb8543632018-10-02 19:46:14 +02002185 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002186 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002187 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002188}
2189
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002190void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002191{
Till Rathmannb8543632018-10-02 19:46:14 +02002192 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002193 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002194 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002195}
2196
Till Rathmannb8543632018-10-02 19:46:14 +02002197void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2198{
2199 Texture *const texture = getTargetTexture(target);
2200 SetTexParameterIiv(this, texture, pname, params);
2201 onTextureChange(texture);
2202}
2203
2204void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2205{
2206 Texture *const texture = getTargetTexture(target);
2207 SetTexParameterIuiv(this, texture, pname, params);
2208 onTextureChange(texture);
2209}
2210
Brandon Jones59770802018-04-02 13:18:42 -07002211void Context::texParameterivRobust(TextureType target,
2212 GLenum pname,
2213 GLsizei bufSize,
2214 const GLint *params)
2215{
2216 texParameteriv(target, pname, params);
2217}
2218
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002219void Context::texParameterIivRobust(TextureType target,
2220 GLenum pname,
2221 GLsizei bufSize,
2222 const GLint *params)
2223{
2224 UNIMPLEMENTED();
2225}
2226
2227void Context::texParameterIuivRobust(TextureType target,
2228 GLenum pname,
2229 GLsizei bufSize,
2230 const GLuint *params)
2231{
2232 UNIMPLEMENTED();
2233}
2234
Jamie Madill493f9572018-05-24 19:52:15 -04002235void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002236{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002237 // No-op if count draws no primitives for given mode
2238 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002239 {
2240 return;
2241 }
2242
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002243 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002244 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002245 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002246}
2247
Jamie Madill493f9572018-05-24 19:52:15 -04002248void Context::drawArraysInstanced(PrimitiveMode mode,
2249 GLint first,
2250 GLsizei count,
2251 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002252{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002253 // No-op if count draws no primitives for given mode
2254 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002255 {
2256 return;
2257 }
2258
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002259 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002260 ANGLE_CONTEXT_TRY(
2261 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002262 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2263 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002264}
2265
Jamie Madill493f9572018-05-24 19:52:15 -04002266void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002267{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002268 // No-op if count draws no primitives for given mode
2269 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002270 {
2271 return;
2272 }
2273
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002274 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002275 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002276}
2277
Jamie Madill493f9572018-05-24 19:52:15 -04002278void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002279 GLsizei count,
2280 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002281 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002282 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002283{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002284 // No-op if count draws no primitives for given mode
2285 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002286 {
2287 return;
2288 }
2289
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002290 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002291 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002292 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002293}
2294
Jamie Madill493f9572018-05-24 19:52:15 -04002295void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002296 GLuint start,
2297 GLuint end,
2298 GLsizei count,
2299 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002300 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002301{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002302 // No-op if count draws no primitives for given mode
2303 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002304 {
2305 return;
2306 }
2307
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002308 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002309 ANGLE_CONTEXT_TRY(
2310 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002311}
2312
Jamie Madill493f9572018-05-24 19:52:15 -04002313void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002314{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002315 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002316 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002317}
2318
Jamie Madill493f9572018-05-24 19:52:15 -04002319void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002320{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002321 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002322 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002323}
2324
Jamie Madill675fe712016-12-19 13:07:54 -05002325void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002326{
Jamie Madillafa02a22017-11-23 12:57:38 -05002327 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002328}
2329
Jamie Madill675fe712016-12-19 13:07:54 -05002330void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002331{
Jamie Madillafa02a22017-11-23 12:57:38 -05002332 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002333}
2334
Austin Kinross6ee1e782015-05-29 17:05:37 -07002335void Context::insertEventMarker(GLsizei length, const char *marker)
2336{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002337 ASSERT(mImplementation);
2338 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002339}
2340
2341void Context::pushGroupMarker(GLsizei length, const char *marker)
2342{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002343 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002344
2345 if (marker == nullptr)
2346 {
2347 // From the EXT_debug_marker spec,
2348 // "If <marker> is null then an empty string is pushed on the stack."
2349 mImplementation->pushGroupMarker(length, "");
2350 }
2351 else
2352 {
2353 mImplementation->pushGroupMarker(length, marker);
2354 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002355}
2356
2357void Context::popGroupMarker()
2358{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002359 ASSERT(mImplementation);
2360 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002361}
2362
Geoff Langd8605522016-04-13 10:19:12 -04002363void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2364{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002365 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002366 ASSERT(programObject);
2367
2368 programObject->bindUniformLocation(location, name);
2369}
2370
Brandon Jones59770802018-04-02 13:18:42 -07002371void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002372{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002373 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002374}
2375
Brandon Jones59770802018-04-02 13:18:42 -07002376void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002377{
2378 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2379}
2380
Brandon Jones59770802018-04-02 13:18:42 -07002381void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002382{
2383 GLfloat I[16];
2384 angle::Matrix<GLfloat>::setToIdentity(I);
2385
2386 mGLState.loadPathRenderingMatrix(matrixMode, I);
2387}
2388
2389void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2390{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002391 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002392 if (!pathObj)
2393 return;
2394
Geoff Lang9bf86f02018-07-26 11:46:34 -04002395 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002396
2397 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2398}
2399
2400void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2401{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002402 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002403 if (!pathObj)
2404 return;
2405
Geoff Lang9bf86f02018-07-26 11:46:34 -04002406 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002407
2408 mImplementation->stencilStrokePath(pathObj, reference, mask);
2409}
2410
2411void Context::coverFillPath(GLuint path, GLenum coverMode)
2412{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002413 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002414 if (!pathObj)
2415 return;
2416
Geoff Lang9bf86f02018-07-26 11:46:34 -04002417 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002418
2419 mImplementation->coverFillPath(pathObj, coverMode);
2420}
2421
2422void Context::coverStrokePath(GLuint path, GLenum coverMode)
2423{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002424 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002425 if (!pathObj)
2426 return;
2427
Geoff Lang9bf86f02018-07-26 11:46:34 -04002428 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002429
2430 mImplementation->coverStrokePath(pathObj, coverMode);
2431}
2432
2433void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2434{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002435 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002436 if (!pathObj)
2437 return;
2438
Geoff Lang9bf86f02018-07-26 11:46:34 -04002439 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002440
2441 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2442}
2443
2444void Context::stencilThenCoverStrokePath(GLuint path,
2445 GLint reference,
2446 GLuint mask,
2447 GLenum coverMode)
2448{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002449 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002450 if (!pathObj)
2451 return;
2452
Geoff Lang9bf86f02018-07-26 11:46:34 -04002453 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002454
2455 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2456}
2457
Sami Väisänend59ca052016-06-21 16:10:00 +03002458void Context::coverFillPathInstanced(GLsizei numPaths,
2459 GLenum pathNameType,
2460 const void *paths,
2461 GLuint pathBase,
2462 GLenum coverMode,
2463 GLenum transformType,
2464 const GLfloat *transformValues)
2465{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002466 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002467
Geoff Lang9bf86f02018-07-26 11:46:34 -04002468 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002469
2470 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2471}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002472
Sami Väisänend59ca052016-06-21 16:10:00 +03002473void Context::coverStrokePathInstanced(GLsizei numPaths,
2474 GLenum pathNameType,
2475 const void *paths,
2476 GLuint pathBase,
2477 GLenum coverMode,
2478 GLenum transformType,
2479 const GLfloat *transformValues)
2480{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002481 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002482
2483 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002484 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002485
2486 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2487 transformValues);
2488}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002489
Sami Väisänend59ca052016-06-21 16:10:00 +03002490void Context::stencilFillPathInstanced(GLsizei numPaths,
2491 GLenum pathNameType,
2492 const void *paths,
2493 GLuint pathBase,
2494 GLenum fillMode,
2495 GLuint mask,
2496 GLenum transformType,
2497 const GLfloat *transformValues)
2498{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002499 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002500
2501 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002502 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002503
2504 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2505 transformValues);
2506}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002507
Sami Väisänend59ca052016-06-21 16:10:00 +03002508void Context::stencilStrokePathInstanced(GLsizei numPaths,
2509 GLenum pathNameType,
2510 const void *paths,
2511 GLuint pathBase,
2512 GLint reference,
2513 GLuint mask,
2514 GLenum transformType,
2515 const GLfloat *transformValues)
2516{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002517 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002518
Geoff Lang9bf86f02018-07-26 11:46:34 -04002519 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002520
2521 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2522 transformValues);
2523}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002524
Sami Väisänend59ca052016-06-21 16:10:00 +03002525void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2526 GLenum pathNameType,
2527 const void *paths,
2528 GLuint pathBase,
2529 GLenum fillMode,
2530 GLuint mask,
2531 GLenum coverMode,
2532 GLenum transformType,
2533 const GLfloat *transformValues)
2534{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002535 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002536
Geoff Lang9bf86f02018-07-26 11:46:34 -04002537 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002538
2539 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2540 transformType, transformValues);
2541}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002542
Sami Väisänend59ca052016-06-21 16:10:00 +03002543void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2544 GLenum pathNameType,
2545 const void *paths,
2546 GLuint pathBase,
2547 GLint reference,
2548 GLuint mask,
2549 GLenum coverMode,
2550 GLenum transformType,
2551 const GLfloat *transformValues)
2552{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002553 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002554
Geoff Lang9bf86f02018-07-26 11:46:34 -04002555 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002556
2557 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2558 transformType, transformValues);
2559}
2560
Sami Väisänen46eaa942016-06-29 10:26:37 +03002561void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2562{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002563 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002564
2565 programObject->bindFragmentInputLocation(location, name);
2566}
2567
2568void Context::programPathFragmentInputGen(GLuint program,
2569 GLint location,
2570 GLenum genMode,
2571 GLint components,
2572 const GLfloat *coeffs)
2573{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002574 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002575
jchen103fd614d2018-08-13 12:21:58 +08002576 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002577}
2578
jchen1015015f72017-03-16 13:54:21 +08002579GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2580{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002581 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002582 return QueryProgramResourceIndex(programObject, programInterface, name);
2583}
2584
jchen10fd7c3b52017-03-21 15:36:03 +08002585void Context::getProgramResourceName(GLuint program,
2586 GLenum programInterface,
2587 GLuint index,
2588 GLsizei bufSize,
2589 GLsizei *length,
2590 GLchar *name)
2591{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002592 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002593 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2594}
2595
jchen10191381f2017-04-11 13:59:04 +08002596GLint Context::getProgramResourceLocation(GLuint program,
2597 GLenum programInterface,
2598 const GLchar *name)
2599{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002600 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002601 return QueryProgramResourceLocation(programObject, programInterface, name);
2602}
2603
jchen10880683b2017-04-12 16:21:55 +08002604void Context::getProgramResourceiv(GLuint program,
2605 GLenum programInterface,
2606 GLuint index,
2607 GLsizei propCount,
2608 const GLenum *props,
2609 GLsizei bufSize,
2610 GLsizei *length,
2611 GLint *params)
2612{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002613 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002614 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2615 length, params);
2616}
2617
jchen10d9cd7b72017-08-30 15:04:25 +08002618void Context::getProgramInterfaceiv(GLuint program,
2619 GLenum programInterface,
2620 GLenum pname,
2621 GLint *params)
2622{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002623 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002624 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2625}
2626
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002627void Context::getProgramInterfaceivRobust(GLuint program,
2628 GLenum programInterface,
2629 GLenum pname,
2630 GLsizei bufSize,
2631 GLsizei *length,
2632 GLint *params)
2633{
2634 UNIMPLEMENTED();
2635}
2636
Jamie Madill306b6c12018-07-27 08:12:49 -04002637void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002638{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002639 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002640}
2641
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002642void Context::handleError(GLenum errorCode,
2643 const char *message,
2644 const char *file,
2645 const char *function,
2646 unsigned int line)
2647{
2648 mErrors.handleError(errorCode, message, file, function, line);
2649}
2650
Jamie Madilla139f012018-10-10 16:13:03 -04002651void Context::validationError(GLenum errorCode, const char *message)
2652{
2653 mErrors.validationError(errorCode, message);
2654}
2655
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002656// Get one of the recorded errors and clear its flag, if any.
2657// [OpenGL ES 2.0.24] section 2.5 page 13.
2658GLenum Context::getError()
2659{
Geoff Langda5777c2014-07-11 09:52:58 -04002660 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002661 {
Geoff Langda5777c2014-07-11 09:52:58 -04002662 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002663 }
Geoff Langda5777c2014-07-11 09:52:58 -04002664 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002665 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002666 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002667 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002668}
2669
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002670// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002671void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002672{
2673 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002674 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002675 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002676 mContextLostForced = true;
2677 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002678 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002679}
2680
Jamie Madillfa920eb2018-01-04 11:45:50 -05002681GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002682{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002683 // Even if the application doesn't want to know about resets, we want to know
2684 // as it will allow us to skip all the calls.
2685 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002686 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002687 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002688 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002689 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002690 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002691
2692 // EXT_robustness, section 2.6: If the reset notification behavior is
2693 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2694 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2695 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002696 }
2697
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002698 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2699 // status should be returned at least once, and GL_NO_ERROR should be returned
2700 // once the device has finished resetting.
2701 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002702 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002703 ASSERT(mResetStatus == GL_NO_ERROR);
2704 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002705
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002706 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002707 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002708 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002709 }
2710 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002711 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002712 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002713 // If markContextLost was used to mark the context lost then
2714 // assume that is not recoverable, and continue to report the
2715 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002716 mResetStatus = mImplementation->getResetStatus();
2717 }
Jamie Madill893ab082014-05-16 16:56:10 -04002718
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002719 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002720}
2721
2722bool Context::isResetNotificationEnabled()
2723{
2724 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2725}
2726
Corentin Walleze3b10e82015-05-20 11:06:25 -04002727const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002728{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002729 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002730}
2731
2732EGLenum Context::getClientType() const
2733{
2734 return mClientType;
2735}
2736
2737EGLenum Context::getRenderBuffer() const
2738{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002739 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2740 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002741 {
2742 return EGL_NONE;
2743 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002744
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002745 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002746 ASSERT(backAttachment != nullptr);
2747 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002748}
2749
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002750VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002751{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002752 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002753 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2754 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002755 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002756 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2757 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002758
Jamie Madill96a483b2017-06-27 16:49:21 -04002759 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002760 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002761
2762 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002763}
2764
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002765TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002766{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002767 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002768 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2769 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002770 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002771 transformFeedback =
2772 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002773 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002774 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002775 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002776
2777 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002778}
2779
2780bool Context::isVertexArrayGenerated(GLuint vertexArray)
2781{
Jamie Madill96a483b2017-06-27 16:49:21 -04002782 ASSERT(mVertexArrayMap.contains(0));
2783 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002784}
2785
2786bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2787{
Jamie Madill96a483b2017-06-27 16:49:21 -04002788 ASSERT(mTransformFeedbackMap.contains(0));
2789 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002790}
2791
Shannon Woods53a94a82014-06-24 15:20:36 -04002792void Context::detachTexture(GLuint texture)
2793{
2794 // Simple pass-through to State's detachTexture method, as textures do not require
2795 // allocation map management either here or in the resource manager at detach time.
2796 // Zero textures are held by the Context, and we don't attempt to request them from
2797 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002798 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002799}
2800
James Darpinian4d9d4832018-03-13 12:43:28 -07002801void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002802{
Yuly Novikov5807a532015-12-03 13:01:22 -05002803 // Simple pass-through to State's detachBuffer method, since
2804 // only buffer attachments to container objects that are bound to the current context
2805 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002806
Yuly Novikov5807a532015-12-03 13:01:22 -05002807 // [OpenGL ES 3.2] section 5.1.2 page 45:
2808 // Attachments to unbound container objects, such as
2809 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2810 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002811 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002812}
2813
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002814void Context::detachFramebuffer(GLuint framebuffer)
2815{
Shannon Woods53a94a82014-06-24 15:20:36 -04002816 // Framebuffer detachment is handled by Context, because 0 is a valid
2817 // Framebuffer object, and a pointer to it must be passed from Context
2818 // to State at binding time.
2819
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002820 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002821 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2822 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2823 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002824
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002825 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002826 {
2827 bindReadFramebuffer(0);
2828 }
2829
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002830 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002831 {
2832 bindDrawFramebuffer(0);
2833 }
2834}
2835
2836void Context::detachRenderbuffer(GLuint renderbuffer)
2837{
Jamie Madilla02315b2017-02-23 14:14:47 -05002838 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002839}
2840
Jamie Madill57a89722013-07-02 11:57:03 -04002841void Context::detachVertexArray(GLuint vertexArray)
2842{
Jamie Madill77a72f62015-04-14 11:18:32 -04002843 // Vertex array detachment is handled by Context, because 0 is a valid
2844 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002845 // binding time.
2846
Jamie Madill57a89722013-07-02 11:57:03 -04002847 // [OpenGL ES 3.0.2] section 2.10 page 43:
2848 // If a vertex array object that is currently bound is deleted, the binding
2849 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002850 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002851 {
2852 bindVertexArray(0);
2853 }
2854}
2855
Geoff Langc8058452014-02-03 12:04:11 -05002856void Context::detachTransformFeedback(GLuint transformFeedback)
2857{
Corentin Walleza2257da2016-04-19 16:43:12 -04002858 // Transform feedback detachment is handled by Context, because 0 is a valid
2859 // transform feedback, and a pointer to it must be passed from Context to State at
2860 // binding time.
2861
2862 // The OpenGL specification doesn't mention what should happen when the currently bound
2863 // transform feedback object is deleted. Since it is a container object, we treat it like
2864 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002865 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002866 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002867 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002868 }
Geoff Langc8058452014-02-03 12:04:11 -05002869}
2870
Jamie Madilldc356042013-07-19 16:36:57 -04002871void Context::detachSampler(GLuint sampler)
2872{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002873 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002874}
2875
Yunchao Hea336b902017-08-02 16:05:21 +08002876void Context::detachProgramPipeline(GLuint pipeline)
2877{
2878 mGLState.detachProgramPipeline(this, pipeline);
2879}
2880
Jamie Madill3ef140a2017-08-26 23:11:21 -04002881void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002882{
Shaodde78e82017-05-22 14:13:27 +08002883 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002884 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002885}
2886
Jamie Madille29d1672013-07-19 16:36:57 -04002887void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2888{
Till Rathmannb8543632018-10-02 19:46:14 +02002889 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002890 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002891 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002892}
Jamie Madille29d1672013-07-19 16:36:57 -04002893
Geoff Langc1984ed2016-10-07 12:41:00 -04002894void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2895{
Till Rathmannb8543632018-10-02 19:46:14 +02002896 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002897 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002898 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002899}
2900
Till Rathmannb8543632018-10-02 19:46:14 +02002901void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2902{
2903 Sampler *const samplerObject =
2904 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2905 SetSamplerParameterIiv(this, samplerObject, pname, param);
2906}
2907
2908void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2909{
2910 Sampler *const samplerObject =
2911 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2912 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2913}
2914
Brandon Jones59770802018-04-02 13:18:42 -07002915void Context::samplerParameterivRobust(GLuint sampler,
2916 GLenum pname,
2917 GLsizei bufSize,
2918 const GLint *param)
2919{
2920 samplerParameteriv(sampler, pname, param);
2921}
2922
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002923void Context::samplerParameterIivRobust(GLuint sampler,
2924 GLenum pname,
2925 GLsizei bufSize,
2926 const GLint *param)
2927{
2928 UNIMPLEMENTED();
2929}
2930
2931void Context::samplerParameterIuivRobust(GLuint sampler,
2932 GLenum pname,
2933 GLsizei bufSize,
2934 const GLuint *param)
2935{
2936 UNIMPLEMENTED();
2937}
2938
Jamie Madille29d1672013-07-19 16:36:57 -04002939void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2940{
Till Rathmannb8543632018-10-02 19:46:14 +02002941 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002942 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002943 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002944}
2945
Geoff Langc1984ed2016-10-07 12:41:00 -04002946void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002947{
Till Rathmannb8543632018-10-02 19:46:14 +02002948 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002949 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002950 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002951}
2952
Brandon Jones59770802018-04-02 13:18:42 -07002953void Context::samplerParameterfvRobust(GLuint sampler,
2954 GLenum pname,
2955 GLsizei bufSize,
2956 const GLfloat *param)
2957{
2958 samplerParameterfv(sampler, pname, param);
2959}
2960
Geoff Langc1984ed2016-10-07 12:41:00 -04002961void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002962{
Till Rathmannb8543632018-10-02 19:46:14 +02002963 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002964 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002965 QuerySamplerParameteriv(samplerObject, pname, params);
2966}
Jamie Madill9675b802013-07-19 16:36:59 -04002967
Till Rathmannb8543632018-10-02 19:46:14 +02002968void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2969{
2970 const Sampler *const samplerObject =
2971 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2972 QuerySamplerParameterIiv(samplerObject, pname, params);
2973}
2974
2975void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2976{
2977 const Sampler *const samplerObject =
2978 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2979 QuerySamplerParameterIuiv(samplerObject, pname, params);
2980}
2981
Brandon Jones59770802018-04-02 13:18:42 -07002982void Context::getSamplerParameterivRobust(GLuint sampler,
2983 GLenum pname,
2984 GLsizei bufSize,
2985 GLsizei *length,
2986 GLint *params)
2987{
2988 getSamplerParameteriv(sampler, pname, params);
2989}
2990
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002991void Context::getSamplerParameterIivRobust(GLuint sampler,
2992 GLenum pname,
2993 GLsizei bufSize,
2994 GLsizei *length,
2995 GLint *params)
2996{
2997 UNIMPLEMENTED();
2998}
2999
3000void Context::getSamplerParameterIuivRobust(GLuint sampler,
3001 GLenum pname,
3002 GLsizei bufSize,
3003 GLsizei *length,
3004 GLuint *params)
3005{
3006 UNIMPLEMENTED();
3007}
3008
Geoff Langc1984ed2016-10-07 12:41:00 -04003009void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
3010{
Till Rathmannb8543632018-10-02 19:46:14 +02003011 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05003012 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04003013 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04003014}
3015
Brandon Jones59770802018-04-02 13:18:42 -07003016void Context::getSamplerParameterfvRobust(GLuint sampler,
3017 GLenum pname,
3018 GLsizei bufSize,
3019 GLsizei *length,
3020 GLfloat *params)
3021{
3022 getSamplerParameterfv(sampler, pname, params);
3023}
3024
Olli Etuahof0fee072016-03-30 15:11:58 +03003025void Context::programParameteri(GLuint program, GLenum pname, GLint value)
3026{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04003027 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08003028 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03003029}
3030
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003031void Context::initRendererString()
3032{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003033 std::ostringstream rendererString;
3034 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003035 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003036 rendererString << ")";
3037
Geoff Langcec35902014-04-16 10:52:36 -04003038 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003039}
3040
Geoff Langc339c4e2016-11-29 10:37:36 -05003041void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003042{
Geoff Langc339c4e2016-11-29 10:37:36 -05003043 const Version &clientVersion = getClientVersion();
3044
3045 std::ostringstream versionString;
3046 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3047 << ANGLE_VERSION_STRING << ")";
3048 mVersionString = MakeStaticString(versionString.str());
3049
3050 std::ostringstream shadingLanguageVersionString;
3051 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3052 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3053 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3054 << ")";
3055 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003056}
3057
Geoff Langcec35902014-04-16 10:52:36 -04003058void Context::initExtensionStrings()
3059{
Geoff Langc339c4e2016-11-29 10:37:36 -05003060 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3061 std::ostringstream combinedStringStream;
3062 std::copy(strings.begin(), strings.end(),
3063 std::ostream_iterator<const char *>(combinedStringStream, " "));
3064 return MakeStaticString(combinedStringStream.str());
3065 };
3066
3067 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003068 for (const auto &extensionString : mExtensions.getStrings())
3069 {
3070 mExtensionStrings.push_back(MakeStaticString(extensionString));
3071 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003072 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003073
Geoff Langc339c4e2016-11-29 10:37:36 -05003074 mRequestableExtensionStrings.clear();
3075 for (const auto &extensionInfo : GetExtensionInfoMap())
3076 {
3077 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003078 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003079 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003080 {
3081 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3082 }
3083 }
3084 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003085}
3086
Geoff Langc339c4e2016-11-29 10:37:36 -05003087const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003088{
Geoff Langc339c4e2016-11-29 10:37:36 -05003089 switch (name)
3090 {
3091 case GL_VENDOR:
3092 return reinterpret_cast<const GLubyte *>("Google Inc.");
3093
3094 case GL_RENDERER:
3095 return reinterpret_cast<const GLubyte *>(mRendererString);
3096
3097 case GL_VERSION:
3098 return reinterpret_cast<const GLubyte *>(mVersionString);
3099
3100 case GL_SHADING_LANGUAGE_VERSION:
3101 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3102
3103 case GL_EXTENSIONS:
3104 return reinterpret_cast<const GLubyte *>(mExtensionString);
3105
3106 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3107 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3108
3109 default:
3110 UNREACHABLE();
3111 return nullptr;
3112 }
Geoff Langcec35902014-04-16 10:52:36 -04003113}
3114
Geoff Langc339c4e2016-11-29 10:37:36 -05003115const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003116{
Geoff Langc339c4e2016-11-29 10:37:36 -05003117 switch (name)
3118 {
3119 case GL_EXTENSIONS:
3120 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3121
3122 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3123 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3124
3125 default:
3126 UNREACHABLE();
3127 return nullptr;
3128 }
Geoff Langcec35902014-04-16 10:52:36 -04003129}
3130
3131size_t Context::getExtensionStringCount() const
3132{
3133 return mExtensionStrings.size();
3134}
3135
Geoff Lang111a99e2017-10-17 10:58:41 -04003136bool Context::isExtensionRequestable(const char *name)
3137{
3138 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3139 auto extension = extensionInfos.find(name);
3140
Geoff Lang111a99e2017-10-17 10:58:41 -04003141 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003142 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003143}
3144
Geoff Langc339c4e2016-11-29 10:37:36 -05003145void Context::requestExtension(const char *name)
3146{
3147 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3148 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3149 const auto &extension = extensionInfos.at(name);
3150 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003151 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003152
3153 if (mExtensions.*(extension.ExtensionsMember))
3154 {
3155 // Extension already enabled
3156 return;
3157 }
3158
3159 mExtensions.*(extension.ExtensionsMember) = true;
3160 updateCaps();
3161 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003162
Jamie Madill2f348d22017-06-05 10:50:59 -04003163 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3164 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003165
Jamie Madill81c2e252017-09-09 23:32:46 -04003166 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3167 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003168 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003169 for (auto &zeroTexture : mZeroTextures)
3170 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003171 if (zeroTexture.get() != nullptr)
3172 {
3173 zeroTexture->signalDirty(this, InitState::Initialized);
3174 }
Geoff Lang9aded172017-04-05 11:07:56 -04003175 }
3176
Jamie Madillb983a4b2018-08-01 11:34:51 -04003177 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003178}
3179
3180size_t Context::getRequestableExtensionStringCount() const
3181{
3182 return mRequestableExtensionStrings.size();
3183}
3184
Jamie Madill493f9572018-05-24 19:52:15 -04003185void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003186{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003187 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003188 ASSERT(transformFeedback != nullptr);
3189 ASSERT(!transformFeedback->isPaused());
3190
Jamie Madill6c1f6712017-02-14 19:08:04 -05003191 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003192 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003193}
3194
3195bool Context::hasActiveTransformFeedback(GLuint program) const
3196{
3197 for (auto pair : mTransformFeedbackMap)
3198 {
3199 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3200 {
3201 return true;
3202 }
3203 }
3204 return false;
3205}
3206
Geoff Lang33f11fb2018-05-07 13:42:47 -04003207Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003208{
3209 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3210
jchen1082af6202018-06-22 10:59:52 +08003211 // Explicitly enable GL_KHR_parallel_shader_compile
3212 supportedExtensions.parallelShaderCompile = true;
3213
Geoff Langb0f917f2017-12-05 13:41:54 -05003214 if (getClientVersion() < ES_2_0)
3215 {
3216 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003217 supportedExtensions.pointSizeArray = true;
3218 supportedExtensions.textureCubeMap = true;
3219 supportedExtensions.pointSprite = true;
3220 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003221 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003222 }
3223
3224 if (getClientVersion() < ES_3_0)
3225 {
3226 // Disable ES3+ extensions
3227 supportedExtensions.colorBufferFloat = false;
3228 supportedExtensions.eglImageExternalEssl3 = false;
3229 supportedExtensions.textureNorm16 = false;
3230 supportedExtensions.multiview = false;
3231 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003232 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003233 supportedExtensions.textureMultisample = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003234 }
3235
3236 if (getClientVersion() < ES_3_1)
3237 {
3238 // Disable ES3.1+ extensions
3239 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003240
3241 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3242 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003243 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003244 }
3245
3246 if (getClientVersion() > ES_2_0)
3247 {
3248 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3249 // supportedExtensions.sRGB = false;
3250 }
3251
3252 // Some extensions are always available because they are implemented in the GL layer.
3253 supportedExtensions.bindUniformLocation = true;
3254 supportedExtensions.vertexArrayObject = true;
3255 supportedExtensions.bindGeneratesResource = true;
3256 supportedExtensions.clientArrays = true;
3257 supportedExtensions.requestExtension = true;
Austin Eng7cf9cd22018-10-09 15:27:32 -07003258 supportedExtensions.multiDraw = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003259
3260 // Enable the no error extension if the context was created with the flag.
3261 supportedExtensions.noError = mSkipValidation;
3262
3263 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003264 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003265
3266 // Explicitly enable GL_KHR_debug
3267 supportedExtensions.debug = true;
3268 supportedExtensions.maxDebugMessageLength = 1024;
3269 supportedExtensions.maxDebugLoggedMessages = 1024;
3270 supportedExtensions.maxDebugGroupStackDepth = 1024;
3271 supportedExtensions.maxLabelLength = 1024;
3272
3273 // Explicitly enable GL_ANGLE_robust_client_memory
3274 supportedExtensions.robustClientMemory = true;
3275
3276 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003277 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003278
3279 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3280 // supports it.
3281 supportedExtensions.robustBufferAccessBehavior =
3282 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3283
3284 // Enable the cache control query unconditionally.
3285 supportedExtensions.programCacheControl = true;
3286
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003287 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003288 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003289 {
3290 // GL_ANGLE_explicit_context_gles1
3291 supportedExtensions.explicitContextGles1 = true;
3292 // GL_ANGLE_explicit_context
3293 supportedExtensions.explicitContext = true;
3294 }
3295
Geoff Lang79b91402018-10-04 15:11:30 -04003296 supportedExtensions.memorySize = true;
3297
Geoff Langb0f917f2017-12-05 13:41:54 -05003298 return supportedExtensions;
3299}
3300
Geoff Lang33f11fb2018-05-07 13:42:47 -04003301void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003302{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003303 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003304
Geoff Lang33f11fb2018-05-07 13:42:47 -04003305 mSupportedExtensions = generateSupportedExtensions();
3306 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003307
3308 mLimitations = mImplementation->getNativeLimitations();
3309
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003310 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3311 if (getClientVersion() < Version(2, 0))
3312 {
3313 mCaps.maxMultitextureUnits = 4;
3314 mCaps.maxClipPlanes = 6;
3315 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003316 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3317 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3318 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003319 mCaps.minSmoothPointSize = 1.0f;
3320 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003321 mCaps.minSmoothLineWidth = 1.0f;
3322 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003323 }
3324
Luc Ferronad2ae932018-06-11 15:31:17 -04003325 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003326 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003327
Luc Ferronad2ae932018-06-11 15:31:17 -04003328 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3329
Jamie Madill0f80ed82017-09-19 00:24:56 -04003330 if (getClientVersion() < ES_3_1)
3331 {
3332 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3333 }
3334 else
3335 {
3336 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3337 }
Geoff Lang301d1612014-07-09 10:34:37 -04003338
Jiawei Shao54aafe52018-04-27 14:54:57 +08003339 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3340 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003341 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3342
Jamie Madill0f80ed82017-09-19 00:24:56 -04003343 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3344 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3345
3346 // Limit textures as well, so we can use fast bitsets with texture bindings.
3347 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003348 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3349 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3350 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3351 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003352
Jiawei Shaodb342272017-09-27 10:21:45 +08003353 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3354
Geoff Langc287ea62016-09-16 14:46:51 -04003355 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003356 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003357 for (const auto &extensionInfo : GetExtensionInfoMap())
3358 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003359 // If the user has requested that extensions start disabled and they are requestable,
3360 // disable them.
3361 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003362 {
3363 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3364 }
3365 }
3366
3367 // Generate texture caps
3368 updateCaps();
3369}
3370
3371void Context::updateCaps()
3372{
Geoff Lang900013c2014-07-07 11:32:19 -04003373 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003374 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003375
Jamie Madill7b62cf92017-11-02 15:20:49 -04003376 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003377 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003378 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003379 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003380
Geoff Lang0d8b7242015-09-09 14:56:53 -04003381 // Update the format caps based on the client version and extensions.
3382 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3383 // ES3.
3384 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003385 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003386 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003387 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003388 formatCaps.textureAttachment =
3389 formatCaps.textureAttachment &&
3390 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3391 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3392 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003393
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003394 // OpenGL ES does not support multisampling with non-rendererable formats
3395 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003396 if (!formatCaps.renderbuffer ||
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003397 (getClientVersion() < ES_3_1 && !mSupportedExtensions.textureMultisample &&
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003398 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003399 {
Geoff Langd87878e2014-09-19 15:42:59 -04003400 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003401 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003402 else
3403 {
3404 // We may have limited the max samples for some required renderbuffer formats due to
3405 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3406 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3407
3408 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3409 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3410 // exception of signed and unsigned integer formats."
3411 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3412 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3413 {
3414 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3415 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3416 }
3417
3418 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003419 if (getClientVersion() >= ES_3_1 || mSupportedExtensions.textureMultisample)
Olli Etuaho50c562d2017-06-06 14:43:30 +03003420 {
3421 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3422 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3423 // the exception that the signed and unsigned integer formats are required only to
3424 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3425 // multisamples, which must be at least one."
3426 if (formatInfo.componentType == GL_INT ||
3427 formatInfo.componentType == GL_UNSIGNED_INT)
3428 {
3429 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3430 }
3431
3432 // GLES 3.1 section 19.3.1.
3433 if (formatCaps.texturable)
3434 {
3435 if (formatInfo.depthBits > 0)
3436 {
3437 mCaps.maxDepthTextureSamples =
3438 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3439 }
3440 else if (formatInfo.redBits > 0)
3441 {
3442 mCaps.maxColorTextureSamples =
3443 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3444 }
3445 }
3446 }
3447 }
Geoff Langd87878e2014-09-19 15:42:59 -04003448
3449 if (formatCaps.texturable && formatInfo.compressed)
3450 {
Geoff Langca271392017-04-05 12:30:00 -04003451 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003452 }
3453
Geoff Langca271392017-04-05 12:30:00 -04003454 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003455 }
Jamie Madill32447362017-06-28 14:53:52 -04003456
3457 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003458 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003459 {
3460 mMemoryProgramCache = nullptr;
3461 }
Corentin Walleze4477002017-12-01 14:39:58 -05003462
3463 // Compute which buffer types are allowed
3464 mValidBufferBindings.reset();
3465 mValidBufferBindings.set(BufferBinding::ElementArray);
3466 mValidBufferBindings.set(BufferBinding::Array);
3467
3468 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3469 {
3470 mValidBufferBindings.set(BufferBinding::PixelPack);
3471 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3472 }
3473
3474 if (getClientVersion() >= ES_3_0)
3475 {
3476 mValidBufferBindings.set(BufferBinding::CopyRead);
3477 mValidBufferBindings.set(BufferBinding::CopyWrite);
3478 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3479 mValidBufferBindings.set(BufferBinding::Uniform);
3480 }
3481
3482 if (getClientVersion() >= ES_3_1)
3483 {
3484 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3485 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3486 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3487 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3488 }
jchen107ae70d82018-07-06 13:47:01 +08003489
3490 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003491
3492 // Reinitialize state cache after extension changes.
3493 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003494}
3495
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003496void Context::initWorkarounds()
3497{
Jamie Madill761b02c2017-06-23 16:27:06 -04003498 // Apply back-end workarounds.
3499 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3500
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003501 // Lose the context upon out of memory error if the application is
3502 // expecting to watch for those events.
3503 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003504
3505 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3506 {
3507 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3508 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3509 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3510 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003511}
3512
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003513// Return true if the draw is a no-op, else return false.
3514// A no-op draw occurs if the count of vertices is less than the minimum required to
3515// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3516bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3517{
3518 return count < kMinimumPrimitiveCounts[mode];
3519}
3520
3521bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3522{
3523 return (instanceCount == 0) || noopDraw(mode, count);
3524}
3525
Jamie Madill6f755b22018-10-09 12:48:54 -04003526angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003527{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003528 if (mGLES1Renderer)
3529 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003530 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003531 }
3532
Geoff Lang9bf86f02018-07-26 11:46:34 -04003533 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003534
3535 if (isRobustResourceInitEnabled())
3536 {
3537 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3538 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3539 }
3540
Jamie Madill9e63a812018-11-16 12:30:04 +00003541 ANGLE_TRY(syncDirtyBits());
3542 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003543}
3544
Jamie Madill526392d2018-11-16 09:35:14 -05003545angle::Result Context::prepareForClear(GLbitfield mask)
Geoff Langd4fff502017-09-22 11:28:28 -04003546{
Geoff Langa8cb2872018-03-09 16:09:40 -05003547 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003548 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003549 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill526392d2018-11-16 09:35:14 -05003550 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003551}
3552
Jamie Madill526392d2018-11-16 09:35:14 -05003553angle::Result Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
Geoff Langd4fff502017-09-22 11:28:28 -04003554{
Geoff Langa8cb2872018-03-09 16:09:40 -05003555 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003556 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3557 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003558 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill526392d2018-11-16 09:35:14 -05003559 return angle::Result::Continue();
Jamie Madill05b35b22017-10-03 09:01:44 -04003560}
3561
Jamie Madill526392d2018-11-16 09:35:14 -05003562angle::Result Context::syncState(const State::DirtyBits &bitMask,
3563 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003564{
Geoff Langa8cb2872018-03-09 16:09:40 -05003565 ANGLE_TRY(syncDirtyObjects(objectMask));
3566 ANGLE_TRY(syncDirtyBits(bitMask));
Jamie Madill526392d2018-11-16 09:35:14 -05003567 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003568}
3569
Jamie Madill9e63a812018-11-16 12:30:04 +00003570angle::Result Context::syncDirtyBits()
3571{
3572 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
3573 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
3574 mGLState.clearDirtyBits();
3575 return angle::Result::Continue();
3576}
3577
3578angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
3579{
3580 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
3581 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
3582 mGLState.clearDirtyBits(dirtyBits);
3583 return angle::Result::Continue();
3584}
3585
3586angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
3587{
3588 return mGLState.syncDirtyObjects(this, objectMask);
3589}
3590
Jamie Madillc29968b2016-01-20 11:17:23 -05003591void Context::blitFramebuffer(GLint srcX0,
3592 GLint srcY0,
3593 GLint srcX1,
3594 GLint srcY1,
3595 GLint dstX0,
3596 GLint dstY0,
3597 GLint dstX1,
3598 GLint dstY1,
3599 GLbitfield mask,
3600 GLenum filter)
3601{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003602 if (mask == 0)
3603 {
3604 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3605 // buffers are copied.
3606 return;
3607 }
3608
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003609 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003610 ASSERT(drawFramebuffer);
3611
3612 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3613 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3614
Jamie Madillbc918e72018-03-08 09:47:21 -05003615 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003616
Jamie Madillc564c072017-06-01 12:45:42 -04003617 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003618}
Jamie Madillc29968b2016-01-20 11:17:23 -05003619
3620void Context::clear(GLbitfield mask)
3621{
Geoff Langd4fff502017-09-22 11:28:28 -04003622 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3623 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003624}
3625
3626void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3627{
Olli Etuaho78df3362018-10-05 16:43:27 +03003628 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3629 const FramebufferAttachment *attachment = nullptr;
3630 if (buffer == GL_DEPTH)
3631 {
3632 attachment = framebufferObject->getDepthbuffer();
3633 }
3634 if (buffer == GL_COLOR &&
3635 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3636 {
3637 attachment = framebufferObject->getColorbuffer(drawbuffer);
3638 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003639 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3640 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003641 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003642 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003643 return;
3644 }
Geoff Langd4fff502017-09-22 11:28:28 -04003645 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003646 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003647}
3648
3649void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3650{
Olli Etuaho78df3362018-10-05 16:43:27 +03003651 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3652 const FramebufferAttachment *attachment = nullptr;
3653 if (buffer == GL_COLOR &&
3654 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3655 {
3656 attachment = framebufferObject->getColorbuffer(drawbuffer);
3657 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003658 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3659 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003660 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003661 {
3662 return;
3663 }
Geoff Langd4fff502017-09-22 11:28:28 -04003664 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003665 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003666}
3667
3668void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3669{
Olli Etuaho78df3362018-10-05 16:43:27 +03003670 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3671 const FramebufferAttachment *attachment = nullptr;
3672 if (buffer == GL_STENCIL)
3673 {
3674 attachment = framebufferObject->getStencilbuffer();
3675 }
3676 if (buffer == GL_COLOR &&
3677 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3678 {
3679 attachment = framebufferObject->getColorbuffer(drawbuffer);
3680 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003681 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3682 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003683 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003684 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003685 return;
3686 }
Geoff Langd4fff502017-09-22 11:28:28 -04003687 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003688 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003689}
3690
3691void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3692{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003693 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003694 ASSERT(framebufferObject);
3695
3696 // If a buffer is not present, the clear has no effect
3697 if (framebufferObject->getDepthbuffer() == nullptr &&
3698 framebufferObject->getStencilbuffer() == nullptr)
3699 {
3700 return;
3701 }
3702
Geoff Langd4fff502017-09-22 11:28:28 -04003703 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3704 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003705}
3706
3707void Context::readPixels(GLint x,
3708 GLint y,
3709 GLsizei width,
3710 GLsizei height,
3711 GLenum format,
3712 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003713 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003714{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003715 if (width == 0 || height == 0)
3716 {
3717 return;
3718 }
3719
Jamie Madillbc918e72018-03-08 09:47:21 -05003720 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003721
Jamie Madillb6664922017-07-25 12:55:04 -04003722 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3723 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003724
3725 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003726 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003727}
3728
Brandon Jones59770802018-04-02 13:18:42 -07003729void Context::readPixelsRobust(GLint x,
3730 GLint y,
3731 GLsizei width,
3732 GLsizei height,
3733 GLenum format,
3734 GLenum type,
3735 GLsizei bufSize,
3736 GLsizei *length,
3737 GLsizei *columns,
3738 GLsizei *rows,
3739 void *pixels)
3740{
3741 readPixels(x, y, width, height, format, type, pixels);
3742}
3743
3744void Context::readnPixelsRobust(GLint x,
3745 GLint y,
3746 GLsizei width,
3747 GLsizei height,
3748 GLenum format,
3749 GLenum type,
3750 GLsizei bufSize,
3751 GLsizei *length,
3752 GLsizei *columns,
3753 GLsizei *rows,
3754 void *data)
3755{
3756 readPixels(x, y, width, height, format, type, data);
3757}
3758
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003759void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003760 GLint level,
3761 GLenum internalformat,
3762 GLint x,
3763 GLint y,
3764 GLsizei width,
3765 GLsizei height,
3766 GLint border)
3767{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003768 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003769 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003770
Jamie Madillc29968b2016-01-20 11:17:23 -05003771 Rectangle sourceArea(x, y, width, height);
3772
Jamie Madill05b35b22017-10-03 09:01:44 -04003773 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003774 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003775 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003776}
3777
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003778void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003779 GLint level,
3780 GLint xoffset,
3781 GLint yoffset,
3782 GLint x,
3783 GLint y,
3784 GLsizei width,
3785 GLsizei height)
3786{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003787 if (width == 0 || height == 0)
3788 {
3789 return;
3790 }
3791
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003792 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003793 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003794
Jamie Madillc29968b2016-01-20 11:17:23 -05003795 Offset destOffset(xoffset, yoffset, 0);
3796 Rectangle sourceArea(x, y, width, height);
3797
Jamie Madill05b35b22017-10-03 09:01:44 -04003798 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003799 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003800 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003801}
3802
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003803void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003804 GLint level,
3805 GLint xoffset,
3806 GLint yoffset,
3807 GLint zoffset,
3808 GLint x,
3809 GLint y,
3810 GLsizei width,
3811 GLsizei height)
3812{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003813 if (width == 0 || height == 0)
3814 {
3815 return;
3816 }
3817
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003818 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003819 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003820
Jamie Madillc29968b2016-01-20 11:17:23 -05003821 Offset destOffset(xoffset, yoffset, zoffset);
3822 Rectangle sourceArea(x, y, width, height);
3823
Jamie Madill05b35b22017-10-03 09:01:44 -04003824 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3825 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003826 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3827 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003828}
3829
3830void Context::framebufferTexture2D(GLenum target,
3831 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003832 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003833 GLuint texture,
3834 GLint level)
3835{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003836 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003837 ASSERT(framebuffer);
3838
3839 if (texture != 0)
3840 {
3841 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003842 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003843 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003844 }
3845 else
3846 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003847 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003848 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003849
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003850 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003851}
3852
3853void Context::framebufferRenderbuffer(GLenum target,
3854 GLenum attachment,
3855 GLenum renderbuffertarget,
3856 GLuint renderbuffer)
3857{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003858 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003859 ASSERT(framebuffer);
3860
3861 if (renderbuffer != 0)
3862 {
3863 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003864
Jamie Madillcc129372018-04-12 09:13:18 -04003865 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003866 renderbufferObject);
3867 }
3868 else
3869 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003870 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003871 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003872
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003873 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003874}
3875
3876void Context::framebufferTextureLayer(GLenum target,
3877 GLenum attachment,
3878 GLuint texture,
3879 GLint level,
3880 GLint layer)
3881{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003882 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003883 ASSERT(framebuffer);
3884
3885 if (texture != 0)
3886 {
3887 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003888 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003889 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003890 }
3891 else
3892 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003893 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003894 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003895
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003896 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003897}
3898
Brandon Jones59770802018-04-02 13:18:42 -07003899void Context::framebufferTextureMultiviewLayered(GLenum target,
3900 GLenum attachment,
3901 GLuint texture,
3902 GLint level,
3903 GLint baseViewIndex,
3904 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003905{
Martin Radev82ef7742017-08-08 17:44:58 +03003906 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3907 ASSERT(framebuffer);
3908
3909 if (texture != 0)
3910 {
3911 Texture *textureObj = getTexture(texture);
3912
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003913 ImageIndex index;
3914 if (textureObj->getType() == TextureType::_2DArray)
3915 {
3916 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3917 }
3918 else
3919 {
3920 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3921 ASSERT(level == 0);
3922 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3923 }
Martin Radev82ef7742017-08-08 17:44:58 +03003924 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3925 numViews, baseViewIndex);
3926 }
3927 else
3928 {
3929 framebuffer->resetAttachment(this, attachment);
3930 }
3931
3932 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003933}
3934
Brandon Jones59770802018-04-02 13:18:42 -07003935void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3936 GLenum attachment,
3937 GLuint texture,
3938 GLint level,
3939 GLsizei numViews,
3940 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003941{
Martin Radev5dae57b2017-07-14 16:15:55 +03003942 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3943 ASSERT(framebuffer);
3944
3945 if (texture != 0)
3946 {
3947 Texture *textureObj = getTexture(texture);
3948
3949 ImageIndex index = ImageIndex::Make2D(level);
3950 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3951 textureObj, numViews, viewportOffsets);
3952 }
3953 else
3954 {
3955 framebuffer->resetAttachment(this, attachment);
3956 }
3957
3958 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003959}
3960
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003961void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3962{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003963 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3964 ASSERT(framebuffer);
3965
3966 if (texture != 0)
3967 {
3968 Texture *textureObj = getTexture(texture);
3969
3970 ImageIndex index = ImageIndex::MakeFromType(
3971 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3972 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3973 }
3974 else
3975 {
3976 framebuffer->resetAttachment(this, attachment);
3977 }
3978
3979 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003980}
3981
Jamie Madillc29968b2016-01-20 11:17:23 -05003982void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3983{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003984 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003985 ASSERT(framebuffer);
3986 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003987 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003988 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003989}
3990
3991void Context::readBuffer(GLenum mode)
3992{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003993 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003994 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003995 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003996}
3997
3998void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3999{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004000 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004001 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004002
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004003 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004004 ASSERT(framebuffer);
4005
4006 // The specification isn't clear what should be done when the framebuffer isn't complete.
4007 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04004008 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004009}
4010
4011void Context::invalidateFramebuffer(GLenum target,
4012 GLsizei numAttachments,
4013 const GLenum *attachments)
4014{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004015 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004016 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004017
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004018 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004019 ASSERT(framebuffer);
4020
Jamie Madill427064d2018-04-13 16:20:34 -04004021 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004022 {
Jamie Madill437fa652016-05-03 15:13:24 -04004023 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004024 }
Jamie Madill437fa652016-05-03 15:13:24 -04004025
Jamie Madill4928b7c2017-06-20 12:57:39 -04004026 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004027}
4028
4029void Context::invalidateSubFramebuffer(GLenum target,
4030 GLsizei numAttachments,
4031 const GLenum *attachments,
4032 GLint x,
4033 GLint y,
4034 GLsizei width,
4035 GLsizei height)
4036{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004037 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004038 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004039
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004040 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004041 ASSERT(framebuffer);
4042
Jamie Madill427064d2018-04-13 16:20:34 -04004043 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004044 {
Jamie Madill437fa652016-05-03 15:13:24 -04004045 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004046 }
Jamie Madill437fa652016-05-03 15:13:24 -04004047
4048 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004049 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05004050}
4051
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004052void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004053 GLint level,
4054 GLint internalformat,
4055 GLsizei width,
4056 GLsizei height,
4057 GLint border,
4058 GLenum format,
4059 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004060 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004061{
Jamie Madillbc918e72018-03-08 09:47:21 -05004062 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004063
4064 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004065 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004066 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004067 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004068}
4069
Brandon Jones59770802018-04-02 13:18:42 -07004070void Context::texImage2DRobust(TextureTarget target,
4071 GLint level,
4072 GLint internalformat,
4073 GLsizei width,
4074 GLsizei height,
4075 GLint border,
4076 GLenum format,
4077 GLenum type,
4078 GLsizei bufSize,
4079 const void *pixels)
4080{
4081 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4082}
4083
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004084void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004085 GLint level,
4086 GLint internalformat,
4087 GLsizei width,
4088 GLsizei height,
4089 GLsizei depth,
4090 GLint border,
4091 GLenum format,
4092 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004093 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004094{
Jamie Madillbc918e72018-03-08 09:47:21 -05004095 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004096
4097 Extents size(width, height, depth);
4098 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004099 handleError(texture->setImage(this, mGLState.getUnpackState(),
4100 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004101 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004102}
4103
Brandon Jones59770802018-04-02 13:18:42 -07004104void Context::texImage3DRobust(TextureType target,
4105 GLint level,
4106 GLint internalformat,
4107 GLsizei width,
4108 GLsizei height,
4109 GLsizei depth,
4110 GLint border,
4111 GLenum format,
4112 GLenum type,
4113 GLsizei bufSize,
4114 const void *pixels)
4115{
4116 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4117}
4118
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004119void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004120 GLint level,
4121 GLint xoffset,
4122 GLint yoffset,
4123 GLsizei width,
4124 GLsizei height,
4125 GLenum format,
4126 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004127 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004128{
4129 // Zero sized uploads are valid but no-ops
4130 if (width == 0 || height == 0)
4131 {
4132 return;
4133 }
4134
Jamie Madillbc918e72018-03-08 09:47:21 -05004135 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004136
4137 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004138 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004139
4140 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4141
4142 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4143 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004144}
4145
Brandon Jones59770802018-04-02 13:18:42 -07004146void Context::texSubImage2DRobust(TextureTarget target,
4147 GLint level,
4148 GLint xoffset,
4149 GLint yoffset,
4150 GLsizei width,
4151 GLsizei height,
4152 GLenum format,
4153 GLenum type,
4154 GLsizei bufSize,
4155 const void *pixels)
4156{
4157 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4158}
4159
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004160void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004161 GLint level,
4162 GLint xoffset,
4163 GLint yoffset,
4164 GLint zoffset,
4165 GLsizei width,
4166 GLsizei height,
4167 GLsizei depth,
4168 GLenum format,
4169 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004170 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004171{
4172 // Zero sized uploads are valid but no-ops
4173 if (width == 0 || height == 0 || depth == 0)
4174 {
4175 return;
4176 }
4177
Jamie Madillbc918e72018-03-08 09:47:21 -05004178 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004179
4180 Box area(xoffset, yoffset, zoffset, width, height, depth);
4181 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004182
4183 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4184
4185 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004186 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004187 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004188}
4189
Brandon Jones59770802018-04-02 13:18:42 -07004190void Context::texSubImage3DRobust(TextureType target,
4191 GLint level,
4192 GLint xoffset,
4193 GLint yoffset,
4194 GLint zoffset,
4195 GLsizei width,
4196 GLsizei height,
4197 GLsizei depth,
4198 GLenum format,
4199 GLenum type,
4200 GLsizei bufSize,
4201 const void *pixels)
4202{
4203 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4204 pixels);
4205}
4206
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004207void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004208 GLint level,
4209 GLenum internalformat,
4210 GLsizei width,
4211 GLsizei height,
4212 GLint border,
4213 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004214 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004215{
Jamie Madillbc918e72018-03-08 09:47:21 -05004216 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004217
4218 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004219 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004220 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4221 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004222 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004223}
4224
Brandon Jones59770802018-04-02 13:18:42 -07004225void Context::compressedTexImage2DRobust(TextureTarget target,
4226 GLint level,
4227 GLenum internalformat,
4228 GLsizei width,
4229 GLsizei height,
4230 GLint border,
4231 GLsizei imageSize,
4232 GLsizei dataSize,
4233 const GLvoid *data)
4234{
4235 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4236}
4237
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004238void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004239 GLint level,
4240 GLenum internalformat,
4241 GLsizei width,
4242 GLsizei height,
4243 GLsizei depth,
4244 GLint border,
4245 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004246 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004247{
Jamie Madillbc918e72018-03-08 09:47:21 -05004248 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004249
4250 Extents size(width, height, depth);
4251 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004252 handleError(texture->setCompressedImage(
4253 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004254 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004255}
4256
Brandon Jones59770802018-04-02 13:18:42 -07004257void Context::compressedTexImage3DRobust(TextureType target,
4258 GLint level,
4259 GLenum internalformat,
4260 GLsizei width,
4261 GLsizei height,
4262 GLsizei depth,
4263 GLint border,
4264 GLsizei imageSize,
4265 GLsizei dataSize,
4266 const GLvoid *data)
4267{
4268 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4269 data);
4270}
4271
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004272void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004273 GLint level,
4274 GLint xoffset,
4275 GLint yoffset,
4276 GLsizei width,
4277 GLsizei height,
4278 GLenum format,
4279 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004280 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004281{
Jamie Madillbc918e72018-03-08 09:47:21 -05004282 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004283
4284 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004285 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004286 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4287 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004288 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004289}
4290
Brandon Jones59770802018-04-02 13:18:42 -07004291void Context::compressedTexSubImage2DRobust(TextureTarget target,
4292 GLint level,
4293 GLint xoffset,
4294 GLint yoffset,
4295 GLsizei width,
4296 GLsizei height,
4297 GLenum format,
4298 GLsizei imageSize,
4299 GLsizei dataSize,
4300 const GLvoid *data)
4301{
4302 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4303 data);
4304}
4305
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004306void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004307 GLint level,
4308 GLint xoffset,
4309 GLint yoffset,
4310 GLint zoffset,
4311 GLsizei width,
4312 GLsizei height,
4313 GLsizei depth,
4314 GLenum format,
4315 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004316 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004317{
4318 // Zero sized uploads are valid but no-ops
4319 if (width == 0 || height == 0)
4320 {
4321 return;
4322 }
4323
Jamie Madillbc918e72018-03-08 09:47:21 -05004324 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004325
4326 Box area(xoffset, yoffset, zoffset, width, height, depth);
4327 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004328 handleError(texture->setCompressedSubImage(
4329 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004330 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004331}
4332
Brandon Jones59770802018-04-02 13:18:42 -07004333void Context::compressedTexSubImage3DRobust(TextureType target,
4334 GLint level,
4335 GLint xoffset,
4336 GLint yoffset,
4337 GLint zoffset,
4338 GLsizei width,
4339 GLsizei height,
4340 GLsizei depth,
4341 GLenum format,
4342 GLsizei imageSize,
4343 GLsizei dataSize,
4344 const GLvoid *data)
4345{
4346 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4347 imageSize, data);
4348}
4349
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004350void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004351{
4352 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004353 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004354}
4355
Jamie Madill007530e2017-12-28 14:27:04 -05004356void Context::copyTexture(GLuint sourceId,
4357 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004358 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004359 GLuint destId,
4360 GLint destLevel,
4361 GLint internalFormat,
4362 GLenum destType,
4363 GLboolean unpackFlipY,
4364 GLboolean unpackPremultiplyAlpha,
4365 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004366{
Jamie Madillbc918e72018-03-08 09:47:21 -05004367 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004368
4369 gl::Texture *sourceTexture = getTexture(sourceId);
4370 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004371 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4372 sourceLevel, ConvertToBool(unpackFlipY),
4373 ConvertToBool(unpackPremultiplyAlpha),
4374 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004375}
4376
Jamie Madill007530e2017-12-28 14:27:04 -05004377void Context::copySubTexture(GLuint sourceId,
4378 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004379 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004380 GLuint destId,
4381 GLint destLevel,
4382 GLint xoffset,
4383 GLint yoffset,
4384 GLint x,
4385 GLint y,
4386 GLsizei width,
4387 GLsizei height,
4388 GLboolean unpackFlipY,
4389 GLboolean unpackPremultiplyAlpha,
4390 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004391{
4392 // Zero sized copies are valid but no-ops
4393 if (width == 0 || height == 0)
4394 {
4395 return;
4396 }
4397
Jamie Madillbc918e72018-03-08 09:47:21 -05004398 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004399
4400 gl::Texture *sourceTexture = getTexture(sourceId);
4401 gl::Texture *destTexture = getTexture(destId);
4402 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004403 Box box(x, y, 0, width, height, 1);
4404 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4405 ConvertToBool(unpackFlipY),
4406 ConvertToBool(unpackPremultiplyAlpha),
4407 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4408}
4409
4410void Context::copyTexture3D(GLuint sourceId,
4411 GLint sourceLevel,
4412 TextureTarget destTarget,
4413 GLuint destId,
4414 GLint destLevel,
4415 GLint internalFormat,
4416 GLenum destType,
4417 GLboolean unpackFlipY,
4418 GLboolean unpackPremultiplyAlpha,
4419 GLboolean unpackUnmultiplyAlpha)
4420{
4421 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4422
4423 Texture *sourceTexture = getTexture(sourceId);
4424 Texture *destTexture = getTexture(destId);
4425 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4426 sourceLevel, ConvertToBool(unpackFlipY),
4427 ConvertToBool(unpackPremultiplyAlpha),
4428 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4429}
4430
4431void Context::copySubTexture3D(GLuint sourceId,
4432 GLint sourceLevel,
4433 TextureTarget destTarget,
4434 GLuint destId,
4435 GLint destLevel,
4436 GLint xoffset,
4437 GLint yoffset,
4438 GLint zoffset,
4439 GLint x,
4440 GLint y,
4441 GLint z,
4442 GLsizei width,
4443 GLsizei height,
4444 GLsizei depth,
4445 GLboolean unpackFlipY,
4446 GLboolean unpackPremultiplyAlpha,
4447 GLboolean unpackUnmultiplyAlpha)
4448{
4449 // Zero sized copies are valid but no-ops
4450 if (width == 0 || height == 0 || depth == 0)
4451 {
4452 return;
4453 }
4454
4455 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4456
4457 Texture *sourceTexture = getTexture(sourceId);
4458 Texture *destTexture = getTexture(destId);
4459 Offset offset(xoffset, yoffset, zoffset);
4460 Box box(x, y, z, width, height, depth);
4461 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004462 ConvertToBool(unpackFlipY),
4463 ConvertToBool(unpackPremultiplyAlpha),
4464 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004465}
4466
Jamie Madill007530e2017-12-28 14:27:04 -05004467void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004468{
Jamie Madillbc918e72018-03-08 09:47:21 -05004469 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004470
4471 gl::Texture *sourceTexture = getTexture(sourceId);
4472 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004473 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004474}
4475
Corentin Wallez336129f2017-10-17 15:55:40 -04004476void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004477{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004478 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004479 ASSERT(buffer);
4480
Geoff Lang496c02d2016-10-20 11:38:11 -07004481 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004482}
4483
Brandon Jones59770802018-04-02 13:18:42 -07004484void Context::getBufferPointervRobust(BufferBinding target,
4485 GLenum pname,
4486 GLsizei bufSize,
4487 GLsizei *length,
4488 void **params)
4489{
4490 getBufferPointerv(target, pname, params);
4491}
4492
Corentin Wallez336129f2017-10-17 15:55:40 -04004493void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004494{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004495 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004496 ASSERT(buffer);
4497
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004498 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004499 if (error.isError())
4500 {
Jamie Madill437fa652016-05-03 15:13:24 -04004501 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004502 return nullptr;
4503 }
4504
4505 return buffer->getMapPointer();
4506}
4507
Corentin Wallez336129f2017-10-17 15:55:40 -04004508GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004509{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004510 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004511 ASSERT(buffer);
4512
4513 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004514 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004515 if (error.isError())
4516 {
Jamie Madill437fa652016-05-03 15:13:24 -04004517 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004518 return GL_FALSE;
4519 }
4520
4521 return result;
4522}
4523
Corentin Wallez336129f2017-10-17 15:55:40 -04004524void *Context::mapBufferRange(BufferBinding target,
4525 GLintptr offset,
4526 GLsizeiptr length,
4527 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004528{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004529 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004530 ASSERT(buffer);
4531
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004532 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004533 if (error.isError())
4534 {
Jamie Madill437fa652016-05-03 15:13:24 -04004535 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004536 return nullptr;
4537 }
4538
4539 return buffer->getMapPointer();
4540}
4541
Corentin Wallez336129f2017-10-17 15:55:40 -04004542void Context::flushMappedBufferRange(BufferBinding /*target*/,
4543 GLintptr /*offset*/,
4544 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004545{
4546 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4547}
4548
Jamie Madill526392d2018-11-16 09:35:14 -05004549angle::Result Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004550{
Geoff Langa8cb2872018-03-09 16:09:40 -05004551 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004552}
4553
Jamie Madill526392d2018-11-16 09:35:14 -05004554angle::Result Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004555{
Geoff Langa8cb2872018-03-09 16:09:40 -05004556 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004557}
4558
Jamie Madill526392d2018-11-16 09:35:14 -05004559angle::Result Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004560{
Geoff Langa8cb2872018-03-09 16:09:40 -05004561 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004562}
4563
Jamie Madill526392d2018-11-16 09:35:14 -05004564angle::Result Context::syncStateForPathOperation()
Geoff Lang9bf86f02018-07-26 11:46:34 -04004565{
4566 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4567
4568 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4569 ANGLE_TRY(syncDirtyBits());
4570
Jamie Madill526392d2018-11-16 09:35:14 -05004571 return angle::Result::Continue();
Geoff Lang9bf86f02018-07-26 11:46:34 -04004572}
4573
Jiajia Qin5451d532017-11-16 17:16:34 +08004574void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4575{
4576 UNIMPLEMENTED();
4577}
4578
Jamie Madillc20ab272016-06-09 07:20:46 -07004579void Context::activeTexture(GLenum texture)
4580{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004581 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004582}
4583
Jamie Madill876429b2017-04-20 15:46:24 -04004584void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004585{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004586 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004587}
4588
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004589void Context::blendEquation(GLenum mode)
4590{
4591 mGLState.setBlendEquation(mode, mode);
4592}
4593
Jamie Madillc20ab272016-06-09 07:20:46 -07004594void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4595{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004596 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004597}
4598
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004599void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4600{
4601 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4602}
4603
Jamie Madillc20ab272016-06-09 07:20:46 -07004604void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4605{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004606 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004607}
4608
Jamie Madill876429b2017-04-20 15:46:24 -04004609void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004610{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004611 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004612}
4613
Jamie Madill876429b2017-04-20 15:46:24 -04004614void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004615{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004616 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004617}
4618
4619void Context::clearStencil(GLint s)
4620{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004621 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004622}
4623
4624void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4625{
Geoff Lang92019432017-11-20 13:09:34 -05004626 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4627 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004628}
4629
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004630void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004631{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004632 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004633}
4634
4635void Context::depthFunc(GLenum func)
4636{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004637 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004638}
4639
4640void Context::depthMask(GLboolean flag)
4641{
Geoff Lang92019432017-11-20 13:09:34 -05004642 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004643}
4644
Jamie Madill876429b2017-04-20 15:46:24 -04004645void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004646{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004647 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004648}
4649
4650void Context::disable(GLenum cap)
4651{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004652 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004653 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004654}
4655
4656void Context::disableVertexAttribArray(GLuint index)
4657{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004658 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004659 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004660}
4661
4662void Context::enable(GLenum cap)
4663{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004664 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004665 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004666}
4667
4668void Context::enableVertexAttribArray(GLuint index)
4669{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004670 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004671 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004672}
4673
4674void Context::frontFace(GLenum mode)
4675{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004676 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004677}
4678
4679void Context::hint(GLenum target, GLenum mode)
4680{
4681 switch (target)
4682 {
4683 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004684 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004685 break;
4686
4687 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004688 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004689 break;
4690
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004691 case GL_PERSPECTIVE_CORRECTION_HINT:
4692 case GL_POINT_SMOOTH_HINT:
4693 case GL_LINE_SMOOTH_HINT:
4694 case GL_FOG_HINT:
4695 mGLState.gles1().setHint(target, mode);
4696 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004697 default:
4698 UNREACHABLE();
4699 return;
4700 }
4701}
4702
4703void Context::lineWidth(GLfloat width)
4704{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004705 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004706}
4707
4708void Context::pixelStorei(GLenum pname, GLint param)
4709{
4710 switch (pname)
4711 {
4712 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004713 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004714 break;
4715
4716 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004717 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004718 break;
4719
4720 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004721 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004722 break;
4723
4724 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004725 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004726 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004727 break;
4728
4729 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004730 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004731 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004732 break;
4733
4734 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004735 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004736 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004737 break;
4738
4739 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004740 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004741 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004742 break;
4743
4744 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004745 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004746 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004747 break;
4748
4749 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004750 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004751 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004752 break;
4753
4754 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004755 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004756 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004757 break;
4758
4759 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004760 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004761 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004762 break;
4763
4764 default:
4765 UNREACHABLE();
4766 return;
4767 }
4768}
4769
4770void Context::polygonOffset(GLfloat factor, GLfloat units)
4771{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004772 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004773}
4774
Jamie Madill876429b2017-04-20 15:46:24 -04004775void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004776{
Geoff Lang92019432017-11-20 13:09:34 -05004777 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004778}
4779
Jiawei Shaodb342272017-09-27 10:21:45 +08004780void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4781{
4782 mGLState.setSampleMaskParams(maskNumber, mask);
4783}
4784
Jamie Madillc20ab272016-06-09 07:20:46 -07004785void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4786{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004787 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004788}
4789
4790void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4791{
4792 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4793 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004794 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004795 }
4796
4797 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4798 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004799 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004800 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004801
4802 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004803}
4804
4805void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4806{
4807 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4808 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004809 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004810 }
4811
4812 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4813 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004814 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004815 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004816
4817 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004818}
4819
4820void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4821{
4822 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4823 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004824 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004825 }
4826
4827 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4828 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004829 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004830 }
4831}
4832
4833void Context::vertexAttrib1f(GLuint index, GLfloat x)
4834{
4835 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004836 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004837 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004838}
4839
4840void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4841{
4842 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004843 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004844 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004845}
4846
4847void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4848{
4849 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004850 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004851 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004852}
4853
4854void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4855{
4856 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004857 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004858 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004859}
4860
4861void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4862{
4863 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004864 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004865 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004866}
4867
4868void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4869{
4870 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004871 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004872 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004873}
4874
4875void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4876{
4877 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004878 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004879 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004880}
4881
4882void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4883{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004884 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004885 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004886}
4887
4888void Context::vertexAttribPointer(GLuint index,
4889 GLint size,
4890 GLenum type,
4891 GLboolean normalized,
4892 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004893 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004894{
Corentin Wallez336129f2017-10-17 15:55:40 -04004895 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004896 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004897 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004898}
4899
Shao80957d92017-02-20 21:25:59 +08004900void Context::vertexAttribFormat(GLuint attribIndex,
4901 GLint size,
4902 GLenum type,
4903 GLboolean normalized,
4904 GLuint relativeOffset)
4905{
Geoff Lang92019432017-11-20 13:09:34 -05004906 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004907 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004908 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004909}
4910
4911void Context::vertexAttribIFormat(GLuint attribIndex,
4912 GLint size,
4913 GLenum type,
4914 GLuint relativeOffset)
4915{
4916 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004917 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004918}
4919
4920void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4921{
Shaodde78e82017-05-22 14:13:27 +08004922 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004923 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004924}
4925
Jiajia Qin5451d532017-11-16 17:16:34 +08004926void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004927{
4928 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004929 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004930}
4931
Jamie Madillc20ab272016-06-09 07:20:46 -07004932void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4933{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004934 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004935}
4936
4937void Context::vertexAttribIPointer(GLuint index,
4938 GLint size,
4939 GLenum type,
4940 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004941 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004942{
Corentin Wallez336129f2017-10-17 15:55:40 -04004943 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4944 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004945 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004946}
4947
4948void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4949{
4950 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004951 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004952 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004953}
4954
4955void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4956{
4957 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004958 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004959 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004960}
4961
4962void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4963{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004964 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004965 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004966}
4967
4968void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4969{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004970 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004971 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004972}
4973
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004974void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4975{
4976 const VertexAttribCurrentValueData &currentValues =
4977 getGLState().getVertexAttribCurrentValue(index);
4978 const VertexArray *vao = getGLState().getVertexArray();
4979 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4980 currentValues, pname, params);
4981}
4982
Brandon Jones59770802018-04-02 13:18:42 -07004983void Context::getVertexAttribivRobust(GLuint index,
4984 GLenum pname,
4985 GLsizei bufSize,
4986 GLsizei *length,
4987 GLint *params)
4988{
4989 getVertexAttribiv(index, pname, params);
4990}
4991
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004992void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4993{
4994 const VertexAttribCurrentValueData &currentValues =
4995 getGLState().getVertexAttribCurrentValue(index);
4996 const VertexArray *vao = getGLState().getVertexArray();
4997 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4998 currentValues, pname, params);
4999}
5000
Brandon Jones59770802018-04-02 13:18:42 -07005001void Context::getVertexAttribfvRobust(GLuint index,
5002 GLenum pname,
5003 GLsizei bufSize,
5004 GLsizei *length,
5005 GLfloat *params)
5006{
5007 getVertexAttribfv(index, pname, params);
5008}
5009
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005010void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
5011{
5012 const VertexAttribCurrentValueData &currentValues =
5013 getGLState().getVertexAttribCurrentValue(index);
5014 const VertexArray *vao = getGLState().getVertexArray();
5015 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5016 currentValues, pname, params);
5017}
5018
Brandon Jones59770802018-04-02 13:18:42 -07005019void Context::getVertexAttribIivRobust(GLuint index,
5020 GLenum pname,
5021 GLsizei bufSize,
5022 GLsizei *length,
5023 GLint *params)
5024{
5025 getVertexAttribIiv(index, pname, params);
5026}
5027
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005028void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
5029{
5030 const VertexAttribCurrentValueData &currentValues =
5031 getGLState().getVertexAttribCurrentValue(index);
5032 const VertexArray *vao = getGLState().getVertexArray();
5033 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5034 currentValues, pname, params);
5035}
5036
Brandon Jones59770802018-04-02 13:18:42 -07005037void Context::getVertexAttribIuivRobust(GLuint index,
5038 GLenum pname,
5039 GLsizei bufSize,
5040 GLsizei *length,
5041 GLuint *params)
5042{
5043 getVertexAttribIuiv(index, pname, params);
5044}
5045
Jamie Madill876429b2017-04-20 15:46:24 -04005046void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005047{
5048 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
5049 QueryVertexAttribPointerv(attrib, pname, pointer);
5050}
5051
Brandon Jones59770802018-04-02 13:18:42 -07005052void Context::getVertexAttribPointervRobust(GLuint index,
5053 GLenum pname,
5054 GLsizei bufSize,
5055 GLsizei *length,
5056 void **pointer)
5057{
5058 getVertexAttribPointerv(index, pname, pointer);
5059}
5060
Jamie Madillc20ab272016-06-09 07:20:46 -07005061void Context::debugMessageControl(GLenum source,
5062 GLenum type,
5063 GLenum severity,
5064 GLsizei count,
5065 const GLuint *ids,
5066 GLboolean enabled)
5067{
5068 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005069 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005070 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005071}
5072
5073void Context::debugMessageInsert(GLenum source,
5074 GLenum type,
5075 GLuint id,
5076 GLenum severity,
5077 GLsizei length,
5078 const GLchar *buf)
5079{
5080 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005081 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005082}
5083
5084void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5085{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005086 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005087}
5088
5089GLuint Context::getDebugMessageLog(GLuint count,
5090 GLsizei bufSize,
5091 GLenum *sources,
5092 GLenum *types,
5093 GLuint *ids,
5094 GLenum *severities,
5095 GLsizei *lengths,
5096 GLchar *messageLog)
5097{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005098 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5099 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005100}
5101
5102void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5103{
5104 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005105 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005106 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005107}
5108
5109void Context::popDebugGroup()
5110{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005111 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005112 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005113}
5114
Corentin Wallez336129f2017-10-17 15:55:40 -04005115void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005116{
5117 Buffer *buffer = mGLState.getTargetBuffer(target);
5118 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005119 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005120}
5121
Corentin Wallez336129f2017-10-17 15:55:40 -04005122void Context::bufferSubData(BufferBinding target,
5123 GLintptr offset,
5124 GLsizeiptr size,
5125 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005126{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005127 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005128 {
5129 return;
5130 }
5131
5132 Buffer *buffer = mGLState.getTargetBuffer(target);
5133 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005134 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005135}
5136
Jamie Madillef300b12016-10-07 15:12:09 -04005137void Context::attachShader(GLuint program, GLuint shader)
5138{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005139 Program *programObject = mState.mShaderPrograms->getProgram(program);
5140 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005141 ASSERT(programObject && shaderObject);
5142 programObject->attachShader(shaderObject);
5143}
5144
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005145const Workarounds &Context::getWorkarounds() const
5146{
5147 return mWorkarounds;
5148}
5149
Corentin Wallez336129f2017-10-17 15:55:40 -04005150void Context::copyBufferSubData(BufferBinding readTarget,
5151 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005152 GLintptr readOffset,
5153 GLintptr writeOffset,
5154 GLsizeiptr size)
5155{
5156 // if size is zero, the copy is a successful no-op
5157 if (size == 0)
5158 {
5159 return;
5160 }
5161
5162 // TODO(jmadill): cache these.
5163 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5164 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5165
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005166 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005167}
5168
Jamie Madill01a80ee2016-11-07 12:06:18 -05005169void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5170{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005171 // Ideally we could share the program query with the validation layer if possible.
5172 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005173 ASSERT(programObject);
5174 programObject->bindAttributeLocation(index, name);
5175}
5176
Corentin Wallez336129f2017-10-17 15:55:40 -04005177void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005178{
Corentin Wallez336129f2017-10-17 15:55:40 -04005179 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5180 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005181 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005182}
5183
Corentin Wallez336129f2017-10-17 15:55:40 -04005184void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005185{
5186 bindBufferRange(target, index, buffer, 0, 0);
5187}
5188
Corentin Wallez336129f2017-10-17 15:55:40 -04005189void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005190 GLuint index,
5191 GLuint buffer,
5192 GLintptr offset,
5193 GLsizeiptr size)
5194{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005195 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5196 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5197 if (target == BufferBinding::Uniform)
5198 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005199 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005200 mStateCache.onUniformBufferStateChange(this);
5201 }
5202 else
5203 {
5204 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005205 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005206}
5207
Jamie Madill01a80ee2016-11-07 12:06:18 -05005208void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5209{
5210 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5211 {
5212 bindReadFramebuffer(framebuffer);
5213 }
5214
5215 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5216 {
5217 bindDrawFramebuffer(framebuffer);
5218 }
5219}
5220
5221void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5222{
5223 ASSERT(target == GL_RENDERBUFFER);
5224 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005225 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005226 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005227}
5228
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005229void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005230 GLsizei samples,
5231 GLenum internalformat,
5232 GLsizei width,
5233 GLsizei height,
5234 GLboolean fixedsamplelocations)
5235{
5236 Extents size(width, height, 1);
5237 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005238 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5239 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005240}
5241
Olli Etuaho89664842018-08-24 14:45:36 +03005242void Context::texStorage3DMultisample(TextureType target,
5243 GLsizei samples,
5244 GLenum internalformat,
5245 GLsizei width,
5246 GLsizei height,
5247 GLsizei depth,
5248 GLboolean fixedsamplelocations)
5249{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005250 Extents size(width, height, depth);
5251 Texture *texture = getTargetTexture(target);
5252 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5253 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005254}
5255
JiangYizhoubddc46b2016-12-09 09:50:51 +08005256void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5257{
JiangYizhou5b03f472017-01-09 10:22:53 +08005258 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5259 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005260 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005261 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005262
5263 switch (pname)
5264 {
5265 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005266 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005267 break;
5268 default:
5269 UNREACHABLE();
5270 }
5271}
5272
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005273void Context::getMultisamplefvRobust(GLenum pname,
5274 GLuint index,
5275 GLsizei bufSize,
5276 GLsizei *length,
5277 GLfloat *val)
5278{
5279 UNIMPLEMENTED();
5280}
5281
Jamie Madille8fb6402017-02-14 17:56:40 -05005282void Context::renderbufferStorage(GLenum target,
5283 GLenum internalformat,
5284 GLsizei width,
5285 GLsizei height)
5286{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005287 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5288 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5289
Jamie Madille8fb6402017-02-14 17:56:40 -05005290 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005291 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005292}
5293
5294void Context::renderbufferStorageMultisample(GLenum target,
5295 GLsizei samples,
5296 GLenum internalformat,
5297 GLsizei width,
5298 GLsizei height)
5299{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005300 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5301 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005302
5303 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005304 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005305 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005306}
5307
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005308void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5309{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005310 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005311 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005312}
5313
JiangYizhoue18e6392017-02-20 10:32:23 +08005314void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5315{
5316 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5317 QueryFramebufferParameteriv(framebuffer, pname, params);
5318}
5319
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005320void Context::getFramebufferParameterivRobust(GLenum target,
5321 GLenum pname,
5322 GLsizei bufSize,
5323 GLsizei *length,
5324 GLint *params)
5325{
5326 UNIMPLEMENTED();
5327}
5328
Jiajia Qin5451d532017-11-16 17:16:34 +08005329void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005330{
5331 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005332 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005333}
5334
Jamie Madilldec86232018-07-11 09:01:18 -04005335bool Context::getScratchBuffer(size_t requstedSizeBytes,
5336 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005337{
Jamie Madilldec86232018-07-11 09:01:18 -04005338 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005339}
5340
Jamie Madilldec86232018-07-11 09:01:18 -04005341bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5342 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005343{
Jamie Madilldec86232018-07-11 09:01:18 -04005344 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005345}
5346
Jamie Madill526392d2018-11-16 09:35:14 -05005347angle::Result Context::prepareForDispatch()
Xinghua Cao10a4d432017-11-28 14:46:26 +08005348{
Jamie Madill0cc11c62018-10-12 18:07:18 -04005349 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005350
5351 if (isRobustResourceInitEnabled())
5352 {
5353 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5354 }
5355
Jamie Madill0cc11c62018-10-12 18:07:18 -04005356 return syncDirtyBits(mComputeDirtyBits);
Xinghua Cao10a4d432017-11-28 14:46:26 +08005357}
5358
Xinghua Cao2b396592017-03-29 15:36:04 +08005359void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5360{
5361 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5362 {
5363 return;
5364 }
5365
Xinghua Cao10a4d432017-11-28 14:46:26 +08005366 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005367 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005368}
5369
Jiajia Qin5451d532017-11-16 17:16:34 +08005370void Context::dispatchComputeIndirect(GLintptr indirect)
5371{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005372 ANGLE_CONTEXT_TRY(prepareForDispatch());
5373 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005374}
5375
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005376void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005377 GLsizei levels,
5378 GLenum internalFormat,
5379 GLsizei width,
5380 GLsizei height)
5381{
5382 Extents size(width, height, 1);
5383 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005384 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005385}
5386
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005387void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005388 GLsizei levels,
5389 GLenum internalFormat,
5390 GLsizei width,
5391 GLsizei height,
5392 GLsizei depth)
5393{
5394 Extents size(width, height, depth);
5395 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005396 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005397}
5398
Jiajia Qin5451d532017-11-16 17:16:34 +08005399void Context::memoryBarrier(GLbitfield barriers)
5400{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005401 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005402}
5403
5404void Context::memoryBarrierByRegion(GLbitfield barriers)
5405{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005406 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005407}
5408
Austin Eng1bf18ce2018-10-19 15:34:02 -07005409void Context::multiDrawArrays(PrimitiveMode mode,
5410 const GLint *firsts,
5411 const GLsizei *counts,
5412 GLsizei drawcount)
5413{
5414 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5415 Program *programObject = mGLState.getLinkedProgram(this);
5416 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5417 if (hasDrawID)
5418 {
5419 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5420 {
5421 if (noopDraw(mode, counts[drawID]))
5422 {
5423 continue;
5424 }
5425 programObject->setDrawIDUniform(drawID);
5426 ANGLE_CONTEXT_TRY(
5427 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5428 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5429 counts[drawID], 1);
5430 }
5431 }
5432 else
5433 {
5434 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5435 {
5436 if (noopDraw(mode, counts[drawID]))
5437 {
5438 continue;
5439 }
5440 ANGLE_CONTEXT_TRY(
5441 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5442 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5443 counts[drawID], 1);
5444 }
5445 }
5446}
5447
5448void Context::multiDrawArraysInstanced(PrimitiveMode mode,
5449 const GLint *firsts,
5450 const GLsizei *counts,
5451 const GLsizei *instanceCounts,
5452 GLsizei drawcount)
5453{
5454 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5455 Program *programObject = mGLState.getLinkedProgram(this);
5456 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5457 if (hasDrawID)
5458 {
5459 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5460 {
5461 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5462 {
5463 continue;
5464 }
5465 programObject->setDrawIDUniform(drawID);
5466 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5467 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5468 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5469 counts[drawID], instanceCounts[drawID]);
5470 }
5471 }
5472 else
5473 {
5474 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5475 {
5476 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5477 {
5478 continue;
5479 }
5480 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5481 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5482 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5483 counts[drawID], instanceCounts[drawID]);
5484 }
5485 }
5486}
5487
5488void Context::multiDrawElements(PrimitiveMode mode,
5489 const GLsizei *counts,
5490 GLenum type,
5491 const GLsizei *offsets,
5492 GLsizei drawcount)
5493{
5494 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5495 Program *programObject = mGLState.getLinkedProgram(this);
5496 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5497 if (hasDrawID)
5498 {
5499 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5500 {
5501 if (noopDraw(mode, counts[drawID]))
5502 {
5503 continue;
5504 }
5505 programObject->setDrawIDUniform(drawID);
5506 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5507 ANGLE_CONTEXT_TRY(
5508 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5509 }
5510 }
5511 else
5512 {
5513 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5514 {
5515 if (noopDraw(mode, counts[drawID]))
5516 {
5517 continue;
5518 }
5519 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5520 ANGLE_CONTEXT_TRY(
5521 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5522 }
5523 }
5524}
5525
5526void Context::multiDrawElementsInstanced(PrimitiveMode mode,
5527 const GLsizei *counts,
5528 GLenum type,
5529 const GLsizei *offsets,
5530 const GLsizei *instanceCounts,
5531 GLsizei drawcount)
5532{
5533 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5534 Program *programObject = mGLState.getLinkedProgram(this);
5535 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5536 if (hasDrawID)
5537 {
5538 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5539 {
5540 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5541 {
5542 continue;
5543 }
5544 programObject->setDrawIDUniform(drawID);
5545 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5546 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5547 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5548 }
5549 }
5550 else
5551 {
5552 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5553 {
5554 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5555 {
5556 continue;
5557 }
5558 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5559 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5560 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5561 }
5562 }
5563}
5564
Jamie Madillc1d770e2017-04-13 17:31:24 -04005565GLenum Context::checkFramebufferStatus(GLenum target)
5566{
5567 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5568 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005569 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005570}
5571
5572void Context::compileShader(GLuint shader)
5573{
5574 Shader *shaderObject = GetValidShader(this, shader);
5575 if (!shaderObject)
5576 {
5577 return;
5578 }
5579 shaderObject->compile(this);
5580}
5581
5582void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5583{
5584 for (int i = 0; i < n; i++)
5585 {
5586 deleteBuffer(buffers[i]);
5587 }
5588}
5589
5590void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5591{
5592 for (int i = 0; i < n; i++)
5593 {
5594 if (framebuffers[i] != 0)
5595 {
5596 deleteFramebuffer(framebuffers[i]);
5597 }
5598 }
5599}
5600
5601void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5602{
5603 for (int i = 0; i < n; i++)
5604 {
5605 deleteRenderbuffer(renderbuffers[i]);
5606 }
5607}
5608
5609void Context::deleteTextures(GLsizei n, const GLuint *textures)
5610{
5611 for (int i = 0; i < n; i++)
5612 {
5613 if (textures[i] != 0)
5614 {
5615 deleteTexture(textures[i]);
5616 }
5617 }
5618}
5619
5620void Context::detachShader(GLuint program, GLuint shader)
5621{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005622 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005623 ASSERT(programObject);
5624
5625 Shader *shaderObject = getShader(shader);
5626 ASSERT(shaderObject);
5627
5628 programObject->detachShader(this, shaderObject);
5629}
5630
5631void Context::genBuffers(GLsizei n, GLuint *buffers)
5632{
5633 for (int i = 0; i < n; i++)
5634 {
5635 buffers[i] = createBuffer();
5636 }
5637}
5638
5639void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5640{
5641 for (int i = 0; i < n; i++)
5642 {
5643 framebuffers[i] = createFramebuffer();
5644 }
5645}
5646
5647void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5648{
5649 for (int i = 0; i < n; i++)
5650 {
5651 renderbuffers[i] = createRenderbuffer();
5652 }
5653}
5654
5655void Context::genTextures(GLsizei n, GLuint *textures)
5656{
5657 for (int i = 0; i < n; i++)
5658 {
5659 textures[i] = createTexture();
5660 }
5661}
5662
5663void Context::getActiveAttrib(GLuint program,
5664 GLuint index,
5665 GLsizei bufsize,
5666 GLsizei *length,
5667 GLint *size,
5668 GLenum *type,
5669 GLchar *name)
5670{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005671 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005672 ASSERT(programObject);
5673 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5674}
5675
5676void Context::getActiveUniform(GLuint program,
5677 GLuint index,
5678 GLsizei bufsize,
5679 GLsizei *length,
5680 GLint *size,
5681 GLenum *type,
5682 GLchar *name)
5683{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005684 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005685 ASSERT(programObject);
5686 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5687}
5688
5689void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5690{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005691 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005692 ASSERT(programObject);
5693 programObject->getAttachedShaders(maxcount, count, shaders);
5694}
5695
5696GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5697{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005698 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005699 ASSERT(programObject);
5700 return programObject->getAttributeLocation(name);
5701}
5702
5703void Context::getBooleanv(GLenum pname, GLboolean *params)
5704{
5705 GLenum nativeType;
5706 unsigned int numParams = 0;
5707 getQueryParameterInfo(pname, &nativeType, &numParams);
5708
5709 if (nativeType == GL_BOOL)
5710 {
5711 getBooleanvImpl(pname, params);
5712 }
5713 else
5714 {
5715 CastStateValues(this, nativeType, pname, numParams, params);
5716 }
5717}
5718
Brandon Jones59770802018-04-02 13:18:42 -07005719void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5720{
5721 getBooleanv(pname, params);
5722}
5723
Jamie Madillc1d770e2017-04-13 17:31:24 -04005724void Context::getFloatv(GLenum pname, GLfloat *params)
5725{
5726 GLenum nativeType;
5727 unsigned int numParams = 0;
5728 getQueryParameterInfo(pname, &nativeType, &numParams);
5729
5730 if (nativeType == GL_FLOAT)
5731 {
5732 getFloatvImpl(pname, params);
5733 }
5734 else
5735 {
5736 CastStateValues(this, nativeType, pname, numParams, params);
5737 }
5738}
5739
Brandon Jones59770802018-04-02 13:18:42 -07005740void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5741{
5742 getFloatv(pname, params);
5743}
5744
Jamie Madillc1d770e2017-04-13 17:31:24 -04005745void Context::getIntegerv(GLenum pname, GLint *params)
5746{
5747 GLenum nativeType;
5748 unsigned int numParams = 0;
5749 getQueryParameterInfo(pname, &nativeType, &numParams);
5750
5751 if (nativeType == GL_INT)
5752 {
5753 getIntegervImpl(pname, params);
5754 }
5755 else
5756 {
5757 CastStateValues(this, nativeType, pname, numParams, params);
5758 }
5759}
5760
Brandon Jones59770802018-04-02 13:18:42 -07005761void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5762{
5763 getIntegerv(pname, data);
5764}
5765
Jamie Madillc1d770e2017-04-13 17:31:24 -04005766void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5767{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005768 // Don't resolve link if checking the link completion status.
5769 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5770 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005771 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005772 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005773}
5774
Brandon Jones59770802018-04-02 13:18:42 -07005775void Context::getProgramivRobust(GLuint program,
5776 GLenum pname,
5777 GLsizei bufSize,
5778 GLsizei *length,
5779 GLint *params)
5780{
5781 getProgramiv(program, pname, params);
5782}
5783
Jiajia Qin5451d532017-11-16 17:16:34 +08005784void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5785{
5786 UNIMPLEMENTED();
5787}
5788
Jamie Madillbe849e42017-05-02 15:49:00 -04005789void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005790{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005791 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005792 ASSERT(programObject);
5793 programObject->getInfoLog(bufsize, length, infolog);
5794}
5795
Jiajia Qin5451d532017-11-16 17:16:34 +08005796void Context::getProgramPipelineInfoLog(GLuint pipeline,
5797 GLsizei bufSize,
5798 GLsizei *length,
5799 GLchar *infoLog)
5800{
5801 UNIMPLEMENTED();
5802}
5803
Jamie Madillc1d770e2017-04-13 17:31:24 -04005804void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5805{
5806 Shader *shaderObject = getShader(shader);
5807 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005808 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005809}
5810
Brandon Jones59770802018-04-02 13:18:42 -07005811void Context::getShaderivRobust(GLuint shader,
5812 GLenum pname,
5813 GLsizei bufSize,
5814 GLsizei *length,
5815 GLint *params)
5816{
5817 getShaderiv(shader, pname, params);
5818}
5819
Jamie Madillc1d770e2017-04-13 17:31:24 -04005820void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5821{
5822 Shader *shaderObject = getShader(shader);
5823 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005824 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005825}
5826
5827void Context::getShaderPrecisionFormat(GLenum shadertype,
5828 GLenum precisiontype,
5829 GLint *range,
5830 GLint *precision)
5831{
5832 // TODO(jmadill): Compute shaders.
5833
5834 switch (shadertype)
5835 {
5836 case GL_VERTEX_SHADER:
5837 switch (precisiontype)
5838 {
5839 case GL_LOW_FLOAT:
5840 mCaps.vertexLowpFloat.get(range, precision);
5841 break;
5842 case GL_MEDIUM_FLOAT:
5843 mCaps.vertexMediumpFloat.get(range, precision);
5844 break;
5845 case GL_HIGH_FLOAT:
5846 mCaps.vertexHighpFloat.get(range, precision);
5847 break;
5848
5849 case GL_LOW_INT:
5850 mCaps.vertexLowpInt.get(range, precision);
5851 break;
5852 case GL_MEDIUM_INT:
5853 mCaps.vertexMediumpInt.get(range, precision);
5854 break;
5855 case GL_HIGH_INT:
5856 mCaps.vertexHighpInt.get(range, precision);
5857 break;
5858
5859 default:
5860 UNREACHABLE();
5861 return;
5862 }
5863 break;
5864
5865 case GL_FRAGMENT_SHADER:
5866 switch (precisiontype)
5867 {
5868 case GL_LOW_FLOAT:
5869 mCaps.fragmentLowpFloat.get(range, precision);
5870 break;
5871 case GL_MEDIUM_FLOAT:
5872 mCaps.fragmentMediumpFloat.get(range, precision);
5873 break;
5874 case GL_HIGH_FLOAT:
5875 mCaps.fragmentHighpFloat.get(range, precision);
5876 break;
5877
5878 case GL_LOW_INT:
5879 mCaps.fragmentLowpInt.get(range, precision);
5880 break;
5881 case GL_MEDIUM_INT:
5882 mCaps.fragmentMediumpInt.get(range, precision);
5883 break;
5884 case GL_HIGH_INT:
5885 mCaps.fragmentHighpInt.get(range, precision);
5886 break;
5887
5888 default:
5889 UNREACHABLE();
5890 return;
5891 }
5892 break;
5893
5894 default:
5895 UNREACHABLE();
5896 return;
5897 }
5898}
5899
5900void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5901{
5902 Shader *shaderObject = getShader(shader);
5903 ASSERT(shaderObject);
5904 shaderObject->getSource(bufsize, length, source);
5905}
5906
5907void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5908{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005909 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005910 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005911 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005912}
5913
Brandon Jones59770802018-04-02 13:18:42 -07005914void Context::getUniformfvRobust(GLuint program,
5915 GLint location,
5916 GLsizei bufSize,
5917 GLsizei *length,
5918 GLfloat *params)
5919{
5920 getUniformfv(program, location, params);
5921}
5922
Jamie Madillc1d770e2017-04-13 17:31:24 -04005923void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5924{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005925 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005926 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005927 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005928}
5929
Brandon Jones59770802018-04-02 13:18:42 -07005930void Context::getUniformivRobust(GLuint program,
5931 GLint location,
5932 GLsizei bufSize,
5933 GLsizei *length,
5934 GLint *params)
5935{
5936 getUniformiv(program, location, params);
5937}
5938
Jamie Madillc1d770e2017-04-13 17:31:24 -04005939GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5940{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005941 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005942 ASSERT(programObject);
5943 return programObject->getUniformLocation(name);
5944}
5945
5946GLboolean Context::isBuffer(GLuint buffer)
5947{
5948 if (buffer == 0)
5949 {
5950 return GL_FALSE;
5951 }
5952
5953 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5954}
5955
5956GLboolean Context::isEnabled(GLenum cap)
5957{
5958 return mGLState.getEnableFeature(cap);
5959}
5960
5961GLboolean Context::isFramebuffer(GLuint framebuffer)
5962{
5963 if (framebuffer == 0)
5964 {
5965 return GL_FALSE;
5966 }
5967
5968 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5969}
5970
5971GLboolean Context::isProgram(GLuint program)
5972{
5973 if (program == 0)
5974 {
5975 return GL_FALSE;
5976 }
5977
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005978 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005979}
5980
5981GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5982{
5983 if (renderbuffer == 0)
5984 {
5985 return GL_FALSE;
5986 }
5987
5988 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5989}
5990
5991GLboolean Context::isShader(GLuint shader)
5992{
5993 if (shader == 0)
5994 {
5995 return GL_FALSE;
5996 }
5997
5998 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5999}
6000
6001GLboolean Context::isTexture(GLuint texture)
6002{
6003 if (texture == 0)
6004 {
6005 return GL_FALSE;
6006 }
6007
6008 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
6009}
6010
6011void Context::linkProgram(GLuint program)
6012{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006013 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006014 ASSERT(programObject);
6015 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08006016
6017 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
6018 // don't need to worry that:
6019 // 1. Draw calls after link use the new executable code or the old one depending on the link
6020 // result.
6021 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
6022 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
6023 // ProgramD3D.
6024 if (programObject->isInUse())
6025 {
Jamie Madill785e8a02018-10-04 17:42:00 -04006026 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04006027 if (programObject->isLinked())
6028 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006029 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006030 }
jchen107ae70d82018-07-06 13:47:01 +08006031 mStateCache.onProgramExecutableChange(this);
6032 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006033}
6034
6035void Context::releaseShaderCompiler()
6036{
Jamie Madill4928b7c2017-06-20 12:57:39 -04006037 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006038}
6039
6040void Context::shaderBinary(GLsizei n,
6041 const GLuint *shaders,
6042 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04006043 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04006044 GLsizei length)
6045{
6046 // No binary shader formats are supported.
6047 UNIMPLEMENTED();
6048}
6049
Olli Etuaho0ca09752018-09-24 11:00:50 +03006050void Context::bindFragDataLocationIndexed(GLuint program,
6051 GLuint colorNumber,
6052 GLuint index,
6053 const char *name)
6054{
6055 Program *programObject = getProgramNoResolveLink(program);
6056 programObject->bindFragmentOutputLocation(colorNumber, name);
6057 programObject->bindFragmentOutputIndex(index, name);
6058}
6059
6060void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
6061{
6062 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
6063}
6064
6065int Context::getFragDataIndex(GLuint program, const char *name)
6066{
6067 Program *programObject = getProgramResolveLink(program);
6068 return programObject->getFragDataIndex(name);
6069}
6070
6071int Context::getProgramResourceLocationIndex(GLuint program,
6072 GLenum programInterface,
6073 const char *name)
6074{
6075 Program *programObject = getProgramResolveLink(program);
6076 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
6077 return programObject->getFragDataIndex(name);
6078}
6079
Jamie Madillc1d770e2017-04-13 17:31:24 -04006080void Context::shaderSource(GLuint shader,
6081 GLsizei count,
6082 const GLchar *const *string,
6083 const GLint *length)
6084{
6085 Shader *shaderObject = getShader(shader);
6086 ASSERT(shaderObject);
6087 shaderObject->setSource(count, string, length);
6088}
6089
6090void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
6091{
6092 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
6093}
6094
6095void Context::stencilMask(GLuint mask)
6096{
6097 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
6098}
6099
6100void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
6101{
6102 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
6103}
6104
6105void Context::uniform1f(GLint location, GLfloat x)
6106{
6107 Program *program = mGLState.getProgram();
6108 program->setUniform1fv(location, 1, &x);
6109}
6110
6111void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
6112{
6113 Program *program = mGLState.getProgram();
6114 program->setUniform1fv(location, count, v);
6115}
6116
Jamie Madill7e4eff12018-08-08 15:49:26 -04006117void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006118{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006119 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04006120 {
6121 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006122 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04006123 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006124}
6125
Jamie Madill7e4eff12018-08-08 15:49:26 -04006126void Context::uniform1i(GLint location, GLint x)
6127{
6128 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
6129}
6130
Jamie Madillc1d770e2017-04-13 17:31:24 -04006131void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
6132{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006133 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006134}
6135
6136void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
6137{
6138 GLfloat xy[2] = {x, y};
6139 Program *program = mGLState.getProgram();
6140 program->setUniform2fv(location, 1, xy);
6141}
6142
6143void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
6144{
6145 Program *program = mGLState.getProgram();
6146 program->setUniform2fv(location, count, v);
6147}
6148
6149void Context::uniform2i(GLint location, GLint x, GLint y)
6150{
6151 GLint xy[2] = {x, y};
6152 Program *program = mGLState.getProgram();
6153 program->setUniform2iv(location, 1, xy);
6154}
6155
6156void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6157{
6158 Program *program = mGLState.getProgram();
6159 program->setUniform2iv(location, count, v);
6160}
6161
6162void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6163{
6164 GLfloat xyz[3] = {x, y, z};
6165 Program *program = mGLState.getProgram();
6166 program->setUniform3fv(location, 1, xyz);
6167}
6168
6169void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6170{
6171 Program *program = mGLState.getProgram();
6172 program->setUniform3fv(location, count, v);
6173}
6174
6175void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6176{
6177 GLint xyz[3] = {x, y, z};
6178 Program *program = mGLState.getProgram();
6179 program->setUniform3iv(location, 1, xyz);
6180}
6181
6182void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6183{
6184 Program *program = mGLState.getProgram();
6185 program->setUniform3iv(location, count, v);
6186}
6187
6188void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6189{
6190 GLfloat xyzw[4] = {x, y, z, w};
6191 Program *program = mGLState.getProgram();
6192 program->setUniform4fv(location, 1, xyzw);
6193}
6194
6195void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6196{
6197 Program *program = mGLState.getProgram();
6198 program->setUniform4fv(location, count, v);
6199}
6200
6201void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6202{
6203 GLint xyzw[4] = {x, y, z, w};
6204 Program *program = mGLState.getProgram();
6205 program->setUniform4iv(location, 1, xyzw);
6206}
6207
6208void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6209{
6210 Program *program = mGLState.getProgram();
6211 program->setUniform4iv(location, count, v);
6212}
6213
6214void Context::uniformMatrix2fv(GLint location,
6215 GLsizei count,
6216 GLboolean transpose,
6217 const GLfloat *value)
6218{
6219 Program *program = mGLState.getProgram();
6220 program->setUniformMatrix2fv(location, count, transpose, value);
6221}
6222
6223void Context::uniformMatrix3fv(GLint location,
6224 GLsizei count,
6225 GLboolean transpose,
6226 const GLfloat *value)
6227{
6228 Program *program = mGLState.getProgram();
6229 program->setUniformMatrix3fv(location, count, transpose, value);
6230}
6231
6232void Context::uniformMatrix4fv(GLint location,
6233 GLsizei count,
6234 GLboolean transpose,
6235 const GLfloat *value)
6236{
6237 Program *program = mGLState.getProgram();
6238 program->setUniformMatrix4fv(location, count, transpose, value);
6239}
6240
6241void Context::validateProgram(GLuint program)
6242{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006243 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006244 ASSERT(programObject);
6245 programObject->validate(mCaps);
6246}
6247
Jiajia Qin5451d532017-11-16 17:16:34 +08006248void Context::validateProgramPipeline(GLuint pipeline)
6249{
6250 UNIMPLEMENTED();
6251}
6252
Jamie Madilld04908b2017-06-09 14:15:35 -04006253void Context::getProgramBinary(GLuint program,
6254 GLsizei bufSize,
6255 GLsizei *length,
6256 GLenum *binaryFormat,
6257 void *binary)
6258{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006259 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006260 ASSERT(programObject != nullptr);
6261
6262 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6263}
6264
6265void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6266{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006267 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006268 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006269
Jamie Madilld04908b2017-06-09 14:15:35 -04006270 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006271 if (programObject->isInUse())
6272 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006273 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006274 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006275 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006276}
6277
Jamie Madillff325f12017-08-26 15:06:05 -04006278void Context::uniform1ui(GLint location, GLuint v0)
6279{
6280 Program *program = mGLState.getProgram();
6281 program->setUniform1uiv(location, 1, &v0);
6282}
6283
6284void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6285{
6286 Program *program = mGLState.getProgram();
6287 const GLuint xy[] = {v0, v1};
6288 program->setUniform2uiv(location, 1, xy);
6289}
6290
6291void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6292{
6293 Program *program = mGLState.getProgram();
6294 const GLuint xyz[] = {v0, v1, v2};
6295 program->setUniform3uiv(location, 1, xyz);
6296}
6297
6298void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6299{
6300 Program *program = mGLState.getProgram();
6301 const GLuint xyzw[] = {v0, v1, v2, v3};
6302 program->setUniform4uiv(location, 1, xyzw);
6303}
6304
6305void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6306{
6307 Program *program = mGLState.getProgram();
6308 program->setUniform1uiv(location, count, value);
6309}
6310void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6311{
6312 Program *program = mGLState.getProgram();
6313 program->setUniform2uiv(location, count, value);
6314}
6315
6316void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6317{
6318 Program *program = mGLState.getProgram();
6319 program->setUniform3uiv(location, count, value);
6320}
6321
6322void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6323{
6324 Program *program = mGLState.getProgram();
6325 program->setUniform4uiv(location, count, value);
6326}
6327
Jamie Madillf0e04492017-08-26 15:28:42 -04006328void Context::genQueries(GLsizei n, GLuint *ids)
6329{
6330 for (GLsizei i = 0; i < n; i++)
6331 {
6332 GLuint handle = mQueryHandleAllocator.allocate();
6333 mQueryMap.assign(handle, nullptr);
6334 ids[i] = handle;
6335 }
6336}
6337
6338void Context::deleteQueries(GLsizei n, const GLuint *ids)
6339{
6340 for (int i = 0; i < n; i++)
6341 {
6342 GLuint query = ids[i];
6343
6344 Query *queryObject = nullptr;
6345 if (mQueryMap.erase(query, &queryObject))
6346 {
6347 mQueryHandleAllocator.release(query);
6348 if (queryObject)
6349 {
6350 queryObject->release(this);
6351 }
6352 }
6353 }
6354}
6355
6356GLboolean Context::isQuery(GLuint id)
6357{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006358 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006359}
6360
Jamie Madillc8c95812017-08-26 18:40:09 -04006361void Context::uniformMatrix2x3fv(GLint location,
6362 GLsizei count,
6363 GLboolean transpose,
6364 const GLfloat *value)
6365{
6366 Program *program = mGLState.getProgram();
6367 program->setUniformMatrix2x3fv(location, count, transpose, value);
6368}
6369
6370void Context::uniformMatrix3x2fv(GLint location,
6371 GLsizei count,
6372 GLboolean transpose,
6373 const GLfloat *value)
6374{
6375 Program *program = mGLState.getProgram();
6376 program->setUniformMatrix3x2fv(location, count, transpose, value);
6377}
6378
6379void Context::uniformMatrix2x4fv(GLint location,
6380 GLsizei count,
6381 GLboolean transpose,
6382 const GLfloat *value)
6383{
6384 Program *program = mGLState.getProgram();
6385 program->setUniformMatrix2x4fv(location, count, transpose, value);
6386}
6387
6388void Context::uniformMatrix4x2fv(GLint location,
6389 GLsizei count,
6390 GLboolean transpose,
6391 const GLfloat *value)
6392{
6393 Program *program = mGLState.getProgram();
6394 program->setUniformMatrix4x2fv(location, count, transpose, value);
6395}
6396
6397void Context::uniformMatrix3x4fv(GLint location,
6398 GLsizei count,
6399 GLboolean transpose,
6400 const GLfloat *value)
6401{
6402 Program *program = mGLState.getProgram();
6403 program->setUniformMatrix3x4fv(location, count, transpose, value);
6404}
6405
6406void Context::uniformMatrix4x3fv(GLint location,
6407 GLsizei count,
6408 GLboolean transpose,
6409 const GLfloat *value)
6410{
6411 Program *program = mGLState.getProgram();
6412 program->setUniformMatrix4x3fv(location, count, transpose, value);
6413}
6414
Jamie Madilld7576732017-08-26 18:49:50 -04006415void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6416{
6417 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6418 {
6419 GLuint vertexArray = arrays[arrayIndex];
6420
6421 if (arrays[arrayIndex] != 0)
6422 {
6423 VertexArray *vertexArrayObject = nullptr;
6424 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6425 {
6426 if (vertexArrayObject != nullptr)
6427 {
6428 detachVertexArray(vertexArray);
6429 vertexArrayObject->onDestroy(this);
6430 }
6431
6432 mVertexArrayHandleAllocator.release(vertexArray);
6433 }
6434 }
6435 }
6436}
6437
6438void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6439{
6440 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6441 {
6442 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6443 mVertexArrayMap.assign(vertexArray, nullptr);
6444 arrays[arrayIndex] = vertexArray;
6445 }
6446}
6447
6448bool Context::isVertexArray(GLuint array)
6449{
6450 if (array == 0)
6451 {
6452 return GL_FALSE;
6453 }
6454
6455 VertexArray *vao = getVertexArray(array);
6456 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6457}
6458
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006459void Context::endTransformFeedback()
6460{
6461 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6462 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006463 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006464}
6465
6466void Context::transformFeedbackVaryings(GLuint program,
6467 GLsizei count,
6468 const GLchar *const *varyings,
6469 GLenum bufferMode)
6470{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006471 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006472 ASSERT(programObject);
6473 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6474}
6475
6476void Context::getTransformFeedbackVarying(GLuint program,
6477 GLuint index,
6478 GLsizei bufSize,
6479 GLsizei *length,
6480 GLsizei *size,
6481 GLenum *type,
6482 GLchar *name)
6483{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006484 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006485 ASSERT(programObject);
6486 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6487}
6488
6489void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6490{
6491 for (int i = 0; i < n; i++)
6492 {
6493 GLuint transformFeedback = ids[i];
6494 if (transformFeedback == 0)
6495 {
6496 continue;
6497 }
6498
6499 TransformFeedback *transformFeedbackObject = nullptr;
6500 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6501 {
6502 if (transformFeedbackObject != nullptr)
6503 {
6504 detachTransformFeedback(transformFeedback);
6505 transformFeedbackObject->release(this);
6506 }
6507
6508 mTransformFeedbackHandleAllocator.release(transformFeedback);
6509 }
6510 }
6511}
6512
6513void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6514{
6515 for (int i = 0; i < n; i++)
6516 {
6517 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6518 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6519 ids[i] = transformFeedback;
6520 }
6521}
6522
6523bool Context::isTransformFeedback(GLuint id)
6524{
6525 if (id == 0)
6526 {
6527 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6528 // returns FALSE
6529 return GL_FALSE;
6530 }
6531
6532 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6533 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6534}
6535
6536void Context::pauseTransformFeedback()
6537{
6538 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6539 transformFeedback->pause();
6540}
6541
6542void Context::resumeTransformFeedback()
6543{
6544 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6545 transformFeedback->resume();
6546}
6547
Jamie Madill12e957f2017-08-26 21:42:26 -04006548void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6549{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006550 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006551 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006552}
6553
Brandon Jones59770802018-04-02 13:18:42 -07006554void Context::getUniformuivRobust(GLuint program,
6555 GLint location,
6556 GLsizei bufSize,
6557 GLsizei *length,
6558 GLuint *params)
6559{
6560 getUniformuiv(program, location, params);
6561}
6562
Jamie Madill12e957f2017-08-26 21:42:26 -04006563GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6564{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006565 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006566 return programObject->getFragDataLocation(name);
6567}
6568
6569void Context::getUniformIndices(GLuint program,
6570 GLsizei uniformCount,
6571 const GLchar *const *uniformNames,
6572 GLuint *uniformIndices)
6573{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006574 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006575 if (!programObject->isLinked())
6576 {
6577 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6578 {
6579 uniformIndices[uniformId] = GL_INVALID_INDEX;
6580 }
6581 }
6582 else
6583 {
6584 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6585 {
6586 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6587 }
6588 }
6589}
6590
6591void Context::getActiveUniformsiv(GLuint program,
6592 GLsizei uniformCount,
6593 const GLuint *uniformIndices,
6594 GLenum pname,
6595 GLint *params)
6596{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006597 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006598 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6599 {
6600 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006601 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006602 }
6603}
6604
6605GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6606{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006607 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006608 return programObject->getUniformBlockIndex(uniformBlockName);
6609}
6610
6611void Context::getActiveUniformBlockiv(GLuint program,
6612 GLuint uniformBlockIndex,
6613 GLenum pname,
6614 GLint *params)
6615{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006616 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006617 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6618}
6619
Brandon Jones59770802018-04-02 13:18:42 -07006620void Context::getActiveUniformBlockivRobust(GLuint program,
6621 GLuint uniformBlockIndex,
6622 GLenum pname,
6623 GLsizei bufSize,
6624 GLsizei *length,
6625 GLint *params)
6626{
6627 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6628}
6629
Jamie Madill12e957f2017-08-26 21:42:26 -04006630void Context::getActiveUniformBlockName(GLuint program,
6631 GLuint uniformBlockIndex,
6632 GLsizei bufSize,
6633 GLsizei *length,
6634 GLchar *uniformBlockName)
6635{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006636 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006637 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6638}
6639
6640void Context::uniformBlockBinding(GLuint program,
6641 GLuint uniformBlockIndex,
6642 GLuint uniformBlockBinding)
6643{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006644 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006645 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006646
Jamie Madill956ab4d2018-10-10 16:13:03 -04006647 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006648 if (programObject->isInUse())
6649 {
6650 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006651 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006652 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006653}
6654
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006655GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6656{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006657 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6658 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006659
Jamie Madill70b5bb02017-08-28 13:32:37 -04006660 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006661 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006662 if (error.isError())
6663 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006664 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006665 handleError(error);
6666 return nullptr;
6667 }
6668
Jamie Madill70b5bb02017-08-28 13:32:37 -04006669 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006670}
6671
6672GLboolean Context::isSync(GLsync sync)
6673{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006674 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006675}
6676
6677GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6678{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006679 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006680
6681 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006682 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006683 return result;
6684}
6685
6686void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6687{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006688 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006689 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006690}
6691
6692void Context::getInteger64v(GLenum pname, GLint64 *params)
6693{
6694 GLenum nativeType = GL_NONE;
6695 unsigned int numParams = 0;
6696 getQueryParameterInfo(pname, &nativeType, &numParams);
6697
6698 if (nativeType == GL_INT_64_ANGLEX)
6699 {
6700 getInteger64vImpl(pname, params);
6701 }
6702 else
6703 {
6704 CastStateValues(this, nativeType, pname, numParams, params);
6705 }
6706}
6707
Brandon Jones59770802018-04-02 13:18:42 -07006708void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6709{
6710 getInteger64v(pname, data);
6711}
6712
Corentin Wallez336129f2017-10-17 15:55:40 -04006713void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006714{
6715 Buffer *buffer = mGLState.getTargetBuffer(target);
6716 QueryBufferParameteri64v(buffer, pname, params);
6717}
6718
Brandon Jones59770802018-04-02 13:18:42 -07006719void Context::getBufferParameteri64vRobust(BufferBinding target,
6720 GLenum pname,
6721 GLsizei bufSize,
6722 GLsizei *length,
6723 GLint64 *params)
6724{
6725 getBufferParameteri64v(target, pname, params);
6726}
6727
Jamie Madill3ef140a2017-08-26 23:11:21 -04006728void Context::genSamplers(GLsizei count, GLuint *samplers)
6729{
6730 for (int i = 0; i < count; i++)
6731 {
6732 samplers[i] = mState.mSamplers->createSampler();
6733 }
6734}
6735
6736void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6737{
6738 for (int i = 0; i < count; i++)
6739 {
6740 GLuint sampler = samplers[i];
6741
6742 if (mState.mSamplers->getSampler(sampler))
6743 {
6744 detachSampler(sampler);
6745 }
6746
6747 mState.mSamplers->deleteObject(this, sampler);
6748 }
6749}
6750
6751void Context::getInternalformativ(GLenum target,
6752 GLenum internalformat,
6753 GLenum pname,
6754 GLsizei bufSize,
6755 GLint *params)
6756{
6757 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6758 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6759}
6760
Brandon Jones59770802018-04-02 13:18:42 -07006761void Context::getInternalformativRobust(GLenum target,
6762 GLenum internalformat,
6763 GLenum pname,
6764 GLsizei bufSize,
6765 GLsizei *length,
6766 GLint *params)
6767{
6768 getInternalformativ(target, internalformat, pname, bufSize, params);
6769}
6770
Jiajia Qin5451d532017-11-16 17:16:34 +08006771void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6772{
6773 programUniform1iv(program, location, 1, &v0);
6774}
6775
6776void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6777{
6778 GLint xy[2] = {v0, v1};
6779 programUniform2iv(program, location, 1, xy);
6780}
6781
6782void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6783{
6784 GLint xyz[3] = {v0, v1, v2};
6785 programUniform3iv(program, location, 1, xyz);
6786}
6787
6788void Context::programUniform4i(GLuint program,
6789 GLint location,
6790 GLint v0,
6791 GLint v1,
6792 GLint v2,
6793 GLint v3)
6794{
6795 GLint xyzw[4] = {v0, v1, v2, v3};
6796 programUniform4iv(program, location, 1, xyzw);
6797}
6798
6799void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6800{
6801 programUniform1uiv(program, location, 1, &v0);
6802}
6803
6804void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6805{
6806 GLuint xy[2] = {v0, v1};
6807 programUniform2uiv(program, location, 1, xy);
6808}
6809
6810void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6811{
6812 GLuint xyz[3] = {v0, v1, v2};
6813 programUniform3uiv(program, location, 1, xyz);
6814}
6815
6816void Context::programUniform4ui(GLuint program,
6817 GLint location,
6818 GLuint v0,
6819 GLuint v1,
6820 GLuint v2,
6821 GLuint v3)
6822{
6823 GLuint xyzw[4] = {v0, v1, v2, v3};
6824 programUniform4uiv(program, location, 1, xyzw);
6825}
6826
6827void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6828{
6829 programUniform1fv(program, location, 1, &v0);
6830}
6831
6832void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6833{
6834 GLfloat xy[2] = {v0, v1};
6835 programUniform2fv(program, location, 1, xy);
6836}
6837
6838void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6839{
6840 GLfloat xyz[3] = {v0, v1, v2};
6841 programUniform3fv(program, location, 1, xyz);
6842}
6843
6844void Context::programUniform4f(GLuint program,
6845 GLint location,
6846 GLfloat v0,
6847 GLfloat v1,
6848 GLfloat v2,
6849 GLfloat v3)
6850{
6851 GLfloat xyzw[4] = {v0, v1, v2, v3};
6852 programUniform4fv(program, location, 1, xyzw);
6853}
6854
Jamie Madill81c2e252017-09-09 23:32:46 -04006855void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6856{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006857 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006858 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006859 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006860}
6861
Jiajia Qin5451d532017-11-16 17:16:34 +08006862void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6863{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006864 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006865 ASSERT(programObject);
6866 programObject->setUniform2iv(location, count, value);
6867}
6868
6869void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6870{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006871 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006872 ASSERT(programObject);
6873 programObject->setUniform3iv(location, count, value);
6874}
6875
6876void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6877{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006878 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006879 ASSERT(programObject);
6880 programObject->setUniform4iv(location, count, value);
6881}
6882
6883void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6884{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006885 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006886 ASSERT(programObject);
6887 programObject->setUniform1uiv(location, count, value);
6888}
6889
6890void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6891{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006892 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006893 ASSERT(programObject);
6894 programObject->setUniform2uiv(location, count, value);
6895}
6896
6897void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6898{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006899 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006900 ASSERT(programObject);
6901 programObject->setUniform3uiv(location, count, value);
6902}
6903
6904void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6905{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006906 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006907 ASSERT(programObject);
6908 programObject->setUniform4uiv(location, count, value);
6909}
6910
6911void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6912{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006913 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006914 ASSERT(programObject);
6915 programObject->setUniform1fv(location, count, value);
6916}
6917
6918void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6919{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006920 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006921 ASSERT(programObject);
6922 programObject->setUniform2fv(location, count, value);
6923}
6924
6925void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6926{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006927 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006928 ASSERT(programObject);
6929 programObject->setUniform3fv(location, count, value);
6930}
6931
6932void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6933{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006934 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006935 ASSERT(programObject);
6936 programObject->setUniform4fv(location, count, value);
6937}
6938
6939void Context::programUniformMatrix2fv(GLuint program,
6940 GLint location,
6941 GLsizei count,
6942 GLboolean transpose,
6943 const GLfloat *value)
6944{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006945 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006946 ASSERT(programObject);
6947 programObject->setUniformMatrix2fv(location, count, transpose, value);
6948}
6949
6950void Context::programUniformMatrix3fv(GLuint program,
6951 GLint location,
6952 GLsizei count,
6953 GLboolean transpose,
6954 const GLfloat *value)
6955{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006956 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006957 ASSERT(programObject);
6958 programObject->setUniformMatrix3fv(location, count, transpose, value);
6959}
6960
6961void Context::programUniformMatrix4fv(GLuint program,
6962 GLint location,
6963 GLsizei count,
6964 GLboolean transpose,
6965 const GLfloat *value)
6966{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006967 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006968 ASSERT(programObject);
6969 programObject->setUniformMatrix4fv(location, count, transpose, value);
6970}
6971
6972void Context::programUniformMatrix2x3fv(GLuint program,
6973 GLint location,
6974 GLsizei count,
6975 GLboolean transpose,
6976 const GLfloat *value)
6977{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006978 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006979 ASSERT(programObject);
6980 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6981}
6982
6983void Context::programUniformMatrix3x2fv(GLuint program,
6984 GLint location,
6985 GLsizei count,
6986 GLboolean transpose,
6987 const GLfloat *value)
6988{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006989 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006990 ASSERT(programObject);
6991 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6992}
6993
6994void Context::programUniformMatrix2x4fv(GLuint program,
6995 GLint location,
6996 GLsizei count,
6997 GLboolean transpose,
6998 const GLfloat *value)
6999{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007000 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007001 ASSERT(programObject);
7002 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
7003}
7004
7005void Context::programUniformMatrix4x2fv(GLuint program,
7006 GLint location,
7007 GLsizei count,
7008 GLboolean transpose,
7009 const GLfloat *value)
7010{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007011 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007012 ASSERT(programObject);
7013 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
7014}
7015
7016void Context::programUniformMatrix3x4fv(GLuint program,
7017 GLint location,
7018 GLsizei count,
7019 GLboolean transpose,
7020 const GLfloat *value)
7021{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007022 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007023 ASSERT(programObject);
7024 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
7025}
7026
7027void Context::programUniformMatrix4x3fv(GLuint program,
7028 GLint location,
7029 GLsizei count,
7030 GLboolean transpose,
7031 const GLfloat *value)
7032{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007033 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007034 ASSERT(programObject);
7035 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
7036}
7037
Jamie Madill81c2e252017-09-09 23:32:46 -04007038void Context::onTextureChange(const Texture *texture)
7039{
7040 // Conservatively assume all textures are dirty.
7041 // TODO(jmadill): More fine-grained update.
7042 mGLState.setObjectDirty(GL_TEXTURE);
7043}
7044
James Darpiniane8a93c62018-01-04 18:02:24 -08007045bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
7046{
7047 return mGLState.isCurrentTransformFeedback(tf);
7048}
James Darpiniane8a93c62018-01-04 18:02:24 -08007049
Yunchao Hea336b902017-08-02 16:05:21 +08007050void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
7051{
7052 for (int i = 0; i < count; i++)
7053 {
7054 pipelines[i] = createProgramPipeline();
7055 }
7056}
7057
7058void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
7059{
7060 for (int i = 0; i < count; i++)
7061 {
7062 if (pipelines[i] != 0)
7063 {
7064 deleteProgramPipeline(pipelines[i]);
7065 }
7066 }
7067}
7068
7069GLboolean Context::isProgramPipeline(GLuint pipeline)
7070{
7071 if (pipeline == 0)
7072 {
7073 return GL_FALSE;
7074 }
7075
7076 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
7077}
7078
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007079void Context::finishFenceNV(GLuint fence)
7080{
7081 FenceNV *fenceObject = getFenceNV(fence);
7082
7083 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04007084 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007085}
7086
7087void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
7088{
7089 FenceNV *fenceObject = getFenceNV(fence);
7090
7091 ASSERT(fenceObject && fenceObject->isSet());
7092
7093 switch (pname)
7094 {
7095 case GL_FENCE_STATUS_NV:
7096 {
7097 // GL_NV_fence spec:
7098 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
7099 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
7100 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
7101 GLboolean status = GL_TRUE;
7102 if (fenceObject->getStatus() != GL_TRUE)
7103 {
Jamie Madilla0691b72018-07-25 10:41:22 -04007104 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007105 }
7106 *params = status;
7107 break;
7108 }
7109
7110 case GL_FENCE_CONDITION_NV:
7111 {
7112 *params = static_cast<GLint>(fenceObject->getCondition());
7113 break;
7114 }
7115
7116 default:
7117 UNREACHABLE();
7118 }
7119}
7120
7121void Context::getTranslatedShaderSource(GLuint shader,
7122 GLsizei bufsize,
7123 GLsizei *length,
7124 GLchar *source)
7125{
7126 Shader *shaderObject = getShader(shader);
7127 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08007128 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007129}
7130
7131void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
7132{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007133 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007134 ASSERT(programObject);
7135
7136 programObject->getUniformfv(this, location, params);
7137}
7138
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007139void Context::getnUniformfvRobust(GLuint program,
7140 GLint location,
7141 GLsizei bufSize,
7142 GLsizei *length,
7143 GLfloat *params)
7144{
7145 UNIMPLEMENTED();
7146}
7147
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007148void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
7149{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007150 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007151 ASSERT(programObject);
7152
7153 programObject->getUniformiv(this, location, params);
7154}
7155
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007156void Context::getnUniformivRobust(GLuint program,
7157 GLint location,
7158 GLsizei bufSize,
7159 GLsizei *length,
7160 GLint *params)
7161{
7162 UNIMPLEMENTED();
7163}
7164
7165void Context::getnUniformuivRobust(GLuint program,
7166 GLint location,
7167 GLsizei bufSize,
7168 GLsizei *length,
7169 GLuint *params)
7170{
7171 UNIMPLEMENTED();
7172}
7173
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007174GLboolean Context::isFenceNV(GLuint fence)
7175{
7176 FenceNV *fenceObject = getFenceNV(fence);
7177
7178 if (fenceObject == nullptr)
7179 {
7180 return GL_FALSE;
7181 }
7182
7183 // GL_NV_fence spec:
7184 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7185 // existing fence.
7186 return fenceObject->isSet();
7187}
7188
7189void Context::readnPixels(GLint x,
7190 GLint y,
7191 GLsizei width,
7192 GLsizei height,
7193 GLenum format,
7194 GLenum type,
7195 GLsizei bufSize,
7196 void *data)
7197{
7198 return readPixels(x, y, width, height, format, type, data);
7199}
7200
Jamie Madill007530e2017-12-28 14:27:04 -05007201void Context::setFenceNV(GLuint fence, GLenum condition)
7202{
7203 ASSERT(condition == GL_ALL_COMPLETED_NV);
7204
7205 FenceNV *fenceObject = getFenceNV(fence);
7206 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04007207 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007208}
7209
7210GLboolean Context::testFenceNV(GLuint fence)
7211{
7212 FenceNV *fenceObject = getFenceNV(fence);
7213
7214 ASSERT(fenceObject != nullptr);
7215 ASSERT(fenceObject->isSet() == GL_TRUE);
7216
7217 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007218 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007219 if (error.isError())
7220 {
7221 handleError(error);
7222 return GL_TRUE;
7223 }
7224
7225 return result;
7226}
7227
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007228void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007229{
7230 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007231 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007232 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007233}
7234
Jamie Madillfa920eb2018-01-04 11:45:50 -05007235void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007236{
7237 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007238 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007239 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7240}
7241
Jamie Madillfa920eb2018-01-04 11:45:50 -05007242void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7243{
7244 UNIMPLEMENTED();
7245}
7246
Jamie Madill5b772312018-03-08 20:28:32 -05007247bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7248{
7249 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7250 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7251 // to the fact that it is stored internally as a float, and so would require conversion
7252 // if returned from Context::getIntegerv. Since this conversion is already implemented
7253 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7254 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7255 // application.
7256 switch (pname)
7257 {
7258 case GL_COMPRESSED_TEXTURE_FORMATS:
7259 {
7260 *type = GL_INT;
7261 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7262 return true;
7263 }
7264 case GL_SHADER_BINARY_FORMATS:
7265 {
7266 *type = GL_INT;
7267 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7268 return true;
7269 }
7270
7271 case GL_MAX_VERTEX_ATTRIBS:
7272 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7273 case GL_MAX_VARYING_VECTORS:
7274 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7275 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7276 case GL_MAX_TEXTURE_IMAGE_UNITS:
7277 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7278 case GL_MAX_RENDERBUFFER_SIZE:
7279 case GL_NUM_SHADER_BINARY_FORMATS:
7280 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7281 case GL_ARRAY_BUFFER_BINDING:
7282 case GL_FRAMEBUFFER_BINDING:
7283 case GL_RENDERBUFFER_BINDING:
7284 case GL_CURRENT_PROGRAM:
7285 case GL_PACK_ALIGNMENT:
7286 case GL_UNPACK_ALIGNMENT:
7287 case GL_GENERATE_MIPMAP_HINT:
7288 case GL_RED_BITS:
7289 case GL_GREEN_BITS:
7290 case GL_BLUE_BITS:
7291 case GL_ALPHA_BITS:
7292 case GL_DEPTH_BITS:
7293 case GL_STENCIL_BITS:
7294 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7295 case GL_CULL_FACE_MODE:
7296 case GL_FRONT_FACE:
7297 case GL_ACTIVE_TEXTURE:
7298 case GL_STENCIL_FUNC:
7299 case GL_STENCIL_VALUE_MASK:
7300 case GL_STENCIL_REF:
7301 case GL_STENCIL_FAIL:
7302 case GL_STENCIL_PASS_DEPTH_FAIL:
7303 case GL_STENCIL_PASS_DEPTH_PASS:
7304 case GL_STENCIL_BACK_FUNC:
7305 case GL_STENCIL_BACK_VALUE_MASK:
7306 case GL_STENCIL_BACK_REF:
7307 case GL_STENCIL_BACK_FAIL:
7308 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7309 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7310 case GL_DEPTH_FUNC:
7311 case GL_BLEND_SRC_RGB:
7312 case GL_BLEND_SRC_ALPHA:
7313 case GL_BLEND_DST_RGB:
7314 case GL_BLEND_DST_ALPHA:
7315 case GL_BLEND_EQUATION_RGB:
7316 case GL_BLEND_EQUATION_ALPHA:
7317 case GL_STENCIL_WRITEMASK:
7318 case GL_STENCIL_BACK_WRITEMASK:
7319 case GL_STENCIL_CLEAR_VALUE:
7320 case GL_SUBPIXEL_BITS:
7321 case GL_MAX_TEXTURE_SIZE:
7322 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7323 case GL_SAMPLE_BUFFERS:
7324 case GL_SAMPLES:
7325 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7326 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7327 case GL_TEXTURE_BINDING_2D:
7328 case GL_TEXTURE_BINDING_CUBE_MAP:
7329 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7330 {
7331 *type = GL_INT;
7332 *numParams = 1;
7333 return true;
7334 }
7335 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7336 {
7337 if (!getExtensions().packReverseRowOrder)
7338 {
7339 return false;
7340 }
7341 *type = GL_INT;
7342 *numParams = 1;
7343 return true;
7344 }
7345 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7346 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7347 {
7348 if (!getExtensions().textureRectangle)
7349 {
7350 return false;
7351 }
7352 *type = GL_INT;
7353 *numParams = 1;
7354 return true;
7355 }
7356 case GL_MAX_DRAW_BUFFERS_EXT:
7357 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7358 {
7359 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7360 {
7361 return false;
7362 }
7363 *type = GL_INT;
7364 *numParams = 1;
7365 return true;
7366 }
7367 case GL_MAX_VIEWPORT_DIMS:
7368 {
7369 *type = GL_INT;
7370 *numParams = 2;
7371 return true;
7372 }
7373 case GL_VIEWPORT:
7374 case GL_SCISSOR_BOX:
7375 {
7376 *type = GL_INT;
7377 *numParams = 4;
7378 return true;
7379 }
7380 case GL_SHADER_COMPILER:
7381 case GL_SAMPLE_COVERAGE_INVERT:
7382 case GL_DEPTH_WRITEMASK:
7383 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7384 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7385 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7386 // bool-natural
7387 case GL_SAMPLE_COVERAGE:
7388 case GL_SCISSOR_TEST:
7389 case GL_STENCIL_TEST:
7390 case GL_DEPTH_TEST:
7391 case GL_BLEND:
7392 case GL_DITHER:
7393 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7394 {
7395 *type = GL_BOOL;
7396 *numParams = 1;
7397 return true;
7398 }
7399 case GL_COLOR_WRITEMASK:
7400 {
7401 *type = GL_BOOL;
7402 *numParams = 4;
7403 return true;
7404 }
7405 case GL_POLYGON_OFFSET_FACTOR:
7406 case GL_POLYGON_OFFSET_UNITS:
7407 case GL_SAMPLE_COVERAGE_VALUE:
7408 case GL_DEPTH_CLEAR_VALUE:
7409 case GL_LINE_WIDTH:
7410 {
7411 *type = GL_FLOAT;
7412 *numParams = 1;
7413 return true;
7414 }
7415 case GL_ALIASED_LINE_WIDTH_RANGE:
7416 case GL_ALIASED_POINT_SIZE_RANGE:
7417 case GL_DEPTH_RANGE:
7418 {
7419 *type = GL_FLOAT;
7420 *numParams = 2;
7421 return true;
7422 }
7423 case GL_COLOR_CLEAR_VALUE:
7424 case GL_BLEND_COLOR:
7425 {
7426 *type = GL_FLOAT;
7427 *numParams = 4;
7428 return true;
7429 }
7430 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7431 if (!getExtensions().textureFilterAnisotropic)
7432 {
7433 return false;
7434 }
7435 *type = GL_FLOAT;
7436 *numParams = 1;
7437 return true;
7438 case GL_TIMESTAMP_EXT:
7439 if (!getExtensions().disjointTimerQuery)
7440 {
7441 return false;
7442 }
7443 *type = GL_INT_64_ANGLEX;
7444 *numParams = 1;
7445 return true;
7446 case GL_GPU_DISJOINT_EXT:
7447 if (!getExtensions().disjointTimerQuery)
7448 {
7449 return false;
7450 }
7451 *type = GL_INT;
7452 *numParams = 1;
7453 return true;
7454 case GL_COVERAGE_MODULATION_CHROMIUM:
7455 if (!getExtensions().framebufferMixedSamples)
7456 {
7457 return false;
7458 }
7459 *type = GL_INT;
7460 *numParams = 1;
7461 return true;
7462 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7463 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7464 {
7465 return false;
7466 }
7467 *type = GL_INT;
7468 *numParams = 1;
7469 return true;
7470 }
7471
7472 if (getExtensions().debug)
7473 {
7474 switch (pname)
7475 {
7476 case GL_DEBUG_LOGGED_MESSAGES:
7477 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7478 case GL_DEBUG_GROUP_STACK_DEPTH:
7479 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7480 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7481 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7482 case GL_MAX_LABEL_LENGTH:
7483 *type = GL_INT;
7484 *numParams = 1;
7485 return true;
7486
7487 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7488 case GL_DEBUG_OUTPUT:
7489 *type = GL_BOOL;
7490 *numParams = 1;
7491 return true;
7492 }
7493 }
7494
7495 if (getExtensions().multisampleCompatibility)
7496 {
7497 switch (pname)
7498 {
7499 case GL_MULTISAMPLE_EXT:
7500 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7501 *type = GL_BOOL;
7502 *numParams = 1;
7503 return true;
7504 }
7505 }
7506
7507 if (getExtensions().pathRendering)
7508 {
7509 switch (pname)
7510 {
7511 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7512 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7513 *type = GL_FLOAT;
7514 *numParams = 16;
7515 return true;
7516 }
7517 }
7518
7519 if (getExtensions().bindGeneratesResource)
7520 {
7521 switch (pname)
7522 {
7523 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7524 *type = GL_BOOL;
7525 *numParams = 1;
7526 return true;
7527 }
7528 }
7529
7530 if (getExtensions().clientArrays)
7531 {
7532 switch (pname)
7533 {
7534 case GL_CLIENT_ARRAYS_ANGLE:
7535 *type = GL_BOOL;
7536 *numParams = 1;
7537 return true;
7538 }
7539 }
7540
7541 if (getExtensions().sRGBWriteControl)
7542 {
7543 switch (pname)
7544 {
7545 case GL_FRAMEBUFFER_SRGB_EXT:
7546 *type = GL_BOOL;
7547 *numParams = 1;
7548 return true;
7549 }
7550 }
7551
7552 if (getExtensions().robustResourceInitialization &&
7553 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7554 {
7555 *type = GL_BOOL;
7556 *numParams = 1;
7557 return true;
7558 }
7559
7560 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7561 {
7562 *type = GL_BOOL;
7563 *numParams = 1;
7564 return true;
7565 }
7566
jchen1082af6202018-06-22 10:59:52 +08007567 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7568 {
7569 *type = GL_INT;
7570 *numParams = 1;
7571 return true;
7572 }
7573
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007574 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7575 {
7576 *type = GL_INT;
7577 *numParams = 1;
7578 return true;
7579 }
7580
Jamie Madill5b772312018-03-08 20:28:32 -05007581 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7582 switch (pname)
7583 {
7584 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7585 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7586 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7587 {
7588 return false;
7589 }
7590 *type = GL_INT;
7591 *numParams = 1;
7592 return true;
7593
7594 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7595 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7596 {
7597 return false;
7598 }
7599 *type = GL_INT;
7600 *numParams = 1;
7601 return true;
7602
7603 case GL_PROGRAM_BINARY_FORMATS_OES:
7604 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7605 {
7606 return false;
7607 }
7608 *type = GL_INT;
7609 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7610 return true;
7611
7612 case GL_PACK_ROW_LENGTH:
7613 case GL_PACK_SKIP_ROWS:
7614 case GL_PACK_SKIP_PIXELS:
7615 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7616 {
7617 return false;
7618 }
7619 *type = GL_INT;
7620 *numParams = 1;
7621 return true;
7622 case GL_UNPACK_ROW_LENGTH:
7623 case GL_UNPACK_SKIP_ROWS:
7624 case GL_UNPACK_SKIP_PIXELS:
7625 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7626 {
7627 return false;
7628 }
7629 *type = GL_INT;
7630 *numParams = 1;
7631 return true;
7632 case GL_VERTEX_ARRAY_BINDING:
7633 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7634 {
7635 return false;
7636 }
7637 *type = GL_INT;
7638 *numParams = 1;
7639 return true;
7640 case GL_PIXEL_PACK_BUFFER_BINDING:
7641 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7642 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7643 {
7644 return false;
7645 }
7646 *type = GL_INT;
7647 *numParams = 1;
7648 return true;
7649 case GL_MAX_SAMPLES:
7650 {
7651 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7652 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7653 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7654 {
7655 return false;
7656 }
7657 *type = GL_INT;
7658 *numParams = 1;
7659 return true;
7660
7661 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7662 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7663 {
7664 return false;
7665 }
7666 *type = GL_INT;
7667 *numParams = 1;
7668 return true;
7669 }
7670 }
7671
7672 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7673 {
7674 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7675 {
7676 return false;
7677 }
7678 *type = GL_INT;
7679 *numParams = 1;
7680 return true;
7681 }
7682
7683 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7684 {
7685 *type = GL_INT;
7686 *numParams = 1;
7687 return true;
7688 }
7689
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007690 if (getClientVersion() < Version(2, 0))
7691 {
7692 switch (pname)
7693 {
7694 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007695 case GL_CLIENT_ACTIVE_TEXTURE:
7696 case GL_MATRIX_MODE:
7697 case GL_MAX_TEXTURE_UNITS:
7698 case GL_MAX_MODELVIEW_STACK_DEPTH:
7699 case GL_MAX_PROJECTION_STACK_DEPTH:
7700 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007701 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007702 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007703 case GL_VERTEX_ARRAY_STRIDE:
7704 case GL_NORMAL_ARRAY_STRIDE:
7705 case GL_COLOR_ARRAY_STRIDE:
7706 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7707 case GL_VERTEX_ARRAY_SIZE:
7708 case GL_COLOR_ARRAY_SIZE:
7709 case GL_TEXTURE_COORD_ARRAY_SIZE:
7710 case GL_VERTEX_ARRAY_TYPE:
7711 case GL_NORMAL_ARRAY_TYPE:
7712 case GL_COLOR_ARRAY_TYPE:
7713 case GL_TEXTURE_COORD_ARRAY_TYPE:
7714 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7715 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7716 case GL_COLOR_ARRAY_BUFFER_BINDING:
7717 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7718 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7719 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7720 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007721 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007722 case GL_MODELVIEW_STACK_DEPTH:
7723 case GL_PROJECTION_STACK_DEPTH:
7724 case GL_TEXTURE_STACK_DEPTH:
7725 case GL_LOGIC_OP_MODE:
7726 case GL_BLEND_SRC:
7727 case GL_BLEND_DST:
7728 case GL_PERSPECTIVE_CORRECTION_HINT:
7729 case GL_POINT_SMOOTH_HINT:
7730 case GL_LINE_SMOOTH_HINT:
7731 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007732 *type = GL_INT;
7733 *numParams = 1;
7734 return true;
7735 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007736 case GL_FOG_DENSITY:
7737 case GL_FOG_START:
7738 case GL_FOG_END:
7739 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007740 case GL_POINT_SIZE:
7741 case GL_POINT_SIZE_MIN:
7742 case GL_POINT_SIZE_MAX:
7743 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007744 *type = GL_FLOAT;
7745 *numParams = 1;
7746 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007747 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007748 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007749 *type = GL_FLOAT;
7750 *numParams = 2;
7751 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007752 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007753 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007754 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007755 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007756 *type = GL_FLOAT;
7757 *numParams = 4;
7758 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007759 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007760 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007761 *type = GL_FLOAT;
7762 *numParams = 3;
7763 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007764 case GL_MODELVIEW_MATRIX:
7765 case GL_PROJECTION_MATRIX:
7766 case GL_TEXTURE_MATRIX:
7767 *type = GL_FLOAT;
7768 *numParams = 16;
7769 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007770 case GL_LIGHT_MODEL_TWO_SIDE:
7771 *type = GL_BOOL;
7772 *numParams = 1;
7773 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007774 }
7775 }
7776
Jamie Madill5b772312018-03-08 20:28:32 -05007777 if (getClientVersion() < Version(3, 0))
7778 {
7779 return false;
7780 }
7781
7782 // Check for ES3.0+ parameter names
7783 switch (pname)
7784 {
7785 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7786 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7787 case GL_UNIFORM_BUFFER_BINDING:
7788 case GL_TRANSFORM_FEEDBACK_BINDING:
7789 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7790 case GL_COPY_READ_BUFFER_BINDING:
7791 case GL_COPY_WRITE_BUFFER_BINDING:
7792 case GL_SAMPLER_BINDING:
7793 case GL_READ_BUFFER:
7794 case GL_TEXTURE_BINDING_3D:
7795 case GL_TEXTURE_BINDING_2D_ARRAY:
7796 case GL_MAX_3D_TEXTURE_SIZE:
7797 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7798 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7799 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7800 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7801 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7802 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7803 case GL_MAX_VARYING_COMPONENTS:
7804 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7805 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7806 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7807 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7808 case GL_NUM_EXTENSIONS:
7809 case GL_MAJOR_VERSION:
7810 case GL_MINOR_VERSION:
7811 case GL_MAX_ELEMENTS_INDICES:
7812 case GL_MAX_ELEMENTS_VERTICES:
7813 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7814 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7815 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7816 case GL_UNPACK_IMAGE_HEIGHT:
7817 case GL_UNPACK_SKIP_IMAGES:
7818 {
7819 *type = GL_INT;
7820 *numParams = 1;
7821 return true;
7822 }
7823
7824 case GL_MAX_ELEMENT_INDEX:
7825 case GL_MAX_UNIFORM_BLOCK_SIZE:
7826 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7827 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7828 case GL_MAX_SERVER_WAIT_TIMEOUT:
7829 {
7830 *type = GL_INT_64_ANGLEX;
7831 *numParams = 1;
7832 return true;
7833 }
7834
7835 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7836 case GL_TRANSFORM_FEEDBACK_PAUSED:
7837 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7838 case GL_RASTERIZER_DISCARD:
7839 {
7840 *type = GL_BOOL;
7841 *numParams = 1;
7842 return true;
7843 }
7844
7845 case GL_MAX_TEXTURE_LOD_BIAS:
7846 {
7847 *type = GL_FLOAT;
7848 *numParams = 1;
7849 return true;
7850 }
7851 }
7852
7853 if (getExtensions().requestExtension)
7854 {
7855 switch (pname)
7856 {
7857 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7858 *type = GL_INT;
7859 *numParams = 1;
7860 return true;
7861 }
7862 }
7863
Yizhou Jiang7818a852018-09-06 15:02:04 +08007864 if (getExtensions().textureMultisample)
7865 {
7866 switch (pname)
7867 {
7868 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7869 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7870 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7871 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
7872 *type = GL_INT;
7873 *numParams = 1;
7874 return true;
7875 }
7876 }
7877
Jamie Madill5b772312018-03-08 20:28:32 -05007878 if (getClientVersion() < Version(3, 1))
7879 {
7880 return false;
7881 }
7882
7883 switch (pname)
7884 {
7885 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7886 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7887 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7888 case GL_MAX_FRAMEBUFFER_WIDTH:
7889 case GL_MAX_FRAMEBUFFER_HEIGHT:
7890 case GL_MAX_FRAMEBUFFER_SAMPLES:
7891 case GL_MAX_SAMPLE_MASK_WORDS:
7892 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7893 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7894 case GL_MAX_INTEGER_SAMPLES:
7895 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7896 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7897 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7898 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7899 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7900 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7901 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7902 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7903 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7904 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7905 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7906 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7907 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7908 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7909 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7910 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7911 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7912 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7913 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7914 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7915 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7916 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7917 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7918 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7919 case GL_MAX_UNIFORM_LOCATIONS:
7920 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7921 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7922 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7923 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7924 case GL_MAX_IMAGE_UNITS:
7925 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7926 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7927 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7928 case GL_SHADER_STORAGE_BUFFER_BINDING:
7929 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7930 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007931 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007932 *type = GL_INT;
7933 *numParams = 1;
7934 return true;
7935 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7936 *type = GL_INT_64_ANGLEX;
7937 *numParams = 1;
7938 return true;
7939 case GL_SAMPLE_MASK:
7940 *type = GL_BOOL;
7941 *numParams = 1;
7942 return true;
7943 }
7944
7945 if (getExtensions().geometryShader)
7946 {
7947 switch (pname)
7948 {
7949 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7950 case GL_LAYER_PROVOKING_VERTEX_EXT:
7951 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7952 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7953 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7954 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7955 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7956 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7957 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7958 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7959 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7960 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7961 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7962 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7963 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7964 *type = GL_INT;
7965 *numParams = 1;
7966 return true;
7967 }
7968 }
7969
7970 return false;
7971}
7972
7973bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7974{
7975 if (getClientVersion() < Version(3, 0))
7976 {
7977 return false;
7978 }
7979
7980 switch (target)
7981 {
7982 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7983 case GL_UNIFORM_BUFFER_BINDING:
7984 {
7985 *type = GL_INT;
7986 *numParams = 1;
7987 return true;
7988 }
7989 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7990 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7991 case GL_UNIFORM_BUFFER_START:
7992 case GL_UNIFORM_BUFFER_SIZE:
7993 {
7994 *type = GL_INT_64_ANGLEX;
7995 *numParams = 1;
7996 return true;
7997 }
7998 }
7999
8000 if (getClientVersion() < Version(3, 1))
8001 {
8002 return false;
8003 }
8004
8005 switch (target)
8006 {
8007 case GL_IMAGE_BINDING_LAYERED:
8008 {
8009 *type = GL_BOOL;
8010 *numParams = 1;
8011 return true;
8012 }
8013 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
8014 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
8015 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
8016 case GL_SHADER_STORAGE_BUFFER_BINDING:
8017 case GL_VERTEX_BINDING_BUFFER:
8018 case GL_VERTEX_BINDING_DIVISOR:
8019 case GL_VERTEX_BINDING_OFFSET:
8020 case GL_VERTEX_BINDING_STRIDE:
8021 case GL_SAMPLE_MASK_VALUE:
8022 case GL_IMAGE_BINDING_NAME:
8023 case GL_IMAGE_BINDING_LEVEL:
8024 case GL_IMAGE_BINDING_LAYER:
8025 case GL_IMAGE_BINDING_ACCESS:
8026 case GL_IMAGE_BINDING_FORMAT:
8027 {
8028 *type = GL_INT;
8029 *numParams = 1;
8030 return true;
8031 }
8032 case GL_ATOMIC_COUNTER_BUFFER_START:
8033 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
8034 case GL_SHADER_STORAGE_BUFFER_START:
8035 case GL_SHADER_STORAGE_BUFFER_SIZE:
8036 {
8037 *type = GL_INT_64_ANGLEX;
8038 *numParams = 1;
8039 return true;
8040 }
8041 }
8042
8043 return false;
8044}
8045
Jamie Madill44a6fbf2018-10-02 13:38:56 -04008046Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05008047{
8048 return mState.mShaderPrograms->getProgram(handle);
8049}
8050
8051Shader *Context::getShader(GLuint handle) const
8052{
8053 return mState.mShaderPrograms->getShader(handle);
8054}
8055
Jamie Madill5b772312018-03-08 20:28:32 -05008056bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
8057{
8058 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
8059}
8060
8061bool Context::isFramebufferGenerated(GLuint framebuffer) const
8062{
8063 return mState.mFramebuffers->isHandleGenerated(framebuffer);
8064}
8065
8066bool Context::isProgramPipelineGenerated(GLuint pipeline) const
8067{
8068 return mState.mPipelines->isHandleGenerated(pipeline);
8069}
8070
8071bool Context::usingDisplayTextureShareGroup() const
8072{
8073 return mDisplayTextureShareGroup;
8074}
8075
8076GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
8077{
8078 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
8079 internalformat == GL_DEPTH_STENCIL
8080 ? GL_DEPTH24_STENCIL8
8081 : internalformat;
8082}
8083
jchen1082af6202018-06-22 10:59:52 +08008084void Context::maxShaderCompilerThreads(GLuint count)
8085{
jchen107ae70d82018-07-06 13:47:01 +08008086 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08008087 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08008088 // A count of zero specifies a request for no parallel compiling or linking.
8089 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
8090 {
8091 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
8092 }
8093 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08008094}
8095
Jamie Madill2eb65032018-07-30 10:25:57 -04008096bool Context::isGLES1() const
8097{
8098 return mState.getClientVersion() < Version(2, 0);
8099}
8100
Jamie Madilla11819d2018-07-30 10:26:01 -04008101void Context::onSubjectStateChange(const Context *context,
8102 angle::SubjectIndex index,
8103 angle::SubjectMessage message)
8104{
Jamie Madilla11819d2018-07-30 10:26:01 -04008105 switch (index)
8106 {
8107 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008108 switch (message)
8109 {
8110 case angle::SubjectMessage::CONTENTS_CHANGED:
8111 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
8112 mStateCache.onVertexArrayBufferContentsChange(this);
8113 break;
8114 case angle::SubjectMessage::RESOURCE_MAPPED:
8115 case angle::SubjectMessage::RESOURCE_UNMAPPED:
8116 case angle::SubjectMessage::BINDING_CHANGED:
8117 mStateCache.onVertexArrayBufferStateChange(this);
8118 break;
8119 default:
8120 break;
8121 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008122 break;
8123
8124 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008125 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8126 {
8127 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
8128 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008129 break;
8130
8131 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008132 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8133 {
8134 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
8135 }
8136 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04008137 break;
8138
8139 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04008140 if (index < kTextureMaxSubjectIndex)
8141 {
8142 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04008143 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008144 }
Jamie Madille25b8002018-09-20 13:39:49 -04008145 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04008146 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04008147 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04008148 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008149 }
Jamie Madille25b8002018-09-20 13:39:49 -04008150 else
8151 {
8152 ASSERT(index < kSamplerMaxSubjectIndex);
8153 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
8154 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008155 break;
8156 }
8157}
8158
Jamie Madill6b873dd2018-07-12 23:56:30 -04008159// ErrorSet implementation.
8160ErrorSet::ErrorSet(Context *context) : mContext(context)
8161{
8162}
8163
8164ErrorSet::~ErrorSet() = default;
8165
Jamie Madill306b6c12018-07-27 08:12:49 -04008166void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04008167{
8168 // This internal enum is used to filter internal errors that are already handled.
8169 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
8170 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
8171 {
8172 return;
8173 }
8174
8175 if (ANGLE_UNLIKELY(error.isError()))
8176 {
8177 GLenum code = error.getCode();
8178 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04008179
Jamie Madill6b873dd2018-07-12 23:56:30 -04008180 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8181 {
8182 mContext->markContextLost();
8183 }
8184
8185 ASSERT(!error.getMessage().empty());
8186 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8187 error.getID(), GL_DEBUG_SEVERITY_HIGH,
8188 error.getMessage());
8189 }
8190}
8191
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008192void ErrorSet::handleError(GLenum errorCode,
8193 const char *message,
8194 const char *file,
8195 const char *function,
8196 unsigned int line)
8197{
8198 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
8199 std::stringstream errorStream;
8200 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
8201 << function << ":" << line << ". " << message;
8202
8203 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
8204}
8205
Jamie Madilla139f012018-10-10 16:13:03 -04008206void ErrorSet::validationError(GLenum errorCode, const char *message)
8207{
8208 handleError(gl::Error(errorCode, message));
8209}
8210
Jamie Madill6b873dd2018-07-12 23:56:30 -04008211bool ErrorSet::empty() const
8212{
8213 return mErrors.empty();
8214}
8215
8216GLenum ErrorSet::popError()
8217{
8218 ASSERT(!empty());
8219 GLenum error = *mErrors.begin();
8220 mErrors.erase(mErrors.begin());
8221 return error;
8222}
Jamie Madilldc358af2018-07-31 11:22:13 -04008223
8224// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008225StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008226 : mCachedHasAnyEnabledClientAttrib(false),
8227 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008228 mCachedInstancedVertexElementLimit(0),
8229 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008230{
8231}
8232
8233StateCache::~StateCache() = default;
8234
Jamie Madillac66f982018-10-09 18:30:01 -04008235void StateCache::initialize(Context *context)
8236{
8237 updateValidDrawModes(context);
8238 updateValidBindTextureTypes(context);
8239}
8240
Jamie Madilldc358af2018-07-31 11:22:13 -04008241void StateCache::updateActiveAttribsMask(Context *context)
8242{
8243 bool isGLES1 = context->isGLES1();
8244 const State &glState = context->getGLState();
8245
8246 if (!isGLES1 && !glState.getProgram())
8247 {
8248 mCachedActiveBufferedAttribsMask = AttributesMask();
8249 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008250 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008251 return;
8252 }
8253
8254 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8255 : glState.getProgram()->getActiveAttribLocationsMask();
8256
8257 const VertexArray *vao = glState.getVertexArray();
8258 ASSERT(vao);
8259
8260 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8261 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008262 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008263
Jamie Madill0a17e482018-08-31 17:19:11 -04008264 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8265 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008266 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008267 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8268}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008269
8270void StateCache::updateVertexElementLimits(Context *context)
8271{
8272 const VertexArray *vao = context->getGLState().getVertexArray();
8273
8274 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8275 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8276
8277 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8278 // If there are no buffered attributes then we should not limit the draw call count.
8279 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8280 {
8281 return;
8282 }
8283
8284 const auto &vertexAttribs = vao->getVertexAttributes();
8285 const auto &vertexBindings = vao->getVertexBindings();
8286
8287 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8288 {
8289 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8290 ASSERT(attrib.enabled);
8291
8292 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8293 ASSERT(context->isGLES1() ||
8294 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8295
8296 GLint64 limit = attrib.getCachedElementLimit();
8297 if (binding.getDivisor() > 0)
8298 {
8299 mCachedInstancedVertexElementLimit =
8300 std::min(mCachedInstancedVertexElementLimit, limit);
8301 }
8302 else
8303 {
8304 mCachedNonInstancedVertexElementLimit =
8305 std::min(mCachedNonInstancedVertexElementLimit, limit);
8306 }
8307 }
8308}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008309
Jamie Madilld84b6732018-09-06 15:54:35 -04008310void StateCache::updateBasicDrawStatesError()
8311{
8312 mCachedBasicDrawStatesError = kInvalidPointer;
8313}
8314
8315intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8316{
8317 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8318 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8319 return mCachedBasicDrawStatesError;
8320}
8321
Jamie Madillc43cdad2018-08-08 15:49:25 -04008322void StateCache::onVertexArrayBindingChange(Context *context)
8323{
8324 updateActiveAttribsMask(context);
8325 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008326 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008327}
8328
8329void StateCache::onProgramExecutableChange(Context *context)
8330{
8331 updateActiveAttribsMask(context);
8332 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008333 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008334 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008335}
8336
Jamie Madilld84b6732018-09-06 15:54:35 -04008337void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008338{
8339 updateVertexElementLimits(context);
8340}
8341
Jamie Madilld84b6732018-09-06 15:54:35 -04008342void StateCache::onVertexArrayBufferContentsChange(Context *context)
8343{
8344 updateVertexElementLimits(context);
8345 updateBasicDrawStatesError();
8346}
8347
Jamie Madillc43cdad2018-08-08 15:49:25 -04008348void StateCache::onVertexArrayStateChange(Context *context)
8349{
8350 updateActiveAttribsMask(context);
8351 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008352 updateBasicDrawStatesError();
8353}
8354
8355void StateCache::onVertexArrayBufferStateChange(Context *context)
8356{
8357 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008358}
8359
8360void StateCache::onGLES1ClientStateChange(Context *context)
8361{
8362 updateActiveAttribsMask(context);
8363}
Jamie Madilld84b6732018-09-06 15:54:35 -04008364
8365void StateCache::onDrawFramebufferChange(Context *context)
8366{
8367 updateBasicDrawStatesError();
8368}
8369
8370void StateCache::onContextCapChange(Context *context)
8371{
8372 updateBasicDrawStatesError();
8373}
8374
8375void StateCache::onStencilStateChange(Context *context)
8376{
8377 updateBasicDrawStatesError();
8378}
8379
8380void StateCache::onDefaultVertexAttributeChange(Context *context)
8381{
8382 updateBasicDrawStatesError();
8383}
8384
8385void StateCache::onActiveTextureChange(Context *context)
8386{
8387 updateBasicDrawStatesError();
8388}
8389
8390void StateCache::onQueryChange(Context *context)
8391{
8392 updateBasicDrawStatesError();
8393}
8394
8395void StateCache::onTransformFeedbackChange(Context *context)
8396{
8397 updateBasicDrawStatesError();
8398}
8399
8400void StateCache::onUniformBufferStateChange(Context *context)
8401{
8402 updateBasicDrawStatesError();
8403}
8404
8405void StateCache::onBufferBindingChange(Context *context)
8406{
8407 updateBasicDrawStatesError();
8408}
Jamie Madill526a6f62018-09-12 11:03:05 -04008409
8410void StateCache::updateValidDrawModes(Context *context)
8411{
8412 Program *program = context->getGLState().getProgram();
8413 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8414 {
8415 mCachedValidDrawModes = {{
8416 true, /* Points */
8417 true, /* Lines */
8418 true, /* LineLoop */
8419 true, /* LineStrip */
8420 true, /* Triangles */
8421 true, /* TriangleStrip */
8422 true, /* TriangleFan */
8423 false, /* LinesAdjacency */
8424 false, /* LineStripAdjacency */
8425 false, /* TrianglesAdjacency */
8426 false, /* TriangleStripAdjacency */
8427 false, /* InvalidEnum */
8428 }};
8429 }
8430 else
8431 {
8432 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8433
8434 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8435
8436 mCachedValidDrawModes = {{
8437 gsMode == PrimitiveMode::Points, /* Points */
8438 gsMode == PrimitiveMode::Lines, /* Lines */
8439 gsMode == PrimitiveMode::Lines, /* LineLoop */
8440 gsMode == PrimitiveMode::Lines, /* LineStrip */
8441 gsMode == PrimitiveMode::Triangles, /* Triangles */
8442 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8443 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8444 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8445 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8446 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8447 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8448 false, /* InvalidEnum */
8449 }};
8450 }
8451}
Jamie Madillac66f982018-10-09 18:30:01 -04008452
8453void StateCache::updateValidBindTextureTypes(Context *context)
8454{
8455 const Extensions &exts = context->getExtensions();
8456 bool isGLES3 = context->getClientMajorVersion() >= 3;
8457 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8458
8459 mCachedValidBindTextureTypes = {{
8460 true, /* _2D */
8461 isGLES3, /* _2DArray */
Yizhou Jiang7818a852018-09-06 15:02:04 +08008462 isGLES31 || exts.textureMultisample, /* _2DMultisample */
Jamie Madillac66f982018-10-09 18:30:01 -04008463 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8464 isGLES3, /* _3D */
8465 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8466 exts.textureRectangle, /* Rectangle */
8467 true, /* CubeMap */
8468 false, /* InvalidEnum */
8469
8470 }};
8471}
Jamie Madillc29968b2016-01-20 11:17:23 -05008472} // namespace gl