blob: 1a092e2a1ede29733cea45ea05e679ef917477fa [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{
753 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
754}
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
Geoff Langa8cb2872018-03-09 16:09:40 -05003541 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003542 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003543}
3544
3545Error Context::prepareForClear(GLbitfield mask)
3546{
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));
Geoff Langd4fff502017-09-22 11:28:28 -04003550 return NoError();
3551}
3552
3553Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3554{
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 Madill05b35b22017-10-03 09:01:44 -04003559 return NoError();
3560}
3561
Geoff Langa8cb2872018-03-09 16:09:40 -05003562Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003563{
Geoff Langa8cb2872018-03-09 16:09:40 -05003564 ANGLE_TRY(syncDirtyObjects(objectMask));
3565 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003566 return NoError();
3567}
3568
Jamie Madill6f755b22018-10-09 12:48:54 -04003569angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003570{
3571 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003572 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003573 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003574 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003575}
3576
Jamie Madill6f755b22018-10-09 12:48:54 -04003577angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003578{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003579 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003580 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003581 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003582 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003583}
Jamie Madillc29968b2016-01-20 11:17:23 -05003584
Jamie Madill6f755b22018-10-09 12:48:54 -04003585angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003586{
3587 return mGLState.syncDirtyObjects(this, objectMask);
3588}
3589
Jamie Madillc29968b2016-01-20 11:17:23 -05003590void Context::blitFramebuffer(GLint srcX0,
3591 GLint srcY0,
3592 GLint srcX1,
3593 GLint srcY1,
3594 GLint dstX0,
3595 GLint dstY0,
3596 GLint dstX1,
3597 GLint dstY1,
3598 GLbitfield mask,
3599 GLenum filter)
3600{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003601 if (mask == 0)
3602 {
3603 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3604 // buffers are copied.
3605 return;
3606 }
3607
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003608 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003609 ASSERT(drawFramebuffer);
3610
3611 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3612 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3613
Jamie Madillbc918e72018-03-08 09:47:21 -05003614 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003615
Jamie Madillc564c072017-06-01 12:45:42 -04003616 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003617}
Jamie Madillc29968b2016-01-20 11:17:23 -05003618
3619void Context::clear(GLbitfield mask)
3620{
Geoff Langd4fff502017-09-22 11:28:28 -04003621 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3622 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003623}
3624
3625void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3626{
Olli Etuaho78df3362018-10-05 16:43:27 +03003627 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3628 const FramebufferAttachment *attachment = nullptr;
3629 if (buffer == GL_DEPTH)
3630 {
3631 attachment = framebufferObject->getDepthbuffer();
3632 }
3633 if (buffer == GL_COLOR &&
3634 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3635 {
3636 attachment = framebufferObject->getColorbuffer(drawbuffer);
3637 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003638 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3639 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003640 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003641 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003642 return;
3643 }
Geoff Langd4fff502017-09-22 11:28:28 -04003644 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003645 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003646}
3647
3648void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3649{
Olli Etuaho78df3362018-10-05 16:43:27 +03003650 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3651 const FramebufferAttachment *attachment = nullptr;
3652 if (buffer == GL_COLOR &&
3653 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3654 {
3655 attachment = framebufferObject->getColorbuffer(drawbuffer);
3656 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003657 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3658 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003659 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003660 {
3661 return;
3662 }
Geoff Langd4fff502017-09-22 11:28:28 -04003663 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003664 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003665}
3666
3667void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3668{
Olli Etuaho78df3362018-10-05 16:43:27 +03003669 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3670 const FramebufferAttachment *attachment = nullptr;
3671 if (buffer == GL_STENCIL)
3672 {
3673 attachment = framebufferObject->getStencilbuffer();
3674 }
3675 if (buffer == GL_COLOR &&
3676 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3677 {
3678 attachment = framebufferObject->getColorbuffer(drawbuffer);
3679 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003680 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3681 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003682 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003683 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003684 return;
3685 }
Geoff Langd4fff502017-09-22 11:28:28 -04003686 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003687 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003688}
3689
3690void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3691{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003692 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003693 ASSERT(framebufferObject);
3694
3695 // If a buffer is not present, the clear has no effect
3696 if (framebufferObject->getDepthbuffer() == nullptr &&
3697 framebufferObject->getStencilbuffer() == nullptr)
3698 {
3699 return;
3700 }
3701
Geoff Langd4fff502017-09-22 11:28:28 -04003702 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3703 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003704}
3705
3706void Context::readPixels(GLint x,
3707 GLint y,
3708 GLsizei width,
3709 GLsizei height,
3710 GLenum format,
3711 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003712 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003713{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003714 if (width == 0 || height == 0)
3715 {
3716 return;
3717 }
3718
Jamie Madillbc918e72018-03-08 09:47:21 -05003719 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003720
Jamie Madillb6664922017-07-25 12:55:04 -04003721 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3722 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003723
3724 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003725 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003726}
3727
Brandon Jones59770802018-04-02 13:18:42 -07003728void Context::readPixelsRobust(GLint x,
3729 GLint y,
3730 GLsizei width,
3731 GLsizei height,
3732 GLenum format,
3733 GLenum type,
3734 GLsizei bufSize,
3735 GLsizei *length,
3736 GLsizei *columns,
3737 GLsizei *rows,
3738 void *pixels)
3739{
3740 readPixels(x, y, width, height, format, type, pixels);
3741}
3742
3743void Context::readnPixelsRobust(GLint x,
3744 GLint y,
3745 GLsizei width,
3746 GLsizei height,
3747 GLenum format,
3748 GLenum type,
3749 GLsizei bufSize,
3750 GLsizei *length,
3751 GLsizei *columns,
3752 GLsizei *rows,
3753 void *data)
3754{
3755 readPixels(x, y, width, height, format, type, data);
3756}
3757
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003758void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003759 GLint level,
3760 GLenum internalformat,
3761 GLint x,
3762 GLint y,
3763 GLsizei width,
3764 GLsizei height,
3765 GLint border)
3766{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003767 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003768 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003769
Jamie Madillc29968b2016-01-20 11:17:23 -05003770 Rectangle sourceArea(x, y, width, height);
3771
Jamie Madill05b35b22017-10-03 09:01:44 -04003772 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003773 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003774 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003775}
3776
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003777void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003778 GLint level,
3779 GLint xoffset,
3780 GLint yoffset,
3781 GLint x,
3782 GLint y,
3783 GLsizei width,
3784 GLsizei height)
3785{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003786 if (width == 0 || height == 0)
3787 {
3788 return;
3789 }
3790
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003791 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003792 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003793
Jamie Madillc29968b2016-01-20 11:17:23 -05003794 Offset destOffset(xoffset, yoffset, 0);
3795 Rectangle sourceArea(x, y, width, height);
3796
Jamie Madill05b35b22017-10-03 09:01:44 -04003797 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003798 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003799 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003800}
3801
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003802void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003803 GLint level,
3804 GLint xoffset,
3805 GLint yoffset,
3806 GLint zoffset,
3807 GLint x,
3808 GLint y,
3809 GLsizei width,
3810 GLsizei height)
3811{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003812 if (width == 0 || height == 0)
3813 {
3814 return;
3815 }
3816
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003817 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003818 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003819
Jamie Madillc29968b2016-01-20 11:17:23 -05003820 Offset destOffset(xoffset, yoffset, zoffset);
3821 Rectangle sourceArea(x, y, width, height);
3822
Jamie Madill05b35b22017-10-03 09:01:44 -04003823 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3824 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003825 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3826 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003827}
3828
3829void Context::framebufferTexture2D(GLenum target,
3830 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003831 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003832 GLuint texture,
3833 GLint level)
3834{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003835 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003836 ASSERT(framebuffer);
3837
3838 if (texture != 0)
3839 {
3840 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003841 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003842 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003843 }
3844 else
3845 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003846 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003847 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003848
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003849 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003850}
3851
3852void Context::framebufferRenderbuffer(GLenum target,
3853 GLenum attachment,
3854 GLenum renderbuffertarget,
3855 GLuint renderbuffer)
3856{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003857 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003858 ASSERT(framebuffer);
3859
3860 if (renderbuffer != 0)
3861 {
3862 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003863
Jamie Madillcc129372018-04-12 09:13:18 -04003864 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003865 renderbufferObject);
3866 }
3867 else
3868 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003869 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003870 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003871
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003872 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003873}
3874
3875void Context::framebufferTextureLayer(GLenum target,
3876 GLenum attachment,
3877 GLuint texture,
3878 GLint level,
3879 GLint layer)
3880{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003881 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003882 ASSERT(framebuffer);
3883
3884 if (texture != 0)
3885 {
3886 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003887 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003888 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003889 }
3890 else
3891 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003892 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003893 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003894
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003895 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003896}
3897
Brandon Jones59770802018-04-02 13:18:42 -07003898void Context::framebufferTextureMultiviewLayered(GLenum target,
3899 GLenum attachment,
3900 GLuint texture,
3901 GLint level,
3902 GLint baseViewIndex,
3903 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003904{
Martin Radev82ef7742017-08-08 17:44:58 +03003905 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3906 ASSERT(framebuffer);
3907
3908 if (texture != 0)
3909 {
3910 Texture *textureObj = getTexture(texture);
3911
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003912 ImageIndex index;
3913 if (textureObj->getType() == TextureType::_2DArray)
3914 {
3915 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3916 }
3917 else
3918 {
3919 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3920 ASSERT(level == 0);
3921 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3922 }
Martin Radev82ef7742017-08-08 17:44:58 +03003923 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3924 numViews, baseViewIndex);
3925 }
3926 else
3927 {
3928 framebuffer->resetAttachment(this, attachment);
3929 }
3930
3931 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003932}
3933
Brandon Jones59770802018-04-02 13:18:42 -07003934void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3935 GLenum attachment,
3936 GLuint texture,
3937 GLint level,
3938 GLsizei numViews,
3939 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003940{
Martin Radev5dae57b2017-07-14 16:15:55 +03003941 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3942 ASSERT(framebuffer);
3943
3944 if (texture != 0)
3945 {
3946 Texture *textureObj = getTexture(texture);
3947
3948 ImageIndex index = ImageIndex::Make2D(level);
3949 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3950 textureObj, numViews, viewportOffsets);
3951 }
3952 else
3953 {
3954 framebuffer->resetAttachment(this, attachment);
3955 }
3956
3957 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003958}
3959
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003960void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3961{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003962 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3963 ASSERT(framebuffer);
3964
3965 if (texture != 0)
3966 {
3967 Texture *textureObj = getTexture(texture);
3968
3969 ImageIndex index = ImageIndex::MakeFromType(
3970 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3971 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3972 }
3973 else
3974 {
3975 framebuffer->resetAttachment(this, attachment);
3976 }
3977
3978 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003979}
3980
Jamie Madillc29968b2016-01-20 11:17:23 -05003981void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3982{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003983 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003984 ASSERT(framebuffer);
3985 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003986 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003987 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003988}
3989
3990void Context::readBuffer(GLenum mode)
3991{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003992 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003993 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003994 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003995}
3996
3997void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3998{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003999 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004000 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004001
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004002 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004003 ASSERT(framebuffer);
4004
4005 // The specification isn't clear what should be done when the framebuffer isn't complete.
4006 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04004007 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004008}
4009
4010void Context::invalidateFramebuffer(GLenum target,
4011 GLsizei numAttachments,
4012 const GLenum *attachments)
4013{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004014 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004015 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004016
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004017 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004018 ASSERT(framebuffer);
4019
Jamie Madill427064d2018-04-13 16:20:34 -04004020 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004021 {
Jamie Madill437fa652016-05-03 15:13:24 -04004022 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004023 }
Jamie Madill437fa652016-05-03 15:13:24 -04004024
Jamie Madill4928b7c2017-06-20 12:57:39 -04004025 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004026}
4027
4028void Context::invalidateSubFramebuffer(GLenum target,
4029 GLsizei numAttachments,
4030 const GLenum *attachments,
4031 GLint x,
4032 GLint y,
4033 GLsizei width,
4034 GLsizei height)
4035{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004036 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004037 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004038
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004039 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004040 ASSERT(framebuffer);
4041
Jamie Madill427064d2018-04-13 16:20:34 -04004042 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004043 {
Jamie Madill437fa652016-05-03 15:13:24 -04004044 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004045 }
Jamie Madill437fa652016-05-03 15:13:24 -04004046
4047 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004048 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05004049}
4050
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004051void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004052 GLint level,
4053 GLint internalformat,
4054 GLsizei width,
4055 GLsizei height,
4056 GLint border,
4057 GLenum format,
4058 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004059 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004060{
Jamie Madillbc918e72018-03-08 09:47:21 -05004061 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004062
4063 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004064 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004065 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004066 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004067}
4068
Brandon Jones59770802018-04-02 13:18:42 -07004069void Context::texImage2DRobust(TextureTarget target,
4070 GLint level,
4071 GLint internalformat,
4072 GLsizei width,
4073 GLsizei height,
4074 GLint border,
4075 GLenum format,
4076 GLenum type,
4077 GLsizei bufSize,
4078 const void *pixels)
4079{
4080 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4081}
4082
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004083void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004084 GLint level,
4085 GLint internalformat,
4086 GLsizei width,
4087 GLsizei height,
4088 GLsizei depth,
4089 GLint border,
4090 GLenum format,
4091 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004092 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004093{
Jamie Madillbc918e72018-03-08 09:47:21 -05004094 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004095
4096 Extents size(width, height, depth);
4097 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004098 handleError(texture->setImage(this, mGLState.getUnpackState(),
4099 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004100 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004101}
4102
Brandon Jones59770802018-04-02 13:18:42 -07004103void Context::texImage3DRobust(TextureType target,
4104 GLint level,
4105 GLint internalformat,
4106 GLsizei width,
4107 GLsizei height,
4108 GLsizei depth,
4109 GLint border,
4110 GLenum format,
4111 GLenum type,
4112 GLsizei bufSize,
4113 const void *pixels)
4114{
4115 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4116}
4117
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004118void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004119 GLint level,
4120 GLint xoffset,
4121 GLint yoffset,
4122 GLsizei width,
4123 GLsizei height,
4124 GLenum format,
4125 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004126 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004127{
4128 // Zero sized uploads are valid but no-ops
4129 if (width == 0 || height == 0)
4130 {
4131 return;
4132 }
4133
Jamie Madillbc918e72018-03-08 09:47:21 -05004134 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004135
4136 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004137 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004138
4139 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4140
4141 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4142 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004143}
4144
Brandon Jones59770802018-04-02 13:18:42 -07004145void Context::texSubImage2DRobust(TextureTarget target,
4146 GLint level,
4147 GLint xoffset,
4148 GLint yoffset,
4149 GLsizei width,
4150 GLsizei height,
4151 GLenum format,
4152 GLenum type,
4153 GLsizei bufSize,
4154 const void *pixels)
4155{
4156 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4157}
4158
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004159void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004160 GLint level,
4161 GLint xoffset,
4162 GLint yoffset,
4163 GLint zoffset,
4164 GLsizei width,
4165 GLsizei height,
4166 GLsizei depth,
4167 GLenum format,
4168 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004169 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004170{
4171 // Zero sized uploads are valid but no-ops
4172 if (width == 0 || height == 0 || depth == 0)
4173 {
4174 return;
4175 }
4176
Jamie Madillbc918e72018-03-08 09:47:21 -05004177 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004178
4179 Box area(xoffset, yoffset, zoffset, width, height, depth);
4180 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004181
4182 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4183
4184 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004185 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004186 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004187}
4188
Brandon Jones59770802018-04-02 13:18:42 -07004189void Context::texSubImage3DRobust(TextureType target,
4190 GLint level,
4191 GLint xoffset,
4192 GLint yoffset,
4193 GLint zoffset,
4194 GLsizei width,
4195 GLsizei height,
4196 GLsizei depth,
4197 GLenum format,
4198 GLenum type,
4199 GLsizei bufSize,
4200 const void *pixels)
4201{
4202 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4203 pixels);
4204}
4205
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004206void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004207 GLint level,
4208 GLenum internalformat,
4209 GLsizei width,
4210 GLsizei height,
4211 GLint border,
4212 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004213 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004214{
Jamie Madillbc918e72018-03-08 09:47:21 -05004215 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004216
4217 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004218 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004219 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4220 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004221 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004222}
4223
Brandon Jones59770802018-04-02 13:18:42 -07004224void Context::compressedTexImage2DRobust(TextureTarget target,
4225 GLint level,
4226 GLenum internalformat,
4227 GLsizei width,
4228 GLsizei height,
4229 GLint border,
4230 GLsizei imageSize,
4231 GLsizei dataSize,
4232 const GLvoid *data)
4233{
4234 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4235}
4236
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004237void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004238 GLint level,
4239 GLenum internalformat,
4240 GLsizei width,
4241 GLsizei height,
4242 GLsizei depth,
4243 GLint border,
4244 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004245 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004246{
Jamie Madillbc918e72018-03-08 09:47:21 -05004247 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004248
4249 Extents size(width, height, depth);
4250 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004251 handleError(texture->setCompressedImage(
4252 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004253 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004254}
4255
Brandon Jones59770802018-04-02 13:18:42 -07004256void Context::compressedTexImage3DRobust(TextureType target,
4257 GLint level,
4258 GLenum internalformat,
4259 GLsizei width,
4260 GLsizei height,
4261 GLsizei depth,
4262 GLint border,
4263 GLsizei imageSize,
4264 GLsizei dataSize,
4265 const GLvoid *data)
4266{
4267 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4268 data);
4269}
4270
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004271void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004272 GLint level,
4273 GLint xoffset,
4274 GLint yoffset,
4275 GLsizei width,
4276 GLsizei height,
4277 GLenum format,
4278 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004279 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004280{
Jamie Madillbc918e72018-03-08 09:47:21 -05004281 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004282
4283 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004284 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004285 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4286 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004287 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004288}
4289
Brandon Jones59770802018-04-02 13:18:42 -07004290void Context::compressedTexSubImage2DRobust(TextureTarget target,
4291 GLint level,
4292 GLint xoffset,
4293 GLint yoffset,
4294 GLsizei width,
4295 GLsizei height,
4296 GLenum format,
4297 GLsizei imageSize,
4298 GLsizei dataSize,
4299 const GLvoid *data)
4300{
4301 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4302 data);
4303}
4304
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004305void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004306 GLint level,
4307 GLint xoffset,
4308 GLint yoffset,
4309 GLint zoffset,
4310 GLsizei width,
4311 GLsizei height,
4312 GLsizei depth,
4313 GLenum format,
4314 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004315 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004316{
4317 // Zero sized uploads are valid but no-ops
4318 if (width == 0 || height == 0)
4319 {
4320 return;
4321 }
4322
Jamie Madillbc918e72018-03-08 09:47:21 -05004323 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004324
4325 Box area(xoffset, yoffset, zoffset, width, height, depth);
4326 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004327 handleError(texture->setCompressedSubImage(
4328 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004329 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004330}
4331
Brandon Jones59770802018-04-02 13:18:42 -07004332void Context::compressedTexSubImage3DRobust(TextureType target,
4333 GLint level,
4334 GLint xoffset,
4335 GLint yoffset,
4336 GLint zoffset,
4337 GLsizei width,
4338 GLsizei height,
4339 GLsizei depth,
4340 GLenum format,
4341 GLsizei imageSize,
4342 GLsizei dataSize,
4343 const GLvoid *data)
4344{
4345 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4346 imageSize, data);
4347}
4348
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004349void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004350{
4351 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004352 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004353}
4354
Jamie Madill007530e2017-12-28 14:27:04 -05004355void Context::copyTexture(GLuint sourceId,
4356 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004357 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004358 GLuint destId,
4359 GLint destLevel,
4360 GLint internalFormat,
4361 GLenum destType,
4362 GLboolean unpackFlipY,
4363 GLboolean unpackPremultiplyAlpha,
4364 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004365{
Jamie Madillbc918e72018-03-08 09:47:21 -05004366 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004367
4368 gl::Texture *sourceTexture = getTexture(sourceId);
4369 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004370 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4371 sourceLevel, ConvertToBool(unpackFlipY),
4372 ConvertToBool(unpackPremultiplyAlpha),
4373 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004374}
4375
Jamie Madill007530e2017-12-28 14:27:04 -05004376void Context::copySubTexture(GLuint sourceId,
4377 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004378 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004379 GLuint destId,
4380 GLint destLevel,
4381 GLint xoffset,
4382 GLint yoffset,
4383 GLint x,
4384 GLint y,
4385 GLsizei width,
4386 GLsizei height,
4387 GLboolean unpackFlipY,
4388 GLboolean unpackPremultiplyAlpha,
4389 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004390{
4391 // Zero sized copies are valid but no-ops
4392 if (width == 0 || height == 0)
4393 {
4394 return;
4395 }
4396
Jamie Madillbc918e72018-03-08 09:47:21 -05004397 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004398
4399 gl::Texture *sourceTexture = getTexture(sourceId);
4400 gl::Texture *destTexture = getTexture(destId);
4401 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004402 Box box(x, y, 0, width, height, 1);
4403 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4404 ConvertToBool(unpackFlipY),
4405 ConvertToBool(unpackPremultiplyAlpha),
4406 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4407}
4408
4409void Context::copyTexture3D(GLuint sourceId,
4410 GLint sourceLevel,
4411 TextureTarget destTarget,
4412 GLuint destId,
4413 GLint destLevel,
4414 GLint internalFormat,
4415 GLenum destType,
4416 GLboolean unpackFlipY,
4417 GLboolean unpackPremultiplyAlpha,
4418 GLboolean unpackUnmultiplyAlpha)
4419{
4420 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4421
4422 Texture *sourceTexture = getTexture(sourceId);
4423 Texture *destTexture = getTexture(destId);
4424 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4425 sourceLevel, ConvertToBool(unpackFlipY),
4426 ConvertToBool(unpackPremultiplyAlpha),
4427 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4428}
4429
4430void Context::copySubTexture3D(GLuint sourceId,
4431 GLint sourceLevel,
4432 TextureTarget destTarget,
4433 GLuint destId,
4434 GLint destLevel,
4435 GLint xoffset,
4436 GLint yoffset,
4437 GLint zoffset,
4438 GLint x,
4439 GLint y,
4440 GLint z,
4441 GLsizei width,
4442 GLsizei height,
4443 GLsizei depth,
4444 GLboolean unpackFlipY,
4445 GLboolean unpackPremultiplyAlpha,
4446 GLboolean unpackUnmultiplyAlpha)
4447{
4448 // Zero sized copies are valid but no-ops
4449 if (width == 0 || height == 0 || depth == 0)
4450 {
4451 return;
4452 }
4453
4454 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4455
4456 Texture *sourceTexture = getTexture(sourceId);
4457 Texture *destTexture = getTexture(destId);
4458 Offset offset(xoffset, yoffset, zoffset);
4459 Box box(x, y, z, width, height, depth);
4460 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004461 ConvertToBool(unpackFlipY),
4462 ConvertToBool(unpackPremultiplyAlpha),
4463 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004464}
4465
Jamie Madill007530e2017-12-28 14:27:04 -05004466void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004467{
Jamie Madillbc918e72018-03-08 09:47:21 -05004468 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004469
4470 gl::Texture *sourceTexture = getTexture(sourceId);
4471 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004472 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004473}
4474
Corentin Wallez336129f2017-10-17 15:55:40 -04004475void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004476{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004477 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004478 ASSERT(buffer);
4479
Geoff Lang496c02d2016-10-20 11:38:11 -07004480 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004481}
4482
Brandon Jones59770802018-04-02 13:18:42 -07004483void Context::getBufferPointervRobust(BufferBinding target,
4484 GLenum pname,
4485 GLsizei bufSize,
4486 GLsizei *length,
4487 void **params)
4488{
4489 getBufferPointerv(target, pname, params);
4490}
4491
Corentin Wallez336129f2017-10-17 15:55:40 -04004492void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004493{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004494 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004495 ASSERT(buffer);
4496
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004497 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004498 if (error.isError())
4499 {
Jamie Madill437fa652016-05-03 15:13:24 -04004500 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004501 return nullptr;
4502 }
4503
4504 return buffer->getMapPointer();
4505}
4506
Corentin Wallez336129f2017-10-17 15:55:40 -04004507GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004508{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004509 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004510 ASSERT(buffer);
4511
4512 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004513 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004514 if (error.isError())
4515 {
Jamie Madill437fa652016-05-03 15:13:24 -04004516 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004517 return GL_FALSE;
4518 }
4519
4520 return result;
4521}
4522
Corentin Wallez336129f2017-10-17 15:55:40 -04004523void *Context::mapBufferRange(BufferBinding target,
4524 GLintptr offset,
4525 GLsizeiptr length,
4526 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004527{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004528 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004529 ASSERT(buffer);
4530
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004531 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004532 if (error.isError())
4533 {
Jamie Madill437fa652016-05-03 15:13:24 -04004534 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004535 return nullptr;
4536 }
4537
4538 return buffer->getMapPointer();
4539}
4540
Corentin Wallez336129f2017-10-17 15:55:40 -04004541void Context::flushMappedBufferRange(BufferBinding /*target*/,
4542 GLintptr /*offset*/,
4543 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004544{
4545 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4546}
4547
Jamie Madillbc918e72018-03-08 09:47:21 -05004548Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004549{
Geoff Langa8cb2872018-03-09 16:09:40 -05004550 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004551}
4552
Jamie Madillbc918e72018-03-08 09:47:21 -05004553Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004554{
Geoff Langa8cb2872018-03-09 16:09:40 -05004555 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004556}
4557
Jamie Madillbc918e72018-03-08 09:47:21 -05004558Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004559{
Geoff Langa8cb2872018-03-09 16:09:40 -05004560 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004561}
4562
Geoff Lang9bf86f02018-07-26 11:46:34 -04004563Error Context::syncStateForPathOperation()
4564{
4565 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4566
4567 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4568 ANGLE_TRY(syncDirtyBits());
4569
4570 return NoError();
4571}
4572
Jiajia Qin5451d532017-11-16 17:16:34 +08004573void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4574{
4575 UNIMPLEMENTED();
4576}
4577
Jamie Madillc20ab272016-06-09 07:20:46 -07004578void Context::activeTexture(GLenum texture)
4579{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004580 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004581}
4582
Jamie Madill876429b2017-04-20 15:46:24 -04004583void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004584{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004585 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004586}
4587
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004588void Context::blendEquation(GLenum mode)
4589{
4590 mGLState.setBlendEquation(mode, mode);
4591}
4592
Jamie Madillc20ab272016-06-09 07:20:46 -07004593void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4594{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004595 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004596}
4597
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004598void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4599{
4600 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4601}
4602
Jamie Madillc20ab272016-06-09 07:20:46 -07004603void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4604{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004605 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004606}
4607
Jamie Madill876429b2017-04-20 15:46:24 -04004608void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004609{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004610 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004611}
4612
Jamie Madill876429b2017-04-20 15:46:24 -04004613void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004614{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004615 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004616}
4617
4618void Context::clearStencil(GLint s)
4619{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004620 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004621}
4622
4623void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4624{
Geoff Lang92019432017-11-20 13:09:34 -05004625 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4626 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004627}
4628
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004629void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004630{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004631 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004632}
4633
4634void Context::depthFunc(GLenum func)
4635{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004636 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004637}
4638
4639void Context::depthMask(GLboolean flag)
4640{
Geoff Lang92019432017-11-20 13:09:34 -05004641 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004642}
4643
Jamie Madill876429b2017-04-20 15:46:24 -04004644void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004645{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004646 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004647}
4648
4649void Context::disable(GLenum cap)
4650{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004651 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004652 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004653}
4654
4655void Context::disableVertexAttribArray(GLuint index)
4656{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004657 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004658 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004659}
4660
4661void Context::enable(GLenum cap)
4662{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004663 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004664 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004665}
4666
4667void Context::enableVertexAttribArray(GLuint index)
4668{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004669 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004670 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004671}
4672
4673void Context::frontFace(GLenum mode)
4674{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004675 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004676}
4677
4678void Context::hint(GLenum target, GLenum mode)
4679{
4680 switch (target)
4681 {
4682 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004683 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004684 break;
4685
4686 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004687 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004688 break;
4689
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004690 case GL_PERSPECTIVE_CORRECTION_HINT:
4691 case GL_POINT_SMOOTH_HINT:
4692 case GL_LINE_SMOOTH_HINT:
4693 case GL_FOG_HINT:
4694 mGLState.gles1().setHint(target, mode);
4695 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004696 default:
4697 UNREACHABLE();
4698 return;
4699 }
4700}
4701
4702void Context::lineWidth(GLfloat width)
4703{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004704 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004705}
4706
4707void Context::pixelStorei(GLenum pname, GLint param)
4708{
4709 switch (pname)
4710 {
4711 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004712 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004713 break;
4714
4715 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004716 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004717 break;
4718
4719 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004720 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004721 break;
4722
4723 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004724 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004725 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004726 break;
4727
4728 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004729 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004730 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004731 break;
4732
4733 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004734 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004735 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004736 break;
4737
4738 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004739 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004740 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004741 break;
4742
4743 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004744 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004745 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004746 break;
4747
4748 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004749 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004750 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004751 break;
4752
4753 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004754 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004755 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004756 break;
4757
4758 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004759 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004760 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004761 break;
4762
4763 default:
4764 UNREACHABLE();
4765 return;
4766 }
4767}
4768
4769void Context::polygonOffset(GLfloat factor, GLfloat units)
4770{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004771 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004772}
4773
Jamie Madill876429b2017-04-20 15:46:24 -04004774void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004775{
Geoff Lang92019432017-11-20 13:09:34 -05004776 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004777}
4778
Jiawei Shaodb342272017-09-27 10:21:45 +08004779void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4780{
4781 mGLState.setSampleMaskParams(maskNumber, mask);
4782}
4783
Jamie Madillc20ab272016-06-09 07:20:46 -07004784void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4785{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004786 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004787}
4788
4789void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4790{
4791 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4792 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004793 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004794 }
4795
4796 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4797 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004798 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004799 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004800
4801 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004802}
4803
4804void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4805{
4806 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4807 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004808 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004809 }
4810
4811 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4812 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004813 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004814 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004815
4816 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004817}
4818
4819void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4820{
4821 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4822 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004823 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004824 }
4825
4826 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4827 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004828 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004829 }
4830}
4831
4832void Context::vertexAttrib1f(GLuint index, GLfloat x)
4833{
4834 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004835 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004836 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004837}
4838
4839void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4840{
4841 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004842 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004843 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004844}
4845
4846void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4847{
4848 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004849 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004850 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004851}
4852
4853void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4854{
4855 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004856 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004857 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004858}
4859
4860void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4861{
4862 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004863 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004864 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004865}
4866
4867void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4868{
4869 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004870 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004871 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004872}
4873
4874void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4875{
4876 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004877 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004878 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004879}
4880
4881void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4882{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004883 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004884 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004885}
4886
4887void Context::vertexAttribPointer(GLuint index,
4888 GLint size,
4889 GLenum type,
4890 GLboolean normalized,
4891 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004892 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004893{
Corentin Wallez336129f2017-10-17 15:55:40 -04004894 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004895 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004896 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004897}
4898
Shao80957d92017-02-20 21:25:59 +08004899void Context::vertexAttribFormat(GLuint attribIndex,
4900 GLint size,
4901 GLenum type,
4902 GLboolean normalized,
4903 GLuint relativeOffset)
4904{
Geoff Lang92019432017-11-20 13:09:34 -05004905 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004906 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004907 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004908}
4909
4910void Context::vertexAttribIFormat(GLuint attribIndex,
4911 GLint size,
4912 GLenum type,
4913 GLuint relativeOffset)
4914{
4915 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004916 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004917}
4918
4919void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4920{
Shaodde78e82017-05-22 14:13:27 +08004921 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004922 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004923}
4924
Jiajia Qin5451d532017-11-16 17:16:34 +08004925void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004926{
4927 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004928 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004929}
4930
Jamie Madillc20ab272016-06-09 07:20:46 -07004931void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4932{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004933 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004934}
4935
4936void Context::vertexAttribIPointer(GLuint index,
4937 GLint size,
4938 GLenum type,
4939 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004940 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004941{
Corentin Wallez336129f2017-10-17 15:55:40 -04004942 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4943 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004944 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004945}
4946
4947void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4948{
4949 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004950 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004951 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004952}
4953
4954void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4955{
4956 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004957 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004958 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004959}
4960
4961void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4962{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004963 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004964 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004965}
4966
4967void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4968{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004969 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004970 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004971}
4972
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004973void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4974{
4975 const VertexAttribCurrentValueData &currentValues =
4976 getGLState().getVertexAttribCurrentValue(index);
4977 const VertexArray *vao = getGLState().getVertexArray();
4978 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4979 currentValues, pname, params);
4980}
4981
Brandon Jones59770802018-04-02 13:18:42 -07004982void Context::getVertexAttribivRobust(GLuint index,
4983 GLenum pname,
4984 GLsizei bufSize,
4985 GLsizei *length,
4986 GLint *params)
4987{
4988 getVertexAttribiv(index, pname, params);
4989}
4990
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004991void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4992{
4993 const VertexAttribCurrentValueData &currentValues =
4994 getGLState().getVertexAttribCurrentValue(index);
4995 const VertexArray *vao = getGLState().getVertexArray();
4996 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4997 currentValues, pname, params);
4998}
4999
Brandon Jones59770802018-04-02 13:18:42 -07005000void Context::getVertexAttribfvRobust(GLuint index,
5001 GLenum pname,
5002 GLsizei bufSize,
5003 GLsizei *length,
5004 GLfloat *params)
5005{
5006 getVertexAttribfv(index, pname, params);
5007}
5008
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005009void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
5010{
5011 const VertexAttribCurrentValueData &currentValues =
5012 getGLState().getVertexAttribCurrentValue(index);
5013 const VertexArray *vao = getGLState().getVertexArray();
5014 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5015 currentValues, pname, params);
5016}
5017
Brandon Jones59770802018-04-02 13:18:42 -07005018void Context::getVertexAttribIivRobust(GLuint index,
5019 GLenum pname,
5020 GLsizei bufSize,
5021 GLsizei *length,
5022 GLint *params)
5023{
5024 getVertexAttribIiv(index, pname, params);
5025}
5026
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005027void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
5028{
5029 const VertexAttribCurrentValueData &currentValues =
5030 getGLState().getVertexAttribCurrentValue(index);
5031 const VertexArray *vao = getGLState().getVertexArray();
5032 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5033 currentValues, pname, params);
5034}
5035
Brandon Jones59770802018-04-02 13:18:42 -07005036void Context::getVertexAttribIuivRobust(GLuint index,
5037 GLenum pname,
5038 GLsizei bufSize,
5039 GLsizei *length,
5040 GLuint *params)
5041{
5042 getVertexAttribIuiv(index, pname, params);
5043}
5044
Jamie Madill876429b2017-04-20 15:46:24 -04005045void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005046{
5047 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
5048 QueryVertexAttribPointerv(attrib, pname, pointer);
5049}
5050
Brandon Jones59770802018-04-02 13:18:42 -07005051void Context::getVertexAttribPointervRobust(GLuint index,
5052 GLenum pname,
5053 GLsizei bufSize,
5054 GLsizei *length,
5055 void **pointer)
5056{
5057 getVertexAttribPointerv(index, pname, pointer);
5058}
5059
Jamie Madillc20ab272016-06-09 07:20:46 -07005060void Context::debugMessageControl(GLenum source,
5061 GLenum type,
5062 GLenum severity,
5063 GLsizei count,
5064 const GLuint *ids,
5065 GLboolean enabled)
5066{
5067 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005068 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005069 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005070}
5071
5072void Context::debugMessageInsert(GLenum source,
5073 GLenum type,
5074 GLuint id,
5075 GLenum severity,
5076 GLsizei length,
5077 const GLchar *buf)
5078{
5079 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005080 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005081}
5082
5083void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5084{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005085 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005086}
5087
5088GLuint Context::getDebugMessageLog(GLuint count,
5089 GLsizei bufSize,
5090 GLenum *sources,
5091 GLenum *types,
5092 GLuint *ids,
5093 GLenum *severities,
5094 GLsizei *lengths,
5095 GLchar *messageLog)
5096{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005097 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5098 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005099}
5100
5101void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5102{
5103 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005104 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005105 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005106}
5107
5108void Context::popDebugGroup()
5109{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005110 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005111 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005112}
5113
Corentin Wallez336129f2017-10-17 15:55:40 -04005114void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005115{
5116 Buffer *buffer = mGLState.getTargetBuffer(target);
5117 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005118 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005119}
5120
Corentin Wallez336129f2017-10-17 15:55:40 -04005121void Context::bufferSubData(BufferBinding target,
5122 GLintptr offset,
5123 GLsizeiptr size,
5124 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005125{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005126 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005127 {
5128 return;
5129 }
5130
5131 Buffer *buffer = mGLState.getTargetBuffer(target);
5132 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005133 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005134}
5135
Jamie Madillef300b12016-10-07 15:12:09 -04005136void Context::attachShader(GLuint program, GLuint shader)
5137{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005138 Program *programObject = mState.mShaderPrograms->getProgram(program);
5139 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005140 ASSERT(programObject && shaderObject);
5141 programObject->attachShader(shaderObject);
5142}
5143
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005144const Workarounds &Context::getWorkarounds() const
5145{
5146 return mWorkarounds;
5147}
5148
Corentin Wallez336129f2017-10-17 15:55:40 -04005149void Context::copyBufferSubData(BufferBinding readTarget,
5150 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005151 GLintptr readOffset,
5152 GLintptr writeOffset,
5153 GLsizeiptr size)
5154{
5155 // if size is zero, the copy is a successful no-op
5156 if (size == 0)
5157 {
5158 return;
5159 }
5160
5161 // TODO(jmadill): cache these.
5162 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5163 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5164
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005165 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005166}
5167
Jamie Madill01a80ee2016-11-07 12:06:18 -05005168void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5169{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005170 // Ideally we could share the program query with the validation layer if possible.
5171 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005172 ASSERT(programObject);
5173 programObject->bindAttributeLocation(index, name);
5174}
5175
Corentin Wallez336129f2017-10-17 15:55:40 -04005176void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005177{
Corentin Wallez336129f2017-10-17 15:55:40 -04005178 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5179 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005180 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005181}
5182
Corentin Wallez336129f2017-10-17 15:55:40 -04005183void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005184{
5185 bindBufferRange(target, index, buffer, 0, 0);
5186}
5187
Corentin Wallez336129f2017-10-17 15:55:40 -04005188void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005189 GLuint index,
5190 GLuint buffer,
5191 GLintptr offset,
5192 GLsizeiptr size)
5193{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005194 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5195 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5196 if (target == BufferBinding::Uniform)
5197 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005198 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005199 mStateCache.onUniformBufferStateChange(this);
5200 }
5201 else
5202 {
5203 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005204 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005205}
5206
Jamie Madill01a80ee2016-11-07 12:06:18 -05005207void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5208{
5209 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5210 {
5211 bindReadFramebuffer(framebuffer);
5212 }
5213
5214 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5215 {
5216 bindDrawFramebuffer(framebuffer);
5217 }
5218}
5219
5220void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5221{
5222 ASSERT(target == GL_RENDERBUFFER);
5223 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005224 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005225 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005226}
5227
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005228void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005229 GLsizei samples,
5230 GLenum internalformat,
5231 GLsizei width,
5232 GLsizei height,
5233 GLboolean fixedsamplelocations)
5234{
5235 Extents size(width, height, 1);
5236 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005237 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5238 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005239}
5240
Olli Etuaho89664842018-08-24 14:45:36 +03005241void Context::texStorage3DMultisample(TextureType target,
5242 GLsizei samples,
5243 GLenum internalformat,
5244 GLsizei width,
5245 GLsizei height,
5246 GLsizei depth,
5247 GLboolean fixedsamplelocations)
5248{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005249 Extents size(width, height, depth);
5250 Texture *texture = getTargetTexture(target);
5251 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5252 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005253}
5254
JiangYizhoubddc46b2016-12-09 09:50:51 +08005255void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5256{
JiangYizhou5b03f472017-01-09 10:22:53 +08005257 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5258 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005259 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005260 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005261
5262 switch (pname)
5263 {
5264 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005265 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005266 break;
5267 default:
5268 UNREACHABLE();
5269 }
5270}
5271
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005272void Context::getMultisamplefvRobust(GLenum pname,
5273 GLuint index,
5274 GLsizei bufSize,
5275 GLsizei *length,
5276 GLfloat *val)
5277{
5278 UNIMPLEMENTED();
5279}
5280
Jamie Madille8fb6402017-02-14 17:56:40 -05005281void Context::renderbufferStorage(GLenum target,
5282 GLenum internalformat,
5283 GLsizei width,
5284 GLsizei height)
5285{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005286 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5287 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5288
Jamie Madille8fb6402017-02-14 17:56:40 -05005289 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005290 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005291}
5292
5293void Context::renderbufferStorageMultisample(GLenum target,
5294 GLsizei samples,
5295 GLenum internalformat,
5296 GLsizei width,
5297 GLsizei height)
5298{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005299 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5300 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005301
5302 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005303 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005304 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005305}
5306
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005307void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5308{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005309 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005310 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005311}
5312
JiangYizhoue18e6392017-02-20 10:32:23 +08005313void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5314{
5315 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5316 QueryFramebufferParameteriv(framebuffer, pname, params);
5317}
5318
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005319void Context::getFramebufferParameterivRobust(GLenum target,
5320 GLenum pname,
5321 GLsizei bufSize,
5322 GLsizei *length,
5323 GLint *params)
5324{
5325 UNIMPLEMENTED();
5326}
5327
Jiajia Qin5451d532017-11-16 17:16:34 +08005328void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005329{
5330 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005331 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005332}
5333
Jamie Madilldec86232018-07-11 09:01:18 -04005334bool Context::getScratchBuffer(size_t requstedSizeBytes,
5335 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005336{
Jamie Madilldec86232018-07-11 09:01:18 -04005337 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005338}
5339
Jamie Madilldec86232018-07-11 09:01:18 -04005340bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5341 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005342{
Jamie Madilldec86232018-07-11 09:01:18 -04005343 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005344}
5345
Xinghua Cao10a4d432017-11-28 14:46:26 +08005346Error Context::prepareForDispatch()
5347{
Jamie Madill0cc11c62018-10-12 18:07:18 -04005348 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005349
5350 if (isRobustResourceInitEnabled())
5351 {
5352 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5353 }
5354
Jamie Madill0cc11c62018-10-12 18:07:18 -04005355 return syncDirtyBits(mComputeDirtyBits);
Xinghua Cao10a4d432017-11-28 14:46:26 +08005356}
5357
Xinghua Cao2b396592017-03-29 15:36:04 +08005358void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5359{
5360 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5361 {
5362 return;
5363 }
5364
Xinghua Cao10a4d432017-11-28 14:46:26 +08005365 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005366 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005367}
5368
Jiajia Qin5451d532017-11-16 17:16:34 +08005369void Context::dispatchComputeIndirect(GLintptr indirect)
5370{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005371 ANGLE_CONTEXT_TRY(prepareForDispatch());
5372 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005373}
5374
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005375void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005376 GLsizei levels,
5377 GLenum internalFormat,
5378 GLsizei width,
5379 GLsizei height)
5380{
5381 Extents size(width, height, 1);
5382 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005383 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005384}
5385
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005386void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005387 GLsizei levels,
5388 GLenum internalFormat,
5389 GLsizei width,
5390 GLsizei height,
5391 GLsizei depth)
5392{
5393 Extents size(width, height, depth);
5394 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005395 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005396}
5397
Jiajia Qin5451d532017-11-16 17:16:34 +08005398void Context::memoryBarrier(GLbitfield barriers)
5399{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005400 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005401}
5402
5403void Context::memoryBarrierByRegion(GLbitfield barriers)
5404{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005405 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005406}
5407
Austin Eng1bf18ce2018-10-19 15:34:02 -07005408void Context::multiDrawArrays(PrimitiveMode mode,
5409 const GLint *firsts,
5410 const GLsizei *counts,
5411 GLsizei drawcount)
5412{
5413 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5414 Program *programObject = mGLState.getLinkedProgram(this);
5415 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5416 if (hasDrawID)
5417 {
5418 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5419 {
5420 if (noopDraw(mode, counts[drawID]))
5421 {
5422 continue;
5423 }
5424 programObject->setDrawIDUniform(drawID);
5425 ANGLE_CONTEXT_TRY(
5426 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5427 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5428 counts[drawID], 1);
5429 }
5430 }
5431 else
5432 {
5433 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5434 {
5435 if (noopDraw(mode, counts[drawID]))
5436 {
5437 continue;
5438 }
5439 ANGLE_CONTEXT_TRY(
5440 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5441 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5442 counts[drawID], 1);
5443 }
5444 }
5445}
5446
5447void Context::multiDrawArraysInstanced(PrimitiveMode mode,
5448 const GLint *firsts,
5449 const GLsizei *counts,
5450 const GLsizei *instanceCounts,
5451 GLsizei drawcount)
5452{
5453 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5454 Program *programObject = mGLState.getLinkedProgram(this);
5455 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5456 if (hasDrawID)
5457 {
5458 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5459 {
5460 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5461 {
5462 continue;
5463 }
5464 programObject->setDrawIDUniform(drawID);
5465 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5466 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5467 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5468 counts[drawID], instanceCounts[drawID]);
5469 }
5470 }
5471 else
5472 {
5473 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5474 {
5475 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5476 {
5477 continue;
5478 }
5479 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5480 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5481 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5482 counts[drawID], instanceCounts[drawID]);
5483 }
5484 }
5485}
5486
5487void Context::multiDrawElements(PrimitiveMode mode,
5488 const GLsizei *counts,
5489 GLenum type,
5490 const GLsizei *offsets,
5491 GLsizei drawcount)
5492{
5493 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5494 Program *programObject = mGLState.getLinkedProgram(this);
5495 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5496 if (hasDrawID)
5497 {
5498 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5499 {
5500 if (noopDraw(mode, counts[drawID]))
5501 {
5502 continue;
5503 }
5504 programObject->setDrawIDUniform(drawID);
5505 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5506 ANGLE_CONTEXT_TRY(
5507 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5508 }
5509 }
5510 else
5511 {
5512 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5513 {
5514 if (noopDraw(mode, counts[drawID]))
5515 {
5516 continue;
5517 }
5518 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5519 ANGLE_CONTEXT_TRY(
5520 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5521 }
5522 }
5523}
5524
5525void Context::multiDrawElementsInstanced(PrimitiveMode mode,
5526 const GLsizei *counts,
5527 GLenum type,
5528 const GLsizei *offsets,
5529 const GLsizei *instanceCounts,
5530 GLsizei drawcount)
5531{
5532 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5533 Program *programObject = mGLState.getLinkedProgram(this);
5534 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5535 if (hasDrawID)
5536 {
5537 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5538 {
5539 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5540 {
5541 continue;
5542 }
5543 programObject->setDrawIDUniform(drawID);
5544 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5545 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5546 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5547 }
5548 }
5549 else
5550 {
5551 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5552 {
5553 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5554 {
5555 continue;
5556 }
5557 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5558 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5559 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5560 }
5561 }
5562}
5563
Jamie Madillc1d770e2017-04-13 17:31:24 -04005564GLenum Context::checkFramebufferStatus(GLenum target)
5565{
5566 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5567 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005568 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005569}
5570
5571void Context::compileShader(GLuint shader)
5572{
5573 Shader *shaderObject = GetValidShader(this, shader);
5574 if (!shaderObject)
5575 {
5576 return;
5577 }
5578 shaderObject->compile(this);
5579}
5580
5581void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5582{
5583 for (int i = 0; i < n; i++)
5584 {
5585 deleteBuffer(buffers[i]);
5586 }
5587}
5588
5589void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5590{
5591 for (int i = 0; i < n; i++)
5592 {
5593 if (framebuffers[i] != 0)
5594 {
5595 deleteFramebuffer(framebuffers[i]);
5596 }
5597 }
5598}
5599
5600void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5601{
5602 for (int i = 0; i < n; i++)
5603 {
5604 deleteRenderbuffer(renderbuffers[i]);
5605 }
5606}
5607
5608void Context::deleteTextures(GLsizei n, const GLuint *textures)
5609{
5610 for (int i = 0; i < n; i++)
5611 {
5612 if (textures[i] != 0)
5613 {
5614 deleteTexture(textures[i]);
5615 }
5616 }
5617}
5618
5619void Context::detachShader(GLuint program, GLuint shader)
5620{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005621 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005622 ASSERT(programObject);
5623
5624 Shader *shaderObject = getShader(shader);
5625 ASSERT(shaderObject);
5626
5627 programObject->detachShader(this, shaderObject);
5628}
5629
5630void Context::genBuffers(GLsizei n, GLuint *buffers)
5631{
5632 for (int i = 0; i < n; i++)
5633 {
5634 buffers[i] = createBuffer();
5635 }
5636}
5637
5638void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5639{
5640 for (int i = 0; i < n; i++)
5641 {
5642 framebuffers[i] = createFramebuffer();
5643 }
5644}
5645
5646void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5647{
5648 for (int i = 0; i < n; i++)
5649 {
5650 renderbuffers[i] = createRenderbuffer();
5651 }
5652}
5653
5654void Context::genTextures(GLsizei n, GLuint *textures)
5655{
5656 for (int i = 0; i < n; i++)
5657 {
5658 textures[i] = createTexture();
5659 }
5660}
5661
5662void Context::getActiveAttrib(GLuint program,
5663 GLuint index,
5664 GLsizei bufsize,
5665 GLsizei *length,
5666 GLint *size,
5667 GLenum *type,
5668 GLchar *name)
5669{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005670 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005671 ASSERT(programObject);
5672 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5673}
5674
5675void Context::getActiveUniform(GLuint program,
5676 GLuint index,
5677 GLsizei bufsize,
5678 GLsizei *length,
5679 GLint *size,
5680 GLenum *type,
5681 GLchar *name)
5682{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005683 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005684 ASSERT(programObject);
5685 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5686}
5687
5688void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5689{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005690 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005691 ASSERT(programObject);
5692 programObject->getAttachedShaders(maxcount, count, shaders);
5693}
5694
5695GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5696{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005697 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005698 ASSERT(programObject);
5699 return programObject->getAttributeLocation(name);
5700}
5701
5702void Context::getBooleanv(GLenum pname, GLboolean *params)
5703{
5704 GLenum nativeType;
5705 unsigned int numParams = 0;
5706 getQueryParameterInfo(pname, &nativeType, &numParams);
5707
5708 if (nativeType == GL_BOOL)
5709 {
5710 getBooleanvImpl(pname, params);
5711 }
5712 else
5713 {
5714 CastStateValues(this, nativeType, pname, numParams, params);
5715 }
5716}
5717
Brandon Jones59770802018-04-02 13:18:42 -07005718void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5719{
5720 getBooleanv(pname, params);
5721}
5722
Jamie Madillc1d770e2017-04-13 17:31:24 -04005723void Context::getFloatv(GLenum pname, GLfloat *params)
5724{
5725 GLenum nativeType;
5726 unsigned int numParams = 0;
5727 getQueryParameterInfo(pname, &nativeType, &numParams);
5728
5729 if (nativeType == GL_FLOAT)
5730 {
5731 getFloatvImpl(pname, params);
5732 }
5733 else
5734 {
5735 CastStateValues(this, nativeType, pname, numParams, params);
5736 }
5737}
5738
Brandon Jones59770802018-04-02 13:18:42 -07005739void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5740{
5741 getFloatv(pname, params);
5742}
5743
Jamie Madillc1d770e2017-04-13 17:31:24 -04005744void Context::getIntegerv(GLenum pname, GLint *params)
5745{
5746 GLenum nativeType;
5747 unsigned int numParams = 0;
5748 getQueryParameterInfo(pname, &nativeType, &numParams);
5749
5750 if (nativeType == GL_INT)
5751 {
5752 getIntegervImpl(pname, params);
5753 }
5754 else
5755 {
5756 CastStateValues(this, nativeType, pname, numParams, params);
5757 }
5758}
5759
Brandon Jones59770802018-04-02 13:18:42 -07005760void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5761{
5762 getIntegerv(pname, data);
5763}
5764
Jamie Madillc1d770e2017-04-13 17:31:24 -04005765void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5766{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005767 // Don't resolve link if checking the link completion status.
5768 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5769 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005770 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005771 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005772}
5773
Brandon Jones59770802018-04-02 13:18:42 -07005774void Context::getProgramivRobust(GLuint program,
5775 GLenum pname,
5776 GLsizei bufSize,
5777 GLsizei *length,
5778 GLint *params)
5779{
5780 getProgramiv(program, pname, params);
5781}
5782
Jiajia Qin5451d532017-11-16 17:16:34 +08005783void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5784{
5785 UNIMPLEMENTED();
5786}
5787
Jamie Madillbe849e42017-05-02 15:49:00 -04005788void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005789{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005790 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005791 ASSERT(programObject);
5792 programObject->getInfoLog(bufsize, length, infolog);
5793}
5794
Jiajia Qin5451d532017-11-16 17:16:34 +08005795void Context::getProgramPipelineInfoLog(GLuint pipeline,
5796 GLsizei bufSize,
5797 GLsizei *length,
5798 GLchar *infoLog)
5799{
5800 UNIMPLEMENTED();
5801}
5802
Jamie Madillc1d770e2017-04-13 17:31:24 -04005803void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5804{
5805 Shader *shaderObject = getShader(shader);
5806 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005807 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005808}
5809
Brandon Jones59770802018-04-02 13:18:42 -07005810void Context::getShaderivRobust(GLuint shader,
5811 GLenum pname,
5812 GLsizei bufSize,
5813 GLsizei *length,
5814 GLint *params)
5815{
5816 getShaderiv(shader, pname, params);
5817}
5818
Jamie Madillc1d770e2017-04-13 17:31:24 -04005819void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5820{
5821 Shader *shaderObject = getShader(shader);
5822 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005823 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005824}
5825
5826void Context::getShaderPrecisionFormat(GLenum shadertype,
5827 GLenum precisiontype,
5828 GLint *range,
5829 GLint *precision)
5830{
5831 // TODO(jmadill): Compute shaders.
5832
5833 switch (shadertype)
5834 {
5835 case GL_VERTEX_SHADER:
5836 switch (precisiontype)
5837 {
5838 case GL_LOW_FLOAT:
5839 mCaps.vertexLowpFloat.get(range, precision);
5840 break;
5841 case GL_MEDIUM_FLOAT:
5842 mCaps.vertexMediumpFloat.get(range, precision);
5843 break;
5844 case GL_HIGH_FLOAT:
5845 mCaps.vertexHighpFloat.get(range, precision);
5846 break;
5847
5848 case GL_LOW_INT:
5849 mCaps.vertexLowpInt.get(range, precision);
5850 break;
5851 case GL_MEDIUM_INT:
5852 mCaps.vertexMediumpInt.get(range, precision);
5853 break;
5854 case GL_HIGH_INT:
5855 mCaps.vertexHighpInt.get(range, precision);
5856 break;
5857
5858 default:
5859 UNREACHABLE();
5860 return;
5861 }
5862 break;
5863
5864 case GL_FRAGMENT_SHADER:
5865 switch (precisiontype)
5866 {
5867 case GL_LOW_FLOAT:
5868 mCaps.fragmentLowpFloat.get(range, precision);
5869 break;
5870 case GL_MEDIUM_FLOAT:
5871 mCaps.fragmentMediumpFloat.get(range, precision);
5872 break;
5873 case GL_HIGH_FLOAT:
5874 mCaps.fragmentHighpFloat.get(range, precision);
5875 break;
5876
5877 case GL_LOW_INT:
5878 mCaps.fragmentLowpInt.get(range, precision);
5879 break;
5880 case GL_MEDIUM_INT:
5881 mCaps.fragmentMediumpInt.get(range, precision);
5882 break;
5883 case GL_HIGH_INT:
5884 mCaps.fragmentHighpInt.get(range, precision);
5885 break;
5886
5887 default:
5888 UNREACHABLE();
5889 return;
5890 }
5891 break;
5892
5893 default:
5894 UNREACHABLE();
5895 return;
5896 }
5897}
5898
5899void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5900{
5901 Shader *shaderObject = getShader(shader);
5902 ASSERT(shaderObject);
5903 shaderObject->getSource(bufsize, length, source);
5904}
5905
5906void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5907{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005908 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005909 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005910 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005911}
5912
Brandon Jones59770802018-04-02 13:18:42 -07005913void Context::getUniformfvRobust(GLuint program,
5914 GLint location,
5915 GLsizei bufSize,
5916 GLsizei *length,
5917 GLfloat *params)
5918{
5919 getUniformfv(program, location, params);
5920}
5921
Jamie Madillc1d770e2017-04-13 17:31:24 -04005922void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5923{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005924 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005925 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005926 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005927}
5928
Brandon Jones59770802018-04-02 13:18:42 -07005929void Context::getUniformivRobust(GLuint program,
5930 GLint location,
5931 GLsizei bufSize,
5932 GLsizei *length,
5933 GLint *params)
5934{
5935 getUniformiv(program, location, params);
5936}
5937
Jamie Madillc1d770e2017-04-13 17:31:24 -04005938GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5939{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005940 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005941 ASSERT(programObject);
5942 return programObject->getUniformLocation(name);
5943}
5944
5945GLboolean Context::isBuffer(GLuint buffer)
5946{
5947 if (buffer == 0)
5948 {
5949 return GL_FALSE;
5950 }
5951
5952 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5953}
5954
5955GLboolean Context::isEnabled(GLenum cap)
5956{
5957 return mGLState.getEnableFeature(cap);
5958}
5959
5960GLboolean Context::isFramebuffer(GLuint framebuffer)
5961{
5962 if (framebuffer == 0)
5963 {
5964 return GL_FALSE;
5965 }
5966
5967 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5968}
5969
5970GLboolean Context::isProgram(GLuint program)
5971{
5972 if (program == 0)
5973 {
5974 return GL_FALSE;
5975 }
5976
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005977 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005978}
5979
5980GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5981{
5982 if (renderbuffer == 0)
5983 {
5984 return GL_FALSE;
5985 }
5986
5987 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5988}
5989
5990GLboolean Context::isShader(GLuint shader)
5991{
5992 if (shader == 0)
5993 {
5994 return GL_FALSE;
5995 }
5996
5997 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5998}
5999
6000GLboolean Context::isTexture(GLuint texture)
6001{
6002 if (texture == 0)
6003 {
6004 return GL_FALSE;
6005 }
6006
6007 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
6008}
6009
6010void Context::linkProgram(GLuint program)
6011{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006012 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006013 ASSERT(programObject);
6014 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08006015
6016 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
6017 // don't need to worry that:
6018 // 1. Draw calls after link use the new executable code or the old one depending on the link
6019 // result.
6020 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
6021 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
6022 // ProgramD3D.
6023 if (programObject->isInUse())
6024 {
Jamie Madill785e8a02018-10-04 17:42:00 -04006025 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04006026 if (programObject->isLinked())
6027 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006028 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006029 }
jchen107ae70d82018-07-06 13:47:01 +08006030 mStateCache.onProgramExecutableChange(this);
6031 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006032}
6033
6034void Context::releaseShaderCompiler()
6035{
Jamie Madill4928b7c2017-06-20 12:57:39 -04006036 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006037}
6038
6039void Context::shaderBinary(GLsizei n,
6040 const GLuint *shaders,
6041 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04006042 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04006043 GLsizei length)
6044{
6045 // No binary shader formats are supported.
6046 UNIMPLEMENTED();
6047}
6048
Olli Etuaho0ca09752018-09-24 11:00:50 +03006049void Context::bindFragDataLocationIndexed(GLuint program,
6050 GLuint colorNumber,
6051 GLuint index,
6052 const char *name)
6053{
6054 Program *programObject = getProgramNoResolveLink(program);
6055 programObject->bindFragmentOutputLocation(colorNumber, name);
6056 programObject->bindFragmentOutputIndex(index, name);
6057}
6058
6059void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
6060{
6061 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
6062}
6063
6064int Context::getFragDataIndex(GLuint program, const char *name)
6065{
6066 Program *programObject = getProgramResolveLink(program);
6067 return programObject->getFragDataIndex(name);
6068}
6069
6070int Context::getProgramResourceLocationIndex(GLuint program,
6071 GLenum programInterface,
6072 const char *name)
6073{
6074 Program *programObject = getProgramResolveLink(program);
6075 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
6076 return programObject->getFragDataIndex(name);
6077}
6078
Jamie Madillc1d770e2017-04-13 17:31:24 -04006079void Context::shaderSource(GLuint shader,
6080 GLsizei count,
6081 const GLchar *const *string,
6082 const GLint *length)
6083{
6084 Shader *shaderObject = getShader(shader);
6085 ASSERT(shaderObject);
6086 shaderObject->setSource(count, string, length);
6087}
6088
6089void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
6090{
6091 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
6092}
6093
6094void Context::stencilMask(GLuint mask)
6095{
6096 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
6097}
6098
6099void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
6100{
6101 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
6102}
6103
6104void Context::uniform1f(GLint location, GLfloat x)
6105{
6106 Program *program = mGLState.getProgram();
6107 program->setUniform1fv(location, 1, &x);
6108}
6109
6110void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
6111{
6112 Program *program = mGLState.getProgram();
6113 program->setUniform1fv(location, count, v);
6114}
6115
Jamie Madill7e4eff12018-08-08 15:49:26 -04006116void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006117{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006118 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04006119 {
6120 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006121 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04006122 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006123}
6124
Jamie Madill7e4eff12018-08-08 15:49:26 -04006125void Context::uniform1i(GLint location, GLint x)
6126{
6127 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
6128}
6129
Jamie Madillc1d770e2017-04-13 17:31:24 -04006130void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
6131{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006132 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006133}
6134
6135void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
6136{
6137 GLfloat xy[2] = {x, y};
6138 Program *program = mGLState.getProgram();
6139 program->setUniform2fv(location, 1, xy);
6140}
6141
6142void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
6143{
6144 Program *program = mGLState.getProgram();
6145 program->setUniform2fv(location, count, v);
6146}
6147
6148void Context::uniform2i(GLint location, GLint x, GLint y)
6149{
6150 GLint xy[2] = {x, y};
6151 Program *program = mGLState.getProgram();
6152 program->setUniform2iv(location, 1, xy);
6153}
6154
6155void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6156{
6157 Program *program = mGLState.getProgram();
6158 program->setUniform2iv(location, count, v);
6159}
6160
6161void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6162{
6163 GLfloat xyz[3] = {x, y, z};
6164 Program *program = mGLState.getProgram();
6165 program->setUniform3fv(location, 1, xyz);
6166}
6167
6168void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6169{
6170 Program *program = mGLState.getProgram();
6171 program->setUniform3fv(location, count, v);
6172}
6173
6174void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6175{
6176 GLint xyz[3] = {x, y, z};
6177 Program *program = mGLState.getProgram();
6178 program->setUniform3iv(location, 1, xyz);
6179}
6180
6181void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6182{
6183 Program *program = mGLState.getProgram();
6184 program->setUniform3iv(location, count, v);
6185}
6186
6187void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6188{
6189 GLfloat xyzw[4] = {x, y, z, w};
6190 Program *program = mGLState.getProgram();
6191 program->setUniform4fv(location, 1, xyzw);
6192}
6193
6194void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6195{
6196 Program *program = mGLState.getProgram();
6197 program->setUniform4fv(location, count, v);
6198}
6199
6200void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6201{
6202 GLint xyzw[4] = {x, y, z, w};
6203 Program *program = mGLState.getProgram();
6204 program->setUniform4iv(location, 1, xyzw);
6205}
6206
6207void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6208{
6209 Program *program = mGLState.getProgram();
6210 program->setUniform4iv(location, count, v);
6211}
6212
6213void Context::uniformMatrix2fv(GLint location,
6214 GLsizei count,
6215 GLboolean transpose,
6216 const GLfloat *value)
6217{
6218 Program *program = mGLState.getProgram();
6219 program->setUniformMatrix2fv(location, count, transpose, value);
6220}
6221
6222void Context::uniformMatrix3fv(GLint location,
6223 GLsizei count,
6224 GLboolean transpose,
6225 const GLfloat *value)
6226{
6227 Program *program = mGLState.getProgram();
6228 program->setUniformMatrix3fv(location, count, transpose, value);
6229}
6230
6231void Context::uniformMatrix4fv(GLint location,
6232 GLsizei count,
6233 GLboolean transpose,
6234 const GLfloat *value)
6235{
6236 Program *program = mGLState.getProgram();
6237 program->setUniformMatrix4fv(location, count, transpose, value);
6238}
6239
6240void Context::validateProgram(GLuint program)
6241{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006242 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006243 ASSERT(programObject);
6244 programObject->validate(mCaps);
6245}
6246
Jiajia Qin5451d532017-11-16 17:16:34 +08006247void Context::validateProgramPipeline(GLuint pipeline)
6248{
6249 UNIMPLEMENTED();
6250}
6251
Jamie Madilld04908b2017-06-09 14:15:35 -04006252void Context::getProgramBinary(GLuint program,
6253 GLsizei bufSize,
6254 GLsizei *length,
6255 GLenum *binaryFormat,
6256 void *binary)
6257{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006258 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006259 ASSERT(programObject != nullptr);
6260
6261 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6262}
6263
6264void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6265{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006266 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006267 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006268
Jamie Madilld04908b2017-06-09 14:15:35 -04006269 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006270 if (programObject->isInUse())
6271 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006272 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006273 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006274 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006275}
6276
Jamie Madillff325f12017-08-26 15:06:05 -04006277void Context::uniform1ui(GLint location, GLuint v0)
6278{
6279 Program *program = mGLState.getProgram();
6280 program->setUniform1uiv(location, 1, &v0);
6281}
6282
6283void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6284{
6285 Program *program = mGLState.getProgram();
6286 const GLuint xy[] = {v0, v1};
6287 program->setUniform2uiv(location, 1, xy);
6288}
6289
6290void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6291{
6292 Program *program = mGLState.getProgram();
6293 const GLuint xyz[] = {v0, v1, v2};
6294 program->setUniform3uiv(location, 1, xyz);
6295}
6296
6297void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6298{
6299 Program *program = mGLState.getProgram();
6300 const GLuint xyzw[] = {v0, v1, v2, v3};
6301 program->setUniform4uiv(location, 1, xyzw);
6302}
6303
6304void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6305{
6306 Program *program = mGLState.getProgram();
6307 program->setUniform1uiv(location, count, value);
6308}
6309void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6310{
6311 Program *program = mGLState.getProgram();
6312 program->setUniform2uiv(location, count, value);
6313}
6314
6315void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6316{
6317 Program *program = mGLState.getProgram();
6318 program->setUniform3uiv(location, count, value);
6319}
6320
6321void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6322{
6323 Program *program = mGLState.getProgram();
6324 program->setUniform4uiv(location, count, value);
6325}
6326
Jamie Madillf0e04492017-08-26 15:28:42 -04006327void Context::genQueries(GLsizei n, GLuint *ids)
6328{
6329 for (GLsizei i = 0; i < n; i++)
6330 {
6331 GLuint handle = mQueryHandleAllocator.allocate();
6332 mQueryMap.assign(handle, nullptr);
6333 ids[i] = handle;
6334 }
6335}
6336
6337void Context::deleteQueries(GLsizei n, const GLuint *ids)
6338{
6339 for (int i = 0; i < n; i++)
6340 {
6341 GLuint query = ids[i];
6342
6343 Query *queryObject = nullptr;
6344 if (mQueryMap.erase(query, &queryObject))
6345 {
6346 mQueryHandleAllocator.release(query);
6347 if (queryObject)
6348 {
6349 queryObject->release(this);
6350 }
6351 }
6352 }
6353}
6354
6355GLboolean Context::isQuery(GLuint id)
6356{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006357 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006358}
6359
Jamie Madillc8c95812017-08-26 18:40:09 -04006360void Context::uniformMatrix2x3fv(GLint location,
6361 GLsizei count,
6362 GLboolean transpose,
6363 const GLfloat *value)
6364{
6365 Program *program = mGLState.getProgram();
6366 program->setUniformMatrix2x3fv(location, count, transpose, value);
6367}
6368
6369void Context::uniformMatrix3x2fv(GLint location,
6370 GLsizei count,
6371 GLboolean transpose,
6372 const GLfloat *value)
6373{
6374 Program *program = mGLState.getProgram();
6375 program->setUniformMatrix3x2fv(location, count, transpose, value);
6376}
6377
6378void Context::uniformMatrix2x4fv(GLint location,
6379 GLsizei count,
6380 GLboolean transpose,
6381 const GLfloat *value)
6382{
6383 Program *program = mGLState.getProgram();
6384 program->setUniformMatrix2x4fv(location, count, transpose, value);
6385}
6386
6387void Context::uniformMatrix4x2fv(GLint location,
6388 GLsizei count,
6389 GLboolean transpose,
6390 const GLfloat *value)
6391{
6392 Program *program = mGLState.getProgram();
6393 program->setUniformMatrix4x2fv(location, count, transpose, value);
6394}
6395
6396void Context::uniformMatrix3x4fv(GLint location,
6397 GLsizei count,
6398 GLboolean transpose,
6399 const GLfloat *value)
6400{
6401 Program *program = mGLState.getProgram();
6402 program->setUniformMatrix3x4fv(location, count, transpose, value);
6403}
6404
6405void Context::uniformMatrix4x3fv(GLint location,
6406 GLsizei count,
6407 GLboolean transpose,
6408 const GLfloat *value)
6409{
6410 Program *program = mGLState.getProgram();
6411 program->setUniformMatrix4x3fv(location, count, transpose, value);
6412}
6413
Jamie Madilld7576732017-08-26 18:49:50 -04006414void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6415{
6416 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6417 {
6418 GLuint vertexArray = arrays[arrayIndex];
6419
6420 if (arrays[arrayIndex] != 0)
6421 {
6422 VertexArray *vertexArrayObject = nullptr;
6423 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6424 {
6425 if (vertexArrayObject != nullptr)
6426 {
6427 detachVertexArray(vertexArray);
6428 vertexArrayObject->onDestroy(this);
6429 }
6430
6431 mVertexArrayHandleAllocator.release(vertexArray);
6432 }
6433 }
6434 }
6435}
6436
6437void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6438{
6439 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6440 {
6441 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6442 mVertexArrayMap.assign(vertexArray, nullptr);
6443 arrays[arrayIndex] = vertexArray;
6444 }
6445}
6446
6447bool Context::isVertexArray(GLuint array)
6448{
6449 if (array == 0)
6450 {
6451 return GL_FALSE;
6452 }
6453
6454 VertexArray *vao = getVertexArray(array);
6455 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6456}
6457
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006458void Context::endTransformFeedback()
6459{
6460 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6461 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006462 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006463}
6464
6465void Context::transformFeedbackVaryings(GLuint program,
6466 GLsizei count,
6467 const GLchar *const *varyings,
6468 GLenum bufferMode)
6469{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006470 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006471 ASSERT(programObject);
6472 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6473}
6474
6475void Context::getTransformFeedbackVarying(GLuint program,
6476 GLuint index,
6477 GLsizei bufSize,
6478 GLsizei *length,
6479 GLsizei *size,
6480 GLenum *type,
6481 GLchar *name)
6482{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006483 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006484 ASSERT(programObject);
6485 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6486}
6487
6488void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6489{
6490 for (int i = 0; i < n; i++)
6491 {
6492 GLuint transformFeedback = ids[i];
6493 if (transformFeedback == 0)
6494 {
6495 continue;
6496 }
6497
6498 TransformFeedback *transformFeedbackObject = nullptr;
6499 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6500 {
6501 if (transformFeedbackObject != nullptr)
6502 {
6503 detachTransformFeedback(transformFeedback);
6504 transformFeedbackObject->release(this);
6505 }
6506
6507 mTransformFeedbackHandleAllocator.release(transformFeedback);
6508 }
6509 }
6510}
6511
6512void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6513{
6514 for (int i = 0; i < n; i++)
6515 {
6516 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6517 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6518 ids[i] = transformFeedback;
6519 }
6520}
6521
6522bool Context::isTransformFeedback(GLuint id)
6523{
6524 if (id == 0)
6525 {
6526 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6527 // returns FALSE
6528 return GL_FALSE;
6529 }
6530
6531 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6532 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6533}
6534
6535void Context::pauseTransformFeedback()
6536{
6537 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6538 transformFeedback->pause();
6539}
6540
6541void Context::resumeTransformFeedback()
6542{
6543 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6544 transformFeedback->resume();
6545}
6546
Jamie Madill12e957f2017-08-26 21:42:26 -04006547void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6548{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006549 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006550 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006551}
6552
Brandon Jones59770802018-04-02 13:18:42 -07006553void Context::getUniformuivRobust(GLuint program,
6554 GLint location,
6555 GLsizei bufSize,
6556 GLsizei *length,
6557 GLuint *params)
6558{
6559 getUniformuiv(program, location, params);
6560}
6561
Jamie Madill12e957f2017-08-26 21:42:26 -04006562GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6563{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006564 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006565 return programObject->getFragDataLocation(name);
6566}
6567
6568void Context::getUniformIndices(GLuint program,
6569 GLsizei uniformCount,
6570 const GLchar *const *uniformNames,
6571 GLuint *uniformIndices)
6572{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006573 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006574 if (!programObject->isLinked())
6575 {
6576 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6577 {
6578 uniformIndices[uniformId] = GL_INVALID_INDEX;
6579 }
6580 }
6581 else
6582 {
6583 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6584 {
6585 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6586 }
6587 }
6588}
6589
6590void Context::getActiveUniformsiv(GLuint program,
6591 GLsizei uniformCount,
6592 const GLuint *uniformIndices,
6593 GLenum pname,
6594 GLint *params)
6595{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006596 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006597 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6598 {
6599 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006600 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006601 }
6602}
6603
6604GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6605{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006606 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006607 return programObject->getUniformBlockIndex(uniformBlockName);
6608}
6609
6610void Context::getActiveUniformBlockiv(GLuint program,
6611 GLuint uniformBlockIndex,
6612 GLenum pname,
6613 GLint *params)
6614{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006615 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006616 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6617}
6618
Brandon Jones59770802018-04-02 13:18:42 -07006619void Context::getActiveUniformBlockivRobust(GLuint program,
6620 GLuint uniformBlockIndex,
6621 GLenum pname,
6622 GLsizei bufSize,
6623 GLsizei *length,
6624 GLint *params)
6625{
6626 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6627}
6628
Jamie Madill12e957f2017-08-26 21:42:26 -04006629void Context::getActiveUniformBlockName(GLuint program,
6630 GLuint uniformBlockIndex,
6631 GLsizei bufSize,
6632 GLsizei *length,
6633 GLchar *uniformBlockName)
6634{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006635 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006636 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6637}
6638
6639void Context::uniformBlockBinding(GLuint program,
6640 GLuint uniformBlockIndex,
6641 GLuint uniformBlockBinding)
6642{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006643 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006644 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006645
Jamie Madill956ab4d2018-10-10 16:13:03 -04006646 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006647 if (programObject->isInUse())
6648 {
6649 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006650 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006651 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006652}
6653
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006654GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6655{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006656 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6657 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006658
Jamie Madill70b5bb02017-08-28 13:32:37 -04006659 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006660 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006661 if (error.isError())
6662 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006663 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006664 handleError(error);
6665 return nullptr;
6666 }
6667
Jamie Madill70b5bb02017-08-28 13:32:37 -04006668 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006669}
6670
6671GLboolean Context::isSync(GLsync sync)
6672{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006673 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006674}
6675
6676GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6677{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006678 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006679
6680 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006681 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006682 return result;
6683}
6684
6685void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6686{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006687 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006688 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006689}
6690
6691void Context::getInteger64v(GLenum pname, GLint64 *params)
6692{
6693 GLenum nativeType = GL_NONE;
6694 unsigned int numParams = 0;
6695 getQueryParameterInfo(pname, &nativeType, &numParams);
6696
6697 if (nativeType == GL_INT_64_ANGLEX)
6698 {
6699 getInteger64vImpl(pname, params);
6700 }
6701 else
6702 {
6703 CastStateValues(this, nativeType, pname, numParams, params);
6704 }
6705}
6706
Brandon Jones59770802018-04-02 13:18:42 -07006707void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6708{
6709 getInteger64v(pname, data);
6710}
6711
Corentin Wallez336129f2017-10-17 15:55:40 -04006712void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006713{
6714 Buffer *buffer = mGLState.getTargetBuffer(target);
6715 QueryBufferParameteri64v(buffer, pname, params);
6716}
6717
Brandon Jones59770802018-04-02 13:18:42 -07006718void Context::getBufferParameteri64vRobust(BufferBinding target,
6719 GLenum pname,
6720 GLsizei bufSize,
6721 GLsizei *length,
6722 GLint64 *params)
6723{
6724 getBufferParameteri64v(target, pname, params);
6725}
6726
Jamie Madill3ef140a2017-08-26 23:11:21 -04006727void Context::genSamplers(GLsizei count, GLuint *samplers)
6728{
6729 for (int i = 0; i < count; i++)
6730 {
6731 samplers[i] = mState.mSamplers->createSampler();
6732 }
6733}
6734
6735void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6736{
6737 for (int i = 0; i < count; i++)
6738 {
6739 GLuint sampler = samplers[i];
6740
6741 if (mState.mSamplers->getSampler(sampler))
6742 {
6743 detachSampler(sampler);
6744 }
6745
6746 mState.mSamplers->deleteObject(this, sampler);
6747 }
6748}
6749
6750void Context::getInternalformativ(GLenum target,
6751 GLenum internalformat,
6752 GLenum pname,
6753 GLsizei bufSize,
6754 GLint *params)
6755{
6756 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6757 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6758}
6759
Brandon Jones59770802018-04-02 13:18:42 -07006760void Context::getInternalformativRobust(GLenum target,
6761 GLenum internalformat,
6762 GLenum pname,
6763 GLsizei bufSize,
6764 GLsizei *length,
6765 GLint *params)
6766{
6767 getInternalformativ(target, internalformat, pname, bufSize, params);
6768}
6769
Jiajia Qin5451d532017-11-16 17:16:34 +08006770void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6771{
6772 programUniform1iv(program, location, 1, &v0);
6773}
6774
6775void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6776{
6777 GLint xy[2] = {v0, v1};
6778 programUniform2iv(program, location, 1, xy);
6779}
6780
6781void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6782{
6783 GLint xyz[3] = {v0, v1, v2};
6784 programUniform3iv(program, location, 1, xyz);
6785}
6786
6787void Context::programUniform4i(GLuint program,
6788 GLint location,
6789 GLint v0,
6790 GLint v1,
6791 GLint v2,
6792 GLint v3)
6793{
6794 GLint xyzw[4] = {v0, v1, v2, v3};
6795 programUniform4iv(program, location, 1, xyzw);
6796}
6797
6798void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6799{
6800 programUniform1uiv(program, location, 1, &v0);
6801}
6802
6803void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6804{
6805 GLuint xy[2] = {v0, v1};
6806 programUniform2uiv(program, location, 1, xy);
6807}
6808
6809void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6810{
6811 GLuint xyz[3] = {v0, v1, v2};
6812 programUniform3uiv(program, location, 1, xyz);
6813}
6814
6815void Context::programUniform4ui(GLuint program,
6816 GLint location,
6817 GLuint v0,
6818 GLuint v1,
6819 GLuint v2,
6820 GLuint v3)
6821{
6822 GLuint xyzw[4] = {v0, v1, v2, v3};
6823 programUniform4uiv(program, location, 1, xyzw);
6824}
6825
6826void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6827{
6828 programUniform1fv(program, location, 1, &v0);
6829}
6830
6831void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6832{
6833 GLfloat xy[2] = {v0, v1};
6834 programUniform2fv(program, location, 1, xy);
6835}
6836
6837void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6838{
6839 GLfloat xyz[3] = {v0, v1, v2};
6840 programUniform3fv(program, location, 1, xyz);
6841}
6842
6843void Context::programUniform4f(GLuint program,
6844 GLint location,
6845 GLfloat v0,
6846 GLfloat v1,
6847 GLfloat v2,
6848 GLfloat v3)
6849{
6850 GLfloat xyzw[4] = {v0, v1, v2, v3};
6851 programUniform4fv(program, location, 1, xyzw);
6852}
6853
Jamie Madill81c2e252017-09-09 23:32:46 -04006854void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6855{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006856 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006857 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006858 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006859}
6860
Jiajia Qin5451d532017-11-16 17:16:34 +08006861void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6862{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006863 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006864 ASSERT(programObject);
6865 programObject->setUniform2iv(location, count, value);
6866}
6867
6868void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6869{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006870 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006871 ASSERT(programObject);
6872 programObject->setUniform3iv(location, count, value);
6873}
6874
6875void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6876{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006877 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006878 ASSERT(programObject);
6879 programObject->setUniform4iv(location, count, value);
6880}
6881
6882void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6883{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006884 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006885 ASSERT(programObject);
6886 programObject->setUniform1uiv(location, count, value);
6887}
6888
6889void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6890{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006891 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006892 ASSERT(programObject);
6893 programObject->setUniform2uiv(location, count, value);
6894}
6895
6896void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6897{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006898 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006899 ASSERT(programObject);
6900 programObject->setUniform3uiv(location, count, value);
6901}
6902
6903void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6904{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006905 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006906 ASSERT(programObject);
6907 programObject->setUniform4uiv(location, count, value);
6908}
6909
6910void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6911{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006912 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006913 ASSERT(programObject);
6914 programObject->setUniform1fv(location, count, value);
6915}
6916
6917void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6918{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006919 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006920 ASSERT(programObject);
6921 programObject->setUniform2fv(location, count, value);
6922}
6923
6924void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6925{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006926 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006927 ASSERT(programObject);
6928 programObject->setUniform3fv(location, count, value);
6929}
6930
6931void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6932{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006933 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006934 ASSERT(programObject);
6935 programObject->setUniform4fv(location, count, value);
6936}
6937
6938void Context::programUniformMatrix2fv(GLuint program,
6939 GLint location,
6940 GLsizei count,
6941 GLboolean transpose,
6942 const GLfloat *value)
6943{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006944 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006945 ASSERT(programObject);
6946 programObject->setUniformMatrix2fv(location, count, transpose, value);
6947}
6948
6949void Context::programUniformMatrix3fv(GLuint program,
6950 GLint location,
6951 GLsizei count,
6952 GLboolean transpose,
6953 const GLfloat *value)
6954{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006955 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006956 ASSERT(programObject);
6957 programObject->setUniformMatrix3fv(location, count, transpose, value);
6958}
6959
6960void Context::programUniformMatrix4fv(GLuint program,
6961 GLint location,
6962 GLsizei count,
6963 GLboolean transpose,
6964 const GLfloat *value)
6965{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006966 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006967 ASSERT(programObject);
6968 programObject->setUniformMatrix4fv(location, count, transpose, value);
6969}
6970
6971void Context::programUniformMatrix2x3fv(GLuint program,
6972 GLint location,
6973 GLsizei count,
6974 GLboolean transpose,
6975 const GLfloat *value)
6976{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006977 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006978 ASSERT(programObject);
6979 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6980}
6981
6982void Context::programUniformMatrix3x2fv(GLuint program,
6983 GLint location,
6984 GLsizei count,
6985 GLboolean transpose,
6986 const GLfloat *value)
6987{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006988 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006989 ASSERT(programObject);
6990 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6991}
6992
6993void Context::programUniformMatrix2x4fv(GLuint program,
6994 GLint location,
6995 GLsizei count,
6996 GLboolean transpose,
6997 const GLfloat *value)
6998{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006999 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007000 ASSERT(programObject);
7001 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
7002}
7003
7004void Context::programUniformMatrix4x2fv(GLuint program,
7005 GLint location,
7006 GLsizei count,
7007 GLboolean transpose,
7008 const GLfloat *value)
7009{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007010 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007011 ASSERT(programObject);
7012 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
7013}
7014
7015void Context::programUniformMatrix3x4fv(GLuint program,
7016 GLint location,
7017 GLsizei count,
7018 GLboolean transpose,
7019 const GLfloat *value)
7020{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007021 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007022 ASSERT(programObject);
7023 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
7024}
7025
7026void Context::programUniformMatrix4x3fv(GLuint program,
7027 GLint location,
7028 GLsizei count,
7029 GLboolean transpose,
7030 const GLfloat *value)
7031{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007032 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007033 ASSERT(programObject);
7034 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
7035}
7036
Jamie Madill81c2e252017-09-09 23:32:46 -04007037void Context::onTextureChange(const Texture *texture)
7038{
7039 // Conservatively assume all textures are dirty.
7040 // TODO(jmadill): More fine-grained update.
7041 mGLState.setObjectDirty(GL_TEXTURE);
7042}
7043
James Darpiniane8a93c62018-01-04 18:02:24 -08007044bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
7045{
7046 return mGLState.isCurrentTransformFeedback(tf);
7047}
James Darpiniane8a93c62018-01-04 18:02:24 -08007048
Yunchao Hea336b902017-08-02 16:05:21 +08007049void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
7050{
7051 for (int i = 0; i < count; i++)
7052 {
7053 pipelines[i] = createProgramPipeline();
7054 }
7055}
7056
7057void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
7058{
7059 for (int i = 0; i < count; i++)
7060 {
7061 if (pipelines[i] != 0)
7062 {
7063 deleteProgramPipeline(pipelines[i]);
7064 }
7065 }
7066}
7067
7068GLboolean Context::isProgramPipeline(GLuint pipeline)
7069{
7070 if (pipeline == 0)
7071 {
7072 return GL_FALSE;
7073 }
7074
7075 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
7076}
7077
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007078void Context::finishFenceNV(GLuint fence)
7079{
7080 FenceNV *fenceObject = getFenceNV(fence);
7081
7082 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04007083 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007084}
7085
7086void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
7087{
7088 FenceNV *fenceObject = getFenceNV(fence);
7089
7090 ASSERT(fenceObject && fenceObject->isSet());
7091
7092 switch (pname)
7093 {
7094 case GL_FENCE_STATUS_NV:
7095 {
7096 // GL_NV_fence spec:
7097 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
7098 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
7099 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
7100 GLboolean status = GL_TRUE;
7101 if (fenceObject->getStatus() != GL_TRUE)
7102 {
Jamie Madilla0691b72018-07-25 10:41:22 -04007103 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007104 }
7105 *params = status;
7106 break;
7107 }
7108
7109 case GL_FENCE_CONDITION_NV:
7110 {
7111 *params = static_cast<GLint>(fenceObject->getCondition());
7112 break;
7113 }
7114
7115 default:
7116 UNREACHABLE();
7117 }
7118}
7119
7120void Context::getTranslatedShaderSource(GLuint shader,
7121 GLsizei bufsize,
7122 GLsizei *length,
7123 GLchar *source)
7124{
7125 Shader *shaderObject = getShader(shader);
7126 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08007127 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007128}
7129
7130void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
7131{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007132 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007133 ASSERT(programObject);
7134
7135 programObject->getUniformfv(this, location, params);
7136}
7137
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007138void Context::getnUniformfvRobust(GLuint program,
7139 GLint location,
7140 GLsizei bufSize,
7141 GLsizei *length,
7142 GLfloat *params)
7143{
7144 UNIMPLEMENTED();
7145}
7146
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007147void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
7148{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007149 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007150 ASSERT(programObject);
7151
7152 programObject->getUniformiv(this, location, params);
7153}
7154
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007155void Context::getnUniformivRobust(GLuint program,
7156 GLint location,
7157 GLsizei bufSize,
7158 GLsizei *length,
7159 GLint *params)
7160{
7161 UNIMPLEMENTED();
7162}
7163
7164void Context::getnUniformuivRobust(GLuint program,
7165 GLint location,
7166 GLsizei bufSize,
7167 GLsizei *length,
7168 GLuint *params)
7169{
7170 UNIMPLEMENTED();
7171}
7172
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007173GLboolean Context::isFenceNV(GLuint fence)
7174{
7175 FenceNV *fenceObject = getFenceNV(fence);
7176
7177 if (fenceObject == nullptr)
7178 {
7179 return GL_FALSE;
7180 }
7181
7182 // GL_NV_fence spec:
7183 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7184 // existing fence.
7185 return fenceObject->isSet();
7186}
7187
7188void Context::readnPixels(GLint x,
7189 GLint y,
7190 GLsizei width,
7191 GLsizei height,
7192 GLenum format,
7193 GLenum type,
7194 GLsizei bufSize,
7195 void *data)
7196{
7197 return readPixels(x, y, width, height, format, type, data);
7198}
7199
Jamie Madill007530e2017-12-28 14:27:04 -05007200void Context::setFenceNV(GLuint fence, GLenum condition)
7201{
7202 ASSERT(condition == GL_ALL_COMPLETED_NV);
7203
7204 FenceNV *fenceObject = getFenceNV(fence);
7205 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04007206 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007207}
7208
7209GLboolean Context::testFenceNV(GLuint fence)
7210{
7211 FenceNV *fenceObject = getFenceNV(fence);
7212
7213 ASSERT(fenceObject != nullptr);
7214 ASSERT(fenceObject->isSet() == GL_TRUE);
7215
7216 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007217 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007218 if (error.isError())
7219 {
7220 handleError(error);
7221 return GL_TRUE;
7222 }
7223
7224 return result;
7225}
7226
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007227void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007228{
7229 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007230 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007231 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007232}
7233
Jamie Madillfa920eb2018-01-04 11:45:50 -05007234void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007235{
7236 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007237 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007238 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7239}
7240
Jamie Madillfa920eb2018-01-04 11:45:50 -05007241void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7242{
7243 UNIMPLEMENTED();
7244}
7245
Jamie Madill5b772312018-03-08 20:28:32 -05007246bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7247{
7248 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7249 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7250 // to the fact that it is stored internally as a float, and so would require conversion
7251 // if returned from Context::getIntegerv. Since this conversion is already implemented
7252 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7253 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7254 // application.
7255 switch (pname)
7256 {
7257 case GL_COMPRESSED_TEXTURE_FORMATS:
7258 {
7259 *type = GL_INT;
7260 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7261 return true;
7262 }
7263 case GL_SHADER_BINARY_FORMATS:
7264 {
7265 *type = GL_INT;
7266 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7267 return true;
7268 }
7269
7270 case GL_MAX_VERTEX_ATTRIBS:
7271 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7272 case GL_MAX_VARYING_VECTORS:
7273 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7274 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7275 case GL_MAX_TEXTURE_IMAGE_UNITS:
7276 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7277 case GL_MAX_RENDERBUFFER_SIZE:
7278 case GL_NUM_SHADER_BINARY_FORMATS:
7279 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7280 case GL_ARRAY_BUFFER_BINDING:
7281 case GL_FRAMEBUFFER_BINDING:
7282 case GL_RENDERBUFFER_BINDING:
7283 case GL_CURRENT_PROGRAM:
7284 case GL_PACK_ALIGNMENT:
7285 case GL_UNPACK_ALIGNMENT:
7286 case GL_GENERATE_MIPMAP_HINT:
7287 case GL_RED_BITS:
7288 case GL_GREEN_BITS:
7289 case GL_BLUE_BITS:
7290 case GL_ALPHA_BITS:
7291 case GL_DEPTH_BITS:
7292 case GL_STENCIL_BITS:
7293 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7294 case GL_CULL_FACE_MODE:
7295 case GL_FRONT_FACE:
7296 case GL_ACTIVE_TEXTURE:
7297 case GL_STENCIL_FUNC:
7298 case GL_STENCIL_VALUE_MASK:
7299 case GL_STENCIL_REF:
7300 case GL_STENCIL_FAIL:
7301 case GL_STENCIL_PASS_DEPTH_FAIL:
7302 case GL_STENCIL_PASS_DEPTH_PASS:
7303 case GL_STENCIL_BACK_FUNC:
7304 case GL_STENCIL_BACK_VALUE_MASK:
7305 case GL_STENCIL_BACK_REF:
7306 case GL_STENCIL_BACK_FAIL:
7307 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7308 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7309 case GL_DEPTH_FUNC:
7310 case GL_BLEND_SRC_RGB:
7311 case GL_BLEND_SRC_ALPHA:
7312 case GL_BLEND_DST_RGB:
7313 case GL_BLEND_DST_ALPHA:
7314 case GL_BLEND_EQUATION_RGB:
7315 case GL_BLEND_EQUATION_ALPHA:
7316 case GL_STENCIL_WRITEMASK:
7317 case GL_STENCIL_BACK_WRITEMASK:
7318 case GL_STENCIL_CLEAR_VALUE:
7319 case GL_SUBPIXEL_BITS:
7320 case GL_MAX_TEXTURE_SIZE:
7321 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7322 case GL_SAMPLE_BUFFERS:
7323 case GL_SAMPLES:
7324 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7325 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7326 case GL_TEXTURE_BINDING_2D:
7327 case GL_TEXTURE_BINDING_CUBE_MAP:
7328 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7329 {
7330 *type = GL_INT;
7331 *numParams = 1;
7332 return true;
7333 }
7334 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7335 {
7336 if (!getExtensions().packReverseRowOrder)
7337 {
7338 return false;
7339 }
7340 *type = GL_INT;
7341 *numParams = 1;
7342 return true;
7343 }
7344 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7345 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7346 {
7347 if (!getExtensions().textureRectangle)
7348 {
7349 return false;
7350 }
7351 *type = GL_INT;
7352 *numParams = 1;
7353 return true;
7354 }
7355 case GL_MAX_DRAW_BUFFERS_EXT:
7356 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7357 {
7358 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7359 {
7360 return false;
7361 }
7362 *type = GL_INT;
7363 *numParams = 1;
7364 return true;
7365 }
7366 case GL_MAX_VIEWPORT_DIMS:
7367 {
7368 *type = GL_INT;
7369 *numParams = 2;
7370 return true;
7371 }
7372 case GL_VIEWPORT:
7373 case GL_SCISSOR_BOX:
7374 {
7375 *type = GL_INT;
7376 *numParams = 4;
7377 return true;
7378 }
7379 case GL_SHADER_COMPILER:
7380 case GL_SAMPLE_COVERAGE_INVERT:
7381 case GL_DEPTH_WRITEMASK:
7382 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7383 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7384 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7385 // bool-natural
7386 case GL_SAMPLE_COVERAGE:
7387 case GL_SCISSOR_TEST:
7388 case GL_STENCIL_TEST:
7389 case GL_DEPTH_TEST:
7390 case GL_BLEND:
7391 case GL_DITHER:
7392 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7393 {
7394 *type = GL_BOOL;
7395 *numParams = 1;
7396 return true;
7397 }
7398 case GL_COLOR_WRITEMASK:
7399 {
7400 *type = GL_BOOL;
7401 *numParams = 4;
7402 return true;
7403 }
7404 case GL_POLYGON_OFFSET_FACTOR:
7405 case GL_POLYGON_OFFSET_UNITS:
7406 case GL_SAMPLE_COVERAGE_VALUE:
7407 case GL_DEPTH_CLEAR_VALUE:
7408 case GL_LINE_WIDTH:
7409 {
7410 *type = GL_FLOAT;
7411 *numParams = 1;
7412 return true;
7413 }
7414 case GL_ALIASED_LINE_WIDTH_RANGE:
7415 case GL_ALIASED_POINT_SIZE_RANGE:
7416 case GL_DEPTH_RANGE:
7417 {
7418 *type = GL_FLOAT;
7419 *numParams = 2;
7420 return true;
7421 }
7422 case GL_COLOR_CLEAR_VALUE:
7423 case GL_BLEND_COLOR:
7424 {
7425 *type = GL_FLOAT;
7426 *numParams = 4;
7427 return true;
7428 }
7429 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7430 if (!getExtensions().textureFilterAnisotropic)
7431 {
7432 return false;
7433 }
7434 *type = GL_FLOAT;
7435 *numParams = 1;
7436 return true;
7437 case GL_TIMESTAMP_EXT:
7438 if (!getExtensions().disjointTimerQuery)
7439 {
7440 return false;
7441 }
7442 *type = GL_INT_64_ANGLEX;
7443 *numParams = 1;
7444 return true;
7445 case GL_GPU_DISJOINT_EXT:
7446 if (!getExtensions().disjointTimerQuery)
7447 {
7448 return false;
7449 }
7450 *type = GL_INT;
7451 *numParams = 1;
7452 return true;
7453 case GL_COVERAGE_MODULATION_CHROMIUM:
7454 if (!getExtensions().framebufferMixedSamples)
7455 {
7456 return false;
7457 }
7458 *type = GL_INT;
7459 *numParams = 1;
7460 return true;
7461 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7462 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7463 {
7464 return false;
7465 }
7466 *type = GL_INT;
7467 *numParams = 1;
7468 return true;
7469 }
7470
7471 if (getExtensions().debug)
7472 {
7473 switch (pname)
7474 {
7475 case GL_DEBUG_LOGGED_MESSAGES:
7476 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7477 case GL_DEBUG_GROUP_STACK_DEPTH:
7478 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7479 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7480 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7481 case GL_MAX_LABEL_LENGTH:
7482 *type = GL_INT;
7483 *numParams = 1;
7484 return true;
7485
7486 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7487 case GL_DEBUG_OUTPUT:
7488 *type = GL_BOOL;
7489 *numParams = 1;
7490 return true;
7491 }
7492 }
7493
7494 if (getExtensions().multisampleCompatibility)
7495 {
7496 switch (pname)
7497 {
7498 case GL_MULTISAMPLE_EXT:
7499 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7500 *type = GL_BOOL;
7501 *numParams = 1;
7502 return true;
7503 }
7504 }
7505
7506 if (getExtensions().pathRendering)
7507 {
7508 switch (pname)
7509 {
7510 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7511 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7512 *type = GL_FLOAT;
7513 *numParams = 16;
7514 return true;
7515 }
7516 }
7517
7518 if (getExtensions().bindGeneratesResource)
7519 {
7520 switch (pname)
7521 {
7522 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7523 *type = GL_BOOL;
7524 *numParams = 1;
7525 return true;
7526 }
7527 }
7528
7529 if (getExtensions().clientArrays)
7530 {
7531 switch (pname)
7532 {
7533 case GL_CLIENT_ARRAYS_ANGLE:
7534 *type = GL_BOOL;
7535 *numParams = 1;
7536 return true;
7537 }
7538 }
7539
7540 if (getExtensions().sRGBWriteControl)
7541 {
7542 switch (pname)
7543 {
7544 case GL_FRAMEBUFFER_SRGB_EXT:
7545 *type = GL_BOOL;
7546 *numParams = 1;
7547 return true;
7548 }
7549 }
7550
7551 if (getExtensions().robustResourceInitialization &&
7552 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7553 {
7554 *type = GL_BOOL;
7555 *numParams = 1;
7556 return true;
7557 }
7558
7559 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7560 {
7561 *type = GL_BOOL;
7562 *numParams = 1;
7563 return true;
7564 }
7565
jchen1082af6202018-06-22 10:59:52 +08007566 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7567 {
7568 *type = GL_INT;
7569 *numParams = 1;
7570 return true;
7571 }
7572
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007573 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7574 {
7575 *type = GL_INT;
7576 *numParams = 1;
7577 return true;
7578 }
7579
Jamie Madill5b772312018-03-08 20:28:32 -05007580 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7581 switch (pname)
7582 {
7583 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7584 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7585 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7586 {
7587 return false;
7588 }
7589 *type = GL_INT;
7590 *numParams = 1;
7591 return true;
7592
7593 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7594 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7595 {
7596 return false;
7597 }
7598 *type = GL_INT;
7599 *numParams = 1;
7600 return true;
7601
7602 case GL_PROGRAM_BINARY_FORMATS_OES:
7603 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7604 {
7605 return false;
7606 }
7607 *type = GL_INT;
7608 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7609 return true;
7610
7611 case GL_PACK_ROW_LENGTH:
7612 case GL_PACK_SKIP_ROWS:
7613 case GL_PACK_SKIP_PIXELS:
7614 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7615 {
7616 return false;
7617 }
7618 *type = GL_INT;
7619 *numParams = 1;
7620 return true;
7621 case GL_UNPACK_ROW_LENGTH:
7622 case GL_UNPACK_SKIP_ROWS:
7623 case GL_UNPACK_SKIP_PIXELS:
7624 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7625 {
7626 return false;
7627 }
7628 *type = GL_INT;
7629 *numParams = 1;
7630 return true;
7631 case GL_VERTEX_ARRAY_BINDING:
7632 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7633 {
7634 return false;
7635 }
7636 *type = GL_INT;
7637 *numParams = 1;
7638 return true;
7639 case GL_PIXEL_PACK_BUFFER_BINDING:
7640 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7641 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7642 {
7643 return false;
7644 }
7645 *type = GL_INT;
7646 *numParams = 1;
7647 return true;
7648 case GL_MAX_SAMPLES:
7649 {
7650 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7651 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7652 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7653 {
7654 return false;
7655 }
7656 *type = GL_INT;
7657 *numParams = 1;
7658 return true;
7659
7660 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7661 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7662 {
7663 return false;
7664 }
7665 *type = GL_INT;
7666 *numParams = 1;
7667 return true;
7668 }
7669 }
7670
7671 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7672 {
7673 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7674 {
7675 return false;
7676 }
7677 *type = GL_INT;
7678 *numParams = 1;
7679 return true;
7680 }
7681
7682 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7683 {
7684 *type = GL_INT;
7685 *numParams = 1;
7686 return true;
7687 }
7688
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007689 if (getClientVersion() < Version(2, 0))
7690 {
7691 switch (pname)
7692 {
7693 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007694 case GL_CLIENT_ACTIVE_TEXTURE:
7695 case GL_MATRIX_MODE:
7696 case GL_MAX_TEXTURE_UNITS:
7697 case GL_MAX_MODELVIEW_STACK_DEPTH:
7698 case GL_MAX_PROJECTION_STACK_DEPTH:
7699 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007700 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007701 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007702 case GL_VERTEX_ARRAY_STRIDE:
7703 case GL_NORMAL_ARRAY_STRIDE:
7704 case GL_COLOR_ARRAY_STRIDE:
7705 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7706 case GL_VERTEX_ARRAY_SIZE:
7707 case GL_COLOR_ARRAY_SIZE:
7708 case GL_TEXTURE_COORD_ARRAY_SIZE:
7709 case GL_VERTEX_ARRAY_TYPE:
7710 case GL_NORMAL_ARRAY_TYPE:
7711 case GL_COLOR_ARRAY_TYPE:
7712 case GL_TEXTURE_COORD_ARRAY_TYPE:
7713 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7714 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7715 case GL_COLOR_ARRAY_BUFFER_BINDING:
7716 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7717 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7718 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7719 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007720 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007721 case GL_MODELVIEW_STACK_DEPTH:
7722 case GL_PROJECTION_STACK_DEPTH:
7723 case GL_TEXTURE_STACK_DEPTH:
7724 case GL_LOGIC_OP_MODE:
7725 case GL_BLEND_SRC:
7726 case GL_BLEND_DST:
7727 case GL_PERSPECTIVE_CORRECTION_HINT:
7728 case GL_POINT_SMOOTH_HINT:
7729 case GL_LINE_SMOOTH_HINT:
7730 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007731 *type = GL_INT;
7732 *numParams = 1;
7733 return true;
7734 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007735 case GL_FOG_DENSITY:
7736 case GL_FOG_START:
7737 case GL_FOG_END:
7738 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007739 case GL_POINT_SIZE:
7740 case GL_POINT_SIZE_MIN:
7741 case GL_POINT_SIZE_MAX:
7742 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007743 *type = GL_FLOAT;
7744 *numParams = 1;
7745 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007746 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007747 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007748 *type = GL_FLOAT;
7749 *numParams = 2;
7750 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007751 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007752 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007753 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007754 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007755 *type = GL_FLOAT;
7756 *numParams = 4;
7757 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007758 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007759 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007760 *type = GL_FLOAT;
7761 *numParams = 3;
7762 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007763 case GL_MODELVIEW_MATRIX:
7764 case GL_PROJECTION_MATRIX:
7765 case GL_TEXTURE_MATRIX:
7766 *type = GL_FLOAT;
7767 *numParams = 16;
7768 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007769 case GL_LIGHT_MODEL_TWO_SIDE:
7770 *type = GL_BOOL;
7771 *numParams = 1;
7772 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007773 }
7774 }
7775
Jamie Madill5b772312018-03-08 20:28:32 -05007776 if (getClientVersion() < Version(3, 0))
7777 {
7778 return false;
7779 }
7780
7781 // Check for ES3.0+ parameter names
7782 switch (pname)
7783 {
7784 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7785 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7786 case GL_UNIFORM_BUFFER_BINDING:
7787 case GL_TRANSFORM_FEEDBACK_BINDING:
7788 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7789 case GL_COPY_READ_BUFFER_BINDING:
7790 case GL_COPY_WRITE_BUFFER_BINDING:
7791 case GL_SAMPLER_BINDING:
7792 case GL_READ_BUFFER:
7793 case GL_TEXTURE_BINDING_3D:
7794 case GL_TEXTURE_BINDING_2D_ARRAY:
7795 case GL_MAX_3D_TEXTURE_SIZE:
7796 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7797 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7798 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7799 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7800 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7801 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7802 case GL_MAX_VARYING_COMPONENTS:
7803 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7804 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7805 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7806 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7807 case GL_NUM_EXTENSIONS:
7808 case GL_MAJOR_VERSION:
7809 case GL_MINOR_VERSION:
7810 case GL_MAX_ELEMENTS_INDICES:
7811 case GL_MAX_ELEMENTS_VERTICES:
7812 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7813 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7814 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7815 case GL_UNPACK_IMAGE_HEIGHT:
7816 case GL_UNPACK_SKIP_IMAGES:
7817 {
7818 *type = GL_INT;
7819 *numParams = 1;
7820 return true;
7821 }
7822
7823 case GL_MAX_ELEMENT_INDEX:
7824 case GL_MAX_UNIFORM_BLOCK_SIZE:
7825 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7826 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7827 case GL_MAX_SERVER_WAIT_TIMEOUT:
7828 {
7829 *type = GL_INT_64_ANGLEX;
7830 *numParams = 1;
7831 return true;
7832 }
7833
7834 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7835 case GL_TRANSFORM_FEEDBACK_PAUSED:
7836 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7837 case GL_RASTERIZER_DISCARD:
7838 {
7839 *type = GL_BOOL;
7840 *numParams = 1;
7841 return true;
7842 }
7843
7844 case GL_MAX_TEXTURE_LOD_BIAS:
7845 {
7846 *type = GL_FLOAT;
7847 *numParams = 1;
7848 return true;
7849 }
7850 }
7851
7852 if (getExtensions().requestExtension)
7853 {
7854 switch (pname)
7855 {
7856 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7857 *type = GL_INT;
7858 *numParams = 1;
7859 return true;
7860 }
7861 }
7862
Yizhou Jiang7818a852018-09-06 15:02:04 +08007863 if (getExtensions().textureMultisample)
7864 {
7865 switch (pname)
7866 {
7867 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7868 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7869 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7870 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
7871 *type = GL_INT;
7872 *numParams = 1;
7873 return true;
7874 }
7875 }
7876
Jamie Madill5b772312018-03-08 20:28:32 -05007877 if (getClientVersion() < Version(3, 1))
7878 {
7879 return false;
7880 }
7881
7882 switch (pname)
7883 {
7884 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7885 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7886 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7887 case GL_MAX_FRAMEBUFFER_WIDTH:
7888 case GL_MAX_FRAMEBUFFER_HEIGHT:
7889 case GL_MAX_FRAMEBUFFER_SAMPLES:
7890 case GL_MAX_SAMPLE_MASK_WORDS:
7891 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7892 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7893 case GL_MAX_INTEGER_SAMPLES:
7894 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7895 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7896 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7897 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7898 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7899 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7900 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7901 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7902 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7903 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7904 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7905 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7906 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7907 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7908 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7909 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7910 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7911 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7912 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7913 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7914 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7915 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7916 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7917 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7918 case GL_MAX_UNIFORM_LOCATIONS:
7919 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7920 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7921 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7922 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7923 case GL_MAX_IMAGE_UNITS:
7924 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7925 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7926 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7927 case GL_SHADER_STORAGE_BUFFER_BINDING:
7928 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7929 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007930 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007931 *type = GL_INT;
7932 *numParams = 1;
7933 return true;
7934 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7935 *type = GL_INT_64_ANGLEX;
7936 *numParams = 1;
7937 return true;
7938 case GL_SAMPLE_MASK:
7939 *type = GL_BOOL;
7940 *numParams = 1;
7941 return true;
7942 }
7943
7944 if (getExtensions().geometryShader)
7945 {
7946 switch (pname)
7947 {
7948 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7949 case GL_LAYER_PROVOKING_VERTEX_EXT:
7950 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7951 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7952 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7953 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7954 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7955 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7956 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7957 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7958 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7959 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7960 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7961 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7962 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7963 *type = GL_INT;
7964 *numParams = 1;
7965 return true;
7966 }
7967 }
7968
7969 return false;
7970}
7971
7972bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7973{
7974 if (getClientVersion() < Version(3, 0))
7975 {
7976 return false;
7977 }
7978
7979 switch (target)
7980 {
7981 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7982 case GL_UNIFORM_BUFFER_BINDING:
7983 {
7984 *type = GL_INT;
7985 *numParams = 1;
7986 return true;
7987 }
7988 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7989 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7990 case GL_UNIFORM_BUFFER_START:
7991 case GL_UNIFORM_BUFFER_SIZE:
7992 {
7993 *type = GL_INT_64_ANGLEX;
7994 *numParams = 1;
7995 return true;
7996 }
7997 }
7998
7999 if (getClientVersion() < Version(3, 1))
8000 {
8001 return false;
8002 }
8003
8004 switch (target)
8005 {
8006 case GL_IMAGE_BINDING_LAYERED:
8007 {
8008 *type = GL_BOOL;
8009 *numParams = 1;
8010 return true;
8011 }
8012 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
8013 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
8014 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
8015 case GL_SHADER_STORAGE_BUFFER_BINDING:
8016 case GL_VERTEX_BINDING_BUFFER:
8017 case GL_VERTEX_BINDING_DIVISOR:
8018 case GL_VERTEX_BINDING_OFFSET:
8019 case GL_VERTEX_BINDING_STRIDE:
8020 case GL_SAMPLE_MASK_VALUE:
8021 case GL_IMAGE_BINDING_NAME:
8022 case GL_IMAGE_BINDING_LEVEL:
8023 case GL_IMAGE_BINDING_LAYER:
8024 case GL_IMAGE_BINDING_ACCESS:
8025 case GL_IMAGE_BINDING_FORMAT:
8026 {
8027 *type = GL_INT;
8028 *numParams = 1;
8029 return true;
8030 }
8031 case GL_ATOMIC_COUNTER_BUFFER_START:
8032 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
8033 case GL_SHADER_STORAGE_BUFFER_START:
8034 case GL_SHADER_STORAGE_BUFFER_SIZE:
8035 {
8036 *type = GL_INT_64_ANGLEX;
8037 *numParams = 1;
8038 return true;
8039 }
8040 }
8041
8042 return false;
8043}
8044
Jamie Madill44a6fbf2018-10-02 13:38:56 -04008045Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05008046{
8047 return mState.mShaderPrograms->getProgram(handle);
8048}
8049
8050Shader *Context::getShader(GLuint handle) const
8051{
8052 return mState.mShaderPrograms->getShader(handle);
8053}
8054
Jamie Madill5b772312018-03-08 20:28:32 -05008055bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
8056{
8057 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
8058}
8059
8060bool Context::isFramebufferGenerated(GLuint framebuffer) const
8061{
8062 return mState.mFramebuffers->isHandleGenerated(framebuffer);
8063}
8064
8065bool Context::isProgramPipelineGenerated(GLuint pipeline) const
8066{
8067 return mState.mPipelines->isHandleGenerated(pipeline);
8068}
8069
8070bool Context::usingDisplayTextureShareGroup() const
8071{
8072 return mDisplayTextureShareGroup;
8073}
8074
8075GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
8076{
8077 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
8078 internalformat == GL_DEPTH_STENCIL
8079 ? GL_DEPTH24_STENCIL8
8080 : internalformat;
8081}
8082
jchen1082af6202018-06-22 10:59:52 +08008083void Context::maxShaderCompilerThreads(GLuint count)
8084{
jchen107ae70d82018-07-06 13:47:01 +08008085 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08008086 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08008087 // A count of zero specifies a request for no parallel compiling or linking.
8088 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
8089 {
8090 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
8091 }
8092 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08008093}
8094
Jamie Madill2eb65032018-07-30 10:25:57 -04008095bool Context::isGLES1() const
8096{
8097 return mState.getClientVersion() < Version(2, 0);
8098}
8099
Jamie Madilla11819d2018-07-30 10:26:01 -04008100void Context::onSubjectStateChange(const Context *context,
8101 angle::SubjectIndex index,
8102 angle::SubjectMessage message)
8103{
Jamie Madilla11819d2018-07-30 10:26:01 -04008104 switch (index)
8105 {
8106 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008107 switch (message)
8108 {
8109 case angle::SubjectMessage::CONTENTS_CHANGED:
8110 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
8111 mStateCache.onVertexArrayBufferContentsChange(this);
8112 break;
8113 case angle::SubjectMessage::RESOURCE_MAPPED:
8114 case angle::SubjectMessage::RESOURCE_UNMAPPED:
8115 case angle::SubjectMessage::BINDING_CHANGED:
8116 mStateCache.onVertexArrayBufferStateChange(this);
8117 break;
8118 default:
8119 break;
8120 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008121 break;
8122
8123 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008124 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8125 {
8126 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
8127 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008128 break;
8129
8130 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008131 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8132 {
8133 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
8134 }
8135 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04008136 break;
8137
8138 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04008139 if (index < kTextureMaxSubjectIndex)
8140 {
8141 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04008142 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008143 }
Jamie Madille25b8002018-09-20 13:39:49 -04008144 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04008145 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04008146 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04008147 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008148 }
Jamie Madille25b8002018-09-20 13:39:49 -04008149 else
8150 {
8151 ASSERT(index < kSamplerMaxSubjectIndex);
8152 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
8153 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008154 break;
8155 }
8156}
8157
Jamie Madill6b873dd2018-07-12 23:56:30 -04008158// ErrorSet implementation.
8159ErrorSet::ErrorSet(Context *context) : mContext(context)
8160{
8161}
8162
8163ErrorSet::~ErrorSet() = default;
8164
Jamie Madill306b6c12018-07-27 08:12:49 -04008165void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04008166{
8167 // This internal enum is used to filter internal errors that are already handled.
8168 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
8169 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
8170 {
8171 return;
8172 }
8173
8174 if (ANGLE_UNLIKELY(error.isError()))
8175 {
8176 GLenum code = error.getCode();
8177 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04008178
Jamie Madill6b873dd2018-07-12 23:56:30 -04008179 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8180 {
8181 mContext->markContextLost();
8182 }
8183
8184 ASSERT(!error.getMessage().empty());
8185 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8186 error.getID(), GL_DEBUG_SEVERITY_HIGH,
8187 error.getMessage());
8188 }
8189}
8190
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008191void ErrorSet::handleError(GLenum errorCode,
8192 const char *message,
8193 const char *file,
8194 const char *function,
8195 unsigned int line)
8196{
8197 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
8198 std::stringstream errorStream;
8199 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
8200 << function << ":" << line << ". " << message;
8201
8202 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
8203}
8204
Jamie Madilla139f012018-10-10 16:13:03 -04008205void ErrorSet::validationError(GLenum errorCode, const char *message)
8206{
8207 handleError(gl::Error(errorCode, message));
8208}
8209
Jamie Madill6b873dd2018-07-12 23:56:30 -04008210bool ErrorSet::empty() const
8211{
8212 return mErrors.empty();
8213}
8214
8215GLenum ErrorSet::popError()
8216{
8217 ASSERT(!empty());
8218 GLenum error = *mErrors.begin();
8219 mErrors.erase(mErrors.begin());
8220 return error;
8221}
Jamie Madilldc358af2018-07-31 11:22:13 -04008222
8223// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008224StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008225 : mCachedHasAnyEnabledClientAttrib(false),
8226 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008227 mCachedInstancedVertexElementLimit(0),
8228 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008229{
8230}
8231
8232StateCache::~StateCache() = default;
8233
Jamie Madillac66f982018-10-09 18:30:01 -04008234void StateCache::initialize(Context *context)
8235{
8236 updateValidDrawModes(context);
8237 updateValidBindTextureTypes(context);
8238}
8239
Jamie Madilldc358af2018-07-31 11:22:13 -04008240void StateCache::updateActiveAttribsMask(Context *context)
8241{
8242 bool isGLES1 = context->isGLES1();
8243 const State &glState = context->getGLState();
8244
8245 if (!isGLES1 && !glState.getProgram())
8246 {
8247 mCachedActiveBufferedAttribsMask = AttributesMask();
8248 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008249 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008250 return;
8251 }
8252
8253 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8254 : glState.getProgram()->getActiveAttribLocationsMask();
8255
8256 const VertexArray *vao = glState.getVertexArray();
8257 ASSERT(vao);
8258
8259 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8260 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008261 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008262
Jamie Madill0a17e482018-08-31 17:19:11 -04008263 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8264 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008265 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008266 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8267}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008268
8269void StateCache::updateVertexElementLimits(Context *context)
8270{
8271 const VertexArray *vao = context->getGLState().getVertexArray();
8272
8273 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8274 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8275
8276 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8277 // If there are no buffered attributes then we should not limit the draw call count.
8278 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8279 {
8280 return;
8281 }
8282
8283 const auto &vertexAttribs = vao->getVertexAttributes();
8284 const auto &vertexBindings = vao->getVertexBindings();
8285
8286 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8287 {
8288 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8289 ASSERT(attrib.enabled);
8290
8291 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8292 ASSERT(context->isGLES1() ||
8293 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8294
8295 GLint64 limit = attrib.getCachedElementLimit();
8296 if (binding.getDivisor() > 0)
8297 {
8298 mCachedInstancedVertexElementLimit =
8299 std::min(mCachedInstancedVertexElementLimit, limit);
8300 }
8301 else
8302 {
8303 mCachedNonInstancedVertexElementLimit =
8304 std::min(mCachedNonInstancedVertexElementLimit, limit);
8305 }
8306 }
8307}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008308
Jamie Madilld84b6732018-09-06 15:54:35 -04008309void StateCache::updateBasicDrawStatesError()
8310{
8311 mCachedBasicDrawStatesError = kInvalidPointer;
8312}
8313
8314intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8315{
8316 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8317 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8318 return mCachedBasicDrawStatesError;
8319}
8320
Jamie Madillc43cdad2018-08-08 15:49:25 -04008321void StateCache::onVertexArrayBindingChange(Context *context)
8322{
8323 updateActiveAttribsMask(context);
8324 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008325 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008326}
8327
8328void StateCache::onProgramExecutableChange(Context *context)
8329{
8330 updateActiveAttribsMask(context);
8331 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008332 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008333 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008334}
8335
Jamie Madilld84b6732018-09-06 15:54:35 -04008336void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008337{
8338 updateVertexElementLimits(context);
8339}
8340
Jamie Madilld84b6732018-09-06 15:54:35 -04008341void StateCache::onVertexArrayBufferContentsChange(Context *context)
8342{
8343 updateVertexElementLimits(context);
8344 updateBasicDrawStatesError();
8345}
8346
Jamie Madillc43cdad2018-08-08 15:49:25 -04008347void StateCache::onVertexArrayStateChange(Context *context)
8348{
8349 updateActiveAttribsMask(context);
8350 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008351 updateBasicDrawStatesError();
8352}
8353
8354void StateCache::onVertexArrayBufferStateChange(Context *context)
8355{
8356 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008357}
8358
8359void StateCache::onGLES1ClientStateChange(Context *context)
8360{
8361 updateActiveAttribsMask(context);
8362}
Jamie Madilld84b6732018-09-06 15:54:35 -04008363
8364void StateCache::onDrawFramebufferChange(Context *context)
8365{
8366 updateBasicDrawStatesError();
8367}
8368
8369void StateCache::onContextCapChange(Context *context)
8370{
8371 updateBasicDrawStatesError();
8372}
8373
8374void StateCache::onStencilStateChange(Context *context)
8375{
8376 updateBasicDrawStatesError();
8377}
8378
8379void StateCache::onDefaultVertexAttributeChange(Context *context)
8380{
8381 updateBasicDrawStatesError();
8382}
8383
8384void StateCache::onActiveTextureChange(Context *context)
8385{
8386 updateBasicDrawStatesError();
8387}
8388
8389void StateCache::onQueryChange(Context *context)
8390{
8391 updateBasicDrawStatesError();
8392}
8393
8394void StateCache::onTransformFeedbackChange(Context *context)
8395{
8396 updateBasicDrawStatesError();
8397}
8398
8399void StateCache::onUniformBufferStateChange(Context *context)
8400{
8401 updateBasicDrawStatesError();
8402}
8403
8404void StateCache::onBufferBindingChange(Context *context)
8405{
8406 updateBasicDrawStatesError();
8407}
Jamie Madill526a6f62018-09-12 11:03:05 -04008408
8409void StateCache::updateValidDrawModes(Context *context)
8410{
8411 Program *program = context->getGLState().getProgram();
8412 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8413 {
8414 mCachedValidDrawModes = {{
8415 true, /* Points */
8416 true, /* Lines */
8417 true, /* LineLoop */
8418 true, /* LineStrip */
8419 true, /* Triangles */
8420 true, /* TriangleStrip */
8421 true, /* TriangleFan */
8422 false, /* LinesAdjacency */
8423 false, /* LineStripAdjacency */
8424 false, /* TrianglesAdjacency */
8425 false, /* TriangleStripAdjacency */
8426 false, /* InvalidEnum */
8427 }};
8428 }
8429 else
8430 {
8431 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8432
8433 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8434
8435 mCachedValidDrawModes = {{
8436 gsMode == PrimitiveMode::Points, /* Points */
8437 gsMode == PrimitiveMode::Lines, /* Lines */
8438 gsMode == PrimitiveMode::Lines, /* LineLoop */
8439 gsMode == PrimitiveMode::Lines, /* LineStrip */
8440 gsMode == PrimitiveMode::Triangles, /* Triangles */
8441 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8442 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8443 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8444 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8445 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8446 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8447 false, /* InvalidEnum */
8448 }};
8449 }
8450}
Jamie Madillac66f982018-10-09 18:30:01 -04008451
8452void StateCache::updateValidBindTextureTypes(Context *context)
8453{
8454 const Extensions &exts = context->getExtensions();
8455 bool isGLES3 = context->getClientMajorVersion() >= 3;
8456 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8457
8458 mCachedValidBindTextureTypes = {{
8459 true, /* _2D */
8460 isGLES3, /* _2DArray */
Yizhou Jiang7818a852018-09-06 15:02:04 +08008461 isGLES31 || exts.textureMultisample, /* _2DMultisample */
Jamie Madillac66f982018-10-09 18:30:01 -04008462 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8463 isGLES3, /* _3D */
8464 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8465 exts.textureRectangle, /* Rectangle */
8466 true, /* CubeMap */
8467 false, /* InvalidEnum */
8468
8469 }};
8470}
Jamie Madillc29968b2016-01-20 11:17:23 -05008471} // namespace gl