blob: b582f5b5081b97852675dba06480fabf3e419163 [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 Madill5188a272018-07-25 10:53:56 -0400111gl::Error 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 Madill5188a272018-07-25 10:53:56 -0400125 gl::Error error = query->isResultAvailable(context, &available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500126 if (!error.isError())
127 {
jchen10a99ed552017-09-22 08:10:32 +0800128 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500129 }
130 return error;
131 }
132 default:
133 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500134 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500135 }
136}
137
Jamie Madill956ab4d2018-10-10 16:13:03 -0400138ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const gl::Context *context,
139 gl::TransformFeedback *transformFeedback,
140 GLsizei count,
141 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400142{
Geoff Lang1a683462015-09-29 15:09:59 -0400143 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400144 {
Jamie Madill09463932018-04-04 05:26:59 -0400145 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400146 }
147}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148
149// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300150EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500151{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400152 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500153}
154
Martin Radev1be913c2016-07-11 17:59:16 +0300155EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
156{
157 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
158}
159
Geoff Langeb66a6e2016-10-31 13:06:12 -0400160gl::Version GetClientVersion(const egl::AttributeMap &attribs)
161{
162 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
163}
164
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500165GLenum GetResetStrategy(const egl::AttributeMap &attribs)
166{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800167 EGLAttrib attrib =
168 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500169 switch (attrib)
170 {
171 case EGL_NO_RESET_NOTIFICATION:
172 return GL_NO_RESET_NOTIFICATION_EXT;
173 case EGL_LOSE_CONTEXT_ON_RESET:
174 return GL_LOSE_CONTEXT_ON_RESET_EXT;
175 default:
176 UNREACHABLE();
177 return GL_NONE;
178 }
179}
180
181bool GetRobustAccess(const egl::AttributeMap &attribs)
182{
Geoff Lang077f20a2016-11-01 10:08:02 -0400183 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
184 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
185 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500186}
187
188bool GetDebug(const egl::AttributeMap &attribs)
189{
Geoff Lang077f20a2016-11-01 10:08:02 -0400190 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
191 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500192}
193
194bool GetNoError(const egl::AttributeMap &attribs)
195{
196 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
197}
198
Geoff Langc287ea62016-09-16 14:46:51 -0400199bool GetWebGLContext(const egl::AttributeMap &attribs)
200{
Jamie Madill4230d482018-09-14 10:14:45 -0400201 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400202}
203
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400204bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
205{
206 // If the context is WebGL, extensions are disabled by default
207 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
208 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
209}
210
Geoff Langf41a7152016-09-19 15:11:17 -0400211bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
212{
Jamie Madill4230d482018-09-14 10:14:45 -0400213 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400214}
215
Geoff Langfeb8c682017-02-13 16:07:35 -0500216bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
217{
218 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
219}
220
Geoff Langb433e872017-10-05 14:01:47 -0400221bool GetRobustResourceInit(const egl::AttributeMap &attribs)
222{
223 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
224}
225
Martin Radev9d901792016-07-15 15:58:58 +0300226std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
227{
228 std::string labelName;
229 if (label != nullptr)
230 {
231 size_t labelLength = length < 0 ? strlen(label) : length;
232 labelName = std::string(label, labelLength);
233 }
234 return labelName;
235}
236
237void GetObjectLabelBase(const std::string &objectLabel,
238 GLsizei bufSize,
239 GLsizei *length,
240 GLchar *label)
241{
242 size_t writeLength = objectLabel.length();
243 if (label != nullptr && bufSize > 0)
244 {
245 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
246 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
247 label[writeLength] = '\0';
248 }
249
250 if (length != nullptr)
251 {
252 *length = static_cast<GLsizei>(writeLength);
253 }
254}
255
Jamie Madill0f80ed82017-09-19 00:24:56 -0400256template <typename CapT, typename MaxT>
257void LimitCap(CapT *cap, MaxT maximum)
258{
259 *cap = std::min(*cap, static_cast<CapT>(maximum));
260}
261
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600262constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
Jamie Madill526a6f62018-09-12 11:03:05 -0400263 1, /* Points */
264 2, /* Lines */
265 2, /* LineLoop */
266 2, /* LineStrip */
267 3, /* Triangles */
268 3, /* TriangleStrip */
269 3, /* TriangleFan */
270 2, /* LinesAdjacency */
271 2, /* LineStripAdjacency */
272 3, /* TrianglesAdjacency */
273 3, /* TriangleStripAdjacency */
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600274}};
275// Indices above are code-gen'd so make sure they don't change
276// if any of these static asserts are hit, must update kMinimumPrimitiveCounts abouve
277static_assert(static_cast<gl::PrimitiveMode>(0) == gl::PrimitiveMode::Points,
278 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
279static_assert(static_cast<gl::PrimitiveMode>(1) == gl::PrimitiveMode::Lines,
280 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
281static_assert(static_cast<gl::PrimitiveMode>(2) == gl::PrimitiveMode::LineLoop,
282 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
283static_assert(static_cast<gl::PrimitiveMode>(3) == gl::PrimitiveMode::LineStrip,
284 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
285static_assert(static_cast<gl::PrimitiveMode>(4) == gl::PrimitiveMode::Triangles,
286 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
287static_assert(static_cast<gl::PrimitiveMode>(5) == gl::PrimitiveMode::TriangleStrip,
288 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
289static_assert(static_cast<gl::PrimitiveMode>(6) == gl::PrimitiveMode::TriangleFan,
290 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
291static_assert(static_cast<gl::PrimitiveMode>(7) == gl::PrimitiveMode::LinesAdjacency,
292 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
293static_assert(static_cast<gl::PrimitiveMode>(8) == gl::PrimitiveMode::LineStripAdjacency,
294 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
295static_assert(static_cast<gl::PrimitiveMode>(9) == gl::PrimitiveMode::TrianglesAdjacency,
296 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
297static_assert(static_cast<gl::PrimitiveMode>(10) == gl::PrimitiveMode::TriangleStripAdjacency,
298 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
299static_assert(static_cast<gl::PrimitiveMode>(11) == gl::PrimitiveMode::EnumCount,
300 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
301
Jamie Madill6d32cef2018-08-14 02:34:28 -0400302enum SubjectIndexes : angle::SubjectIndex
303{
304 kTexture0SubjectIndex = 0,
305 kTextureMaxSubjectIndex = kTexture0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
306 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
307 kUniformBufferMaxSubjectIndex =
308 kUniformBuffer0SubjectIndex + gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400309 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
310 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
311 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400312 kReadFramebufferSubjectIndex,
313 kDrawFramebufferSubjectIndex
314};
Geoff Langf6db0982015-08-25 13:04:00 -0400315} // anonymous namespace
316
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000317namespace gl
318{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000319
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400320Context::Context(rx::EGLImplFactory *implFactory,
321 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400322 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500323 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400324 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500325 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700326 const egl::DisplayExtensions &displayExtensions,
327 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500328 : mState(reinterpret_cast<ContextID>(this),
329 shareContext ? &shareContext->mState : nullptr,
330 shareTextures,
331 GetClientVersion(attribs),
332 &mGLState,
333 mCaps,
334 mTextureCaps,
335 mExtensions,
336 mLimitations),
337 mSkipValidation(GetNoError(attribs)),
338 mDisplayTextureShareGroup(shareTextures != nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400339 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400340 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400341 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400342 mGLState(GetDebug(attribs),
343 GetBindGeneratesResource(attribs),
344 GetClientArraysEnabled(attribs),
345 GetRobustResourceInit(attribs),
346 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400347 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500348 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400349 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500350 mHasBeenCurrent(false),
351 mContextLost(false),
352 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700353 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500354 mResetStrategy(GetResetStrategy(attribs)),
355 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400356 mSurfacelessSupported(displayExtensions.surfacelessContext),
357 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400358 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
359 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500360 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400361 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400362 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400363 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
364 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
365 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400366 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800367 mZeroFilledBuffer(1000u),
368 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000369{
Jamie Madill6d32cef2018-08-14 02:34:28 -0400370 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
371 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
372 {
373 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
374 }
Jamie Madille25b8002018-09-20 13:39:49 -0400375
376 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
377 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
378 {
379 mSamplerObserverBindings.emplace_back(this, samplerIndex);
380 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400381}
Jamie Madill5b772312018-03-08 20:28:32 -0500382
Geoff Lang33f11fb2018-05-07 13:42:47 -0400383void Context::initialize()
384{
385 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400386
Geoff Lang33f11fb2018-05-07 13:42:47 -0400387 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700388 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400389
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400390 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100391
Shannon Woods53a94a82014-06-24 15:20:36 -0400392 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400393
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000394 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400395 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000396 // and cube map texture state vectors respectively associated with them.
397 // In order that access to these initial textures not be lost, they are treated as texture
398 // objects all of whose names are 0.
399
Corentin Wallez99d492c2018-02-27 15:17:10 -0500400 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800401 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500402
Corentin Wallez99d492c2018-02-27 15:17:10 -0500403 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800404 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400405
Geoff Langeb66a6e2016-10-31 13:06:12 -0400406 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400407 {
408 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500409 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800410 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400411
Corentin Wallez99d492c2018-02-27 15:17:10 -0500412 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800413 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400414 }
Yizhou Jiang7818a852018-09-06 15:02:04 +0800415 if (getClientVersion() >= Version(3, 1) || mSupportedExtensions.textureMultisample)
Geoff Lang3b573612016-10-31 14:08:10 -0400416 {
417 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500418 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800419 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Yizhou Jiang7818a852018-09-06 15:02:04 +0800420 }
421 if (getClientVersion() >= Version(3, 1))
422 {
Olli Etuahod310a432018-08-24 15:40:23 +0300423 Texture *zeroTexture2DMultisampleArray =
424 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
425 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800426
Jiajia Qin6eafb042016-12-27 17:04:07 +0800427 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
428 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800429 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800430 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800431
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800432 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
433 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400434 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800435 }
Geoff Lang3b573612016-10-31 14:08:10 -0400436 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000437
Geoff Langb0f917f2017-12-05 13:41:54 -0500438 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400439 {
440 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500441 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800442 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400443 }
444
Geoff Langb0f917f2017-12-05 13:41:54 -0500445 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400446 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500447 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800448 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400449 }
450
Jamie Madill4928b7c2017-06-20 12:57:39 -0400451 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500452
Jamie Madill57a89722013-07-02 11:57:03 -0400453 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000454
Geoff Langeb66a6e2016-10-31 13:06:12 -0400455 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400456 {
457 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
458 // In the initial state, a default transform feedback object is bound and treated as
459 // a transform feedback object with a name of zero. That object is bound any time
460 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400461 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400462 }
Geoff Langc8058452014-02-03 12:04:11 -0500463
Corentin Wallez336129f2017-10-17 15:55:40 -0400464 for (auto type : angle::AllEnums<BufferBinding>())
465 {
466 bindBuffer(type, 0);
467 }
468
469 bindRenderbuffer(GL_RENDERBUFFER, 0);
470
471 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
472 {
473 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
474 }
475
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700476 // Initialize GLES1 renderer if appropriate.
477 if (getClientVersion() < Version(2, 0))
478 {
479 mGLES1Renderer.reset(new GLES1Renderer());
480 }
481
Jamie Madillad9f24e2016-02-12 09:27:24 -0500482 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400483 mAllDirtyBits.set();
484
Geoff Lang9bf86f02018-07-26 11:46:34 -0400485 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
486 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
487 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400488 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400489 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400490
491 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
492 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
493 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400494 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400495
Jamie Madillc67323a2017-11-02 23:11:41 -0400496 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500497 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500498 // No dirty objects.
499
500 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400501 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500502 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400503 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500504 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
505
506 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
507 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
508 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
509 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
510 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
511 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
512 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
513 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
514 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
515 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
516 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400517 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500518 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
519
520 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
521 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700522 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400523 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
524 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500525 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
526 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400527
Xinghua Cao10a4d432017-11-28 14:46:26 +0800528 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800529 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
530 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800531 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
532 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
533 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
534 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800535 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800536 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800537 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400538 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400539 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800540
Jamie Madillb4927eb2018-07-16 11:39:46 -0400541 mImplementation->setErrorSet(&mErrors);
542
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400543 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000544}
545
Jamie Madill4928b7c2017-06-20 12:57:39 -0400546egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000547{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700548 if (mGLES1Renderer)
549 {
550 mGLES1Renderer->onDestroy(this, &mGLState);
551 }
552
Jamie Madille7b3fe22018-04-05 09:42:46 -0400553 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400554 ANGLE_TRY(releaseSurface(display));
555
Corentin Wallez80b24112015-08-25 16:41:57 -0400556 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000557 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400558 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000559 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400560 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000561
Corentin Wallez80b24112015-08-25 16:41:57 -0400562 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000563 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400564 if (query.second != nullptr)
565 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400566 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400567 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000568 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400569 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000570
Corentin Wallez80b24112015-08-25 16:41:57 -0400571 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400572 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400573 if (vertexArray.second)
574 {
575 vertexArray.second->onDestroy(this);
576 }
Jamie Madill57a89722013-07-02 11:57:03 -0400577 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400578 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400579
Corentin Wallez80b24112015-08-25 16:41:57 -0400580 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500581 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500582 if (transformFeedback.second != nullptr)
583 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500584 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500585 }
Geoff Langc8058452014-02-03 12:04:11 -0500586 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400587 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500588
Jamie Madill5b772312018-03-08 20:28:32 -0500589 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400590 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800591 if (zeroTexture.get() != nullptr)
592 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400593 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800594 zeroTexture.set(this, nullptr);
595 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400596 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000597
Jamie Madill2f348d22017-06-05 10:50:59 -0400598 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500599
Jamie Madill4928b7c2017-06-20 12:57:39 -0400600 mGLState.reset(this);
601
Jamie Madill6c1f6712017-02-14 19:08:04 -0500602 mState.mBuffers->release(this);
603 mState.mShaderPrograms->release(this);
604 mState.mTextures->release(this);
605 mState.mRenderbuffers->release(this);
606 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400607 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500608 mState.mPaths->release(this);
609 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800610 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400611
jchen107ae70d82018-07-06 13:47:01 +0800612 mThreadPool.reset();
613
Jamie Madill76e471e2017-10-21 09:56:01 -0400614 mImplementation->onDestroy(this);
615
Jamie Madill4928b7c2017-06-20 12:57:39 -0400616 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000617}
618
Jamie Madill70ee0f62017-02-06 16:04:20 -0500619Context::~Context()
620{
621}
622
Geoff Lang75359662018-04-11 01:42:27 -0400623void Context::setLabel(EGLLabelKHR label)
624{
625 mLabel = label;
626}
627
628EGLLabelKHR Context::getLabel() const
629{
630 return mLabel;
631}
632
Jamie Madill4928b7c2017-06-20 12:57:39 -0400633egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000634{
Jamie Madill61e16b42017-06-19 11:13:23 -0400635 mCurrentDisplay = display;
636
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000637 if (!mHasBeenCurrent)
638 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400639 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000640 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500641 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400642 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000643
Corentin Wallezc295e512017-01-27 17:47:50 -0500644 int width = 0;
645 int height = 0;
646 if (surface != nullptr)
647 {
648 width = surface->getWidth();
649 height = surface->getHeight();
650 }
651
652 mGLState.setViewportParams(0, 0, width, height);
653 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000654
655 mHasBeenCurrent = true;
656 }
657
Jamie Madill1b94d432015-08-07 13:23:23 -0400658 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700659 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400660 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400661
Jamie Madill4928b7c2017-06-20 12:57:39 -0400662 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500663
664 Framebuffer *newDefault = nullptr;
665 if (surface != nullptr)
666 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400667 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500668 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400669 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500670 }
671 else
672 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400673 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500674 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000675
Corentin Wallez37c39792015-08-20 14:19:46 -0400676 // Update default framebuffer, the binding of the previous default
677 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400678 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400679 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700680 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400681 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400682 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400683 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700684 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400685 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400686 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400687 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400688 }
Ian Ewell292f0052016-02-04 10:37:32 -0500689
Jamie Madill32643ce2018-10-19 11:38:03 -0400690 // Notify the renderer of a context switch.
691 // TODO(jmadill): Fix this error handling. http://anglebug.com/2491
692 (void)(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400693 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000694}
695
Jamie Madill4928b7c2017-06-20 12:57:39 -0400696egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400697{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400698 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400699
Geoff Langbf7b95d2018-05-01 16:48:21 -0400700 // Remove the default framebuffer
701 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500702 {
703 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400704 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500705 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400706
707 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500708 {
709 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400710 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500711 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400712
713 if (defaultFramebuffer)
714 {
715 defaultFramebuffer->onDestroy(this);
716 delete defaultFramebuffer;
717 }
718
Corentin Wallezc295e512017-01-27 17:47:50 -0500719 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
720
721 if (mCurrentSurface)
722 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400723 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500724 mCurrentSurface = nullptr;
725 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400726
727 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400728}
729
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000730GLuint Context::createBuffer()
731{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500732 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000733}
734
735GLuint Context::createProgram()
736{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500737 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000738}
739
Jiawei Shao385b3e02018-03-21 09:43:28 +0800740GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000741{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500742 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000743}
744
745GLuint Context::createTexture()
746{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500747 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000748}
749
750GLuint Context::createRenderbuffer()
751{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500752 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000753}
754
Jamie Madill13951342018-09-30 15:24:28 -0400755void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
756{
757 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
758}
759
Brandon Jones59770802018-04-02 13:18:42 -0700760GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300761{
Jamie Madill13951342018-09-30 15:24:28 -0400762 GLuint created = 0;
763 tryGenPaths(range, &created);
764 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300765}
766
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000767// Returns an unused framebuffer name
768GLuint Context::createFramebuffer()
769{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500770 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000771}
772
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500773void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000774{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500775 for (int i = 0; i < n; i++)
776 {
777 GLuint handle = mFenceNVHandleAllocator.allocate();
778 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
779 fences[i] = handle;
780 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000781}
782
Yunchao Hea336b902017-08-02 16:05:21 +0800783GLuint Context::createProgramPipeline()
784{
785 return mState.mPipelines->createProgramPipeline();
786}
787
Jiawei Shao385b3e02018-03-21 09:43:28 +0800788GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800789{
790 UNIMPLEMENTED();
791 return 0u;
792}
793
James Darpinian4d9d4832018-03-13 12:43:28 -0700794void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000795{
James Darpinian4d9d4832018-03-13 12:43:28 -0700796 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
797 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000798 {
799 detachBuffer(buffer);
800 }
Jamie Madill893ab082014-05-16 16:56:10 -0400801
James Darpinian4d9d4832018-03-13 12:43:28 -0700802 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000803}
804
805void Context::deleteShader(GLuint shader)
806{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500807 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000808}
809
810void Context::deleteProgram(GLuint program)
811{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500812 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000813}
814
815void Context::deleteTexture(GLuint texture)
816{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500817 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000818 {
819 detachTexture(texture);
820 }
821
Jamie Madill6c1f6712017-02-14 19:08:04 -0500822 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000823}
824
825void Context::deleteRenderbuffer(GLuint renderbuffer)
826{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500827 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000828 {
829 detachRenderbuffer(renderbuffer);
830 }
Jamie Madill893ab082014-05-16 16:56:10 -0400831
Jamie Madill6c1f6712017-02-14 19:08:04 -0500832 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000833}
834
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400835void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400836{
837 // The spec specifies the underlying Fence object is not deleted until all current
838 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
839 // and since our API is currently designed for being called from a single thread, we can delete
840 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400841 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400842}
843
Yunchao Hea336b902017-08-02 16:05:21 +0800844void Context::deleteProgramPipeline(GLuint pipeline)
845{
846 if (mState.mPipelines->getProgramPipeline(pipeline))
847 {
848 detachProgramPipeline(pipeline);
849 }
850
851 mState.mPipelines->deleteObject(this, pipeline);
852}
853
Sami Väisänene45e53b2016-05-25 10:36:04 +0300854void Context::deletePaths(GLuint first, GLsizei range)
855{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500856 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300857}
858
Brandon Jones59770802018-04-02 13:18:42 -0700859bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300860{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500861 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300862 if (pathObj == nullptr)
863 return false;
864
865 return pathObj->hasPathData();
866}
867
Brandon Jones59770802018-04-02 13:18:42 -0700868bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300869{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500870 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300871}
872
Brandon Jones59770802018-04-02 13:18:42 -0700873void Context::pathCommands(GLuint path,
874 GLsizei numCommands,
875 const GLubyte *commands,
876 GLsizei numCoords,
877 GLenum coordType,
878 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300879{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500880 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300881
882 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
883}
884
Jamie Madill007530e2017-12-28 14:27:04 -0500885void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300886{
Jamie Madill007530e2017-12-28 14:27:04 -0500887 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300888
889 switch (pname)
890 {
891 case GL_PATH_STROKE_WIDTH_CHROMIUM:
892 pathObj->setStrokeWidth(value);
893 break;
894 case GL_PATH_END_CAPS_CHROMIUM:
895 pathObj->setEndCaps(static_cast<GLenum>(value));
896 break;
897 case GL_PATH_JOIN_STYLE_CHROMIUM:
898 pathObj->setJoinStyle(static_cast<GLenum>(value));
899 break;
900 case GL_PATH_MITER_LIMIT_CHROMIUM:
901 pathObj->setMiterLimit(value);
902 break;
903 case GL_PATH_STROKE_BOUND_CHROMIUM:
904 pathObj->setStrokeBound(value);
905 break;
906 default:
907 UNREACHABLE();
908 break;
909 }
910}
911
Jamie Madill007530e2017-12-28 14:27:04 -0500912void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300913{
Jamie Madill007530e2017-12-28 14:27:04 -0500914 // TODO(jmadill): Should use proper clamping/casting.
915 pathParameterf(path, pname, static_cast<GLfloat>(value));
916}
917
918void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
919{
920 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300921
922 switch (pname)
923 {
924 case GL_PATH_STROKE_WIDTH_CHROMIUM:
925 *value = pathObj->getStrokeWidth();
926 break;
927 case GL_PATH_END_CAPS_CHROMIUM:
928 *value = static_cast<GLfloat>(pathObj->getEndCaps());
929 break;
930 case GL_PATH_JOIN_STYLE_CHROMIUM:
931 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
932 break;
933 case GL_PATH_MITER_LIMIT_CHROMIUM:
934 *value = pathObj->getMiterLimit();
935 break;
936 case GL_PATH_STROKE_BOUND_CHROMIUM:
937 *value = pathObj->getStrokeBound();
938 break;
939 default:
940 UNREACHABLE();
941 break;
942 }
943}
944
Jamie Madill007530e2017-12-28 14:27:04 -0500945void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
946{
947 GLfloat val = 0.0f;
948 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
949 if (value)
950 *value = static_cast<GLint>(val);
951}
952
Brandon Jones59770802018-04-02 13:18:42 -0700953void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300954{
955 mGLState.setPathStencilFunc(func, ref, mask);
956}
957
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000958void Context::deleteFramebuffer(GLuint framebuffer)
959{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500960 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000961 {
962 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000963 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500964
Jamie Madill6c1f6712017-02-14 19:08:04 -0500965 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000966}
967
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500968void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000969{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500970 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000971 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500972 GLuint fence = fences[i];
973
974 FenceNV *fenceObject = nullptr;
975 if (mFenceNVMap.erase(fence, &fenceObject))
976 {
977 mFenceNVHandleAllocator.release(fence);
978 delete fenceObject;
979 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000980 }
981}
982
Geoff Lang70d0f492015-12-10 17:45:46 -0500983Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000984{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500985 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000986}
987
Geoff Lang70d0f492015-12-10 17:45:46 -0500988Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000989{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500990 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000991}
992
Jamie Madill70b5bb02017-08-28 13:32:37 -0400993Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400994{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400995 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400996}
997
Jamie Madill57a89722013-07-02 11:57:03 -0400998VertexArray *Context::getVertexArray(GLuint handle) const
999{
Jamie Madill96a483b2017-06-27 16:49:21 -04001000 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -04001001}
1002
Jamie Madilldc356042013-07-19 16:36:57 -04001003Sampler *Context::getSampler(GLuint handle) const
1004{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001005 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001006}
1007
Geoff Langc8058452014-02-03 12:04:11 -05001008TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1009{
Jamie Madill96a483b2017-06-27 16:49:21 -04001010 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001011}
1012
Yunchao Hea336b902017-08-02 16:05:21 +08001013ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1014{
1015 return mState.mPipelines->getProgramPipeline(handle);
1016}
1017
Geoff Lang75359662018-04-11 01:42:27 -04001018gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001019{
1020 switch (identifier)
1021 {
1022 case GL_BUFFER:
1023 return getBuffer(name);
1024 case GL_SHADER:
1025 return getShader(name);
1026 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001027 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001028 case GL_VERTEX_ARRAY:
1029 return getVertexArray(name);
1030 case GL_QUERY:
1031 return getQuery(name);
1032 case GL_TRANSFORM_FEEDBACK:
1033 return getTransformFeedback(name);
1034 case GL_SAMPLER:
1035 return getSampler(name);
1036 case GL_TEXTURE:
1037 return getTexture(name);
1038 case GL_RENDERBUFFER:
1039 return getRenderbuffer(name);
1040 case GL_FRAMEBUFFER:
1041 return getFramebuffer(name);
1042 default:
1043 UNREACHABLE();
1044 return nullptr;
1045 }
1046}
1047
Geoff Lang75359662018-04-11 01:42:27 -04001048gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001049{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001050 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001051}
1052
Martin Radev9d901792016-07-15 15:58:58 +03001053void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1054{
Geoff Lang75359662018-04-11 01:42:27 -04001055 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001056 ASSERT(object != nullptr);
1057
1058 std::string labelName = GetObjectLabelFromPointer(length, label);
1059 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001060
1061 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1062 // specified object is active until we do this.
1063 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001064}
1065
1066void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1067{
Geoff Lang75359662018-04-11 01:42:27 -04001068 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001069 ASSERT(object != nullptr);
1070
1071 std::string labelName = GetObjectLabelFromPointer(length, label);
1072 object->setLabel(labelName);
1073}
1074
1075void Context::getObjectLabel(GLenum identifier,
1076 GLuint name,
1077 GLsizei bufSize,
1078 GLsizei *length,
1079 GLchar *label) const
1080{
Geoff Lang75359662018-04-11 01:42:27 -04001081 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001082 ASSERT(object != nullptr);
1083
1084 const std::string &objectLabel = object->getLabel();
1085 GetObjectLabelBase(objectLabel, bufSize, length, label);
1086}
1087
1088void Context::getObjectPtrLabel(const void *ptr,
1089 GLsizei bufSize,
1090 GLsizei *length,
1091 GLchar *label) const
1092{
Geoff Lang75359662018-04-11 01:42:27 -04001093 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001094 ASSERT(object != nullptr);
1095
1096 const std::string &objectLabel = object->getLabel();
1097 GetObjectLabelBase(objectLabel, bufSize, length, label);
1098}
1099
Jamie Madilldc356042013-07-19 16:36:57 -04001100bool Context::isSampler(GLuint samplerName) const
1101{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001102 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001103}
1104
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001105void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001106{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001107 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001108
Jamie Madilldedd7b92014-11-05 16:30:36 -05001109 if (handle == 0)
1110 {
1111 texture = mZeroTextures[target].get();
1112 }
1113 else
1114 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001115 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001116 }
1117
1118 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001119 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001120 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001121}
1122
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001123void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001124{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001125 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1126 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001127 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001128 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001129}
1130
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001131void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001132{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001133 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1134 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001135 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001136 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001137 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001138}
1139
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001140void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001141{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001142 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001143 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001144 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001145 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001146}
1147
Shao80957d92017-02-20 21:25:59 +08001148void Context::bindVertexBuffer(GLuint bindingIndex,
1149 GLuint bufferHandle,
1150 GLintptr offset,
1151 GLsizei stride)
1152{
1153 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001154 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001155 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001156}
1157
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001158void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001159{
Geoff Lang76b10c92014-09-05 16:28:14 -04001160 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001161 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001162 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001163 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001164 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001165}
1166
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001167void Context::bindImageTexture(GLuint unit,
1168 GLuint texture,
1169 GLint level,
1170 GLboolean layered,
1171 GLint layer,
1172 GLenum access,
1173 GLenum format)
1174{
1175 Texture *tex = mState.mTextures->getTexture(texture);
1176 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1177}
1178
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001179void Context::useProgram(GLuint program)
1180{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001181 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001182 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001183}
1184
Jiajia Qin5451d532017-11-16 17:16:34 +08001185void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1186{
1187 UNIMPLEMENTED();
1188}
1189
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001190void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001191{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001192 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001193 TransformFeedback *transformFeedback =
1194 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001195 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001196 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001197}
1198
Yunchao Hea336b902017-08-02 16:05:21 +08001199void Context::bindProgramPipeline(GLuint pipelineHandle)
1200{
1201 ProgramPipeline *pipeline =
1202 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1203 mGLState.setProgramPipelineBinding(this, pipeline);
1204}
1205
Corentin Wallezad3ae902018-03-09 13:40:42 -05001206void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001207{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001208 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001209 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001210
Geoff Lang5aad9672014-09-08 11:10:42 -04001211 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001212 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001213
1214 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001215 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001216 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001217}
1218
Corentin Wallezad3ae902018-03-09 13:40:42 -05001219void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001220{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001221 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001222 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001223
Jamie Madill5188a272018-07-25 10:53:56 -04001224 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001225
Geoff Lang5aad9672014-09-08 11:10:42 -04001226 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001227 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001228 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001229}
1230
Corentin Wallezad3ae902018-03-09 13:40:42 -05001231void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001232{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001233 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001234
1235 Query *queryObject = getQuery(id, true, target);
1236 ASSERT(queryObject);
1237
Jamie Madill5188a272018-07-25 10:53:56 -04001238 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001239}
1240
Corentin Wallezad3ae902018-03-09 13:40:42 -05001241void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001242{
1243 switch (pname)
1244 {
1245 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001246 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001247 break;
1248 case GL_QUERY_COUNTER_BITS_EXT:
1249 switch (target)
1250 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001251 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001252 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1253 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001254 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001255 params[0] = getExtensions().queryCounterBitsTimestamp;
1256 break;
1257 default:
1258 UNREACHABLE();
1259 params[0] = 0;
1260 break;
1261 }
1262 break;
1263 default:
1264 UNREACHABLE();
1265 return;
1266 }
1267}
1268
Corentin Wallezad3ae902018-03-09 13:40:42 -05001269void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001270 GLenum pname,
1271 GLsizei bufSize,
1272 GLsizei *length,
1273 GLint *params)
1274{
1275 getQueryiv(target, pname, params);
1276}
1277
Geoff Lang2186c382016-10-14 10:54:54 -04001278void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001279{
Jamie Madill5188a272018-07-25 10:53:56 -04001280 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001281}
1282
Brandon Jones59770802018-04-02 13:18:42 -07001283void Context::getQueryObjectivRobust(GLuint id,
1284 GLenum pname,
1285 GLsizei bufSize,
1286 GLsizei *length,
1287 GLint *params)
1288{
1289 getQueryObjectiv(id, pname, params);
1290}
1291
Geoff Lang2186c382016-10-14 10:54:54 -04001292void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001293{
Jamie Madill5188a272018-07-25 10:53:56 -04001294 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001295}
1296
Brandon Jones59770802018-04-02 13:18:42 -07001297void Context::getQueryObjectuivRobust(GLuint id,
1298 GLenum pname,
1299 GLsizei bufSize,
1300 GLsizei *length,
1301 GLuint *params)
1302{
1303 getQueryObjectuiv(id, pname, params);
1304}
1305
Geoff Lang2186c382016-10-14 10:54:54 -04001306void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001307{
Jamie Madill5188a272018-07-25 10:53:56 -04001308 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001309}
1310
Brandon Jones59770802018-04-02 13:18:42 -07001311void Context::getQueryObjecti64vRobust(GLuint id,
1312 GLenum pname,
1313 GLsizei bufSize,
1314 GLsizei *length,
1315 GLint64 *params)
1316{
1317 getQueryObjecti64v(id, pname, params);
1318}
1319
Geoff Lang2186c382016-10-14 10:54:54 -04001320void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001321{
Jamie Madill5188a272018-07-25 10:53:56 -04001322 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001323}
1324
Brandon Jones59770802018-04-02 13:18:42 -07001325void Context::getQueryObjectui64vRobust(GLuint id,
1326 GLenum pname,
1327 GLsizei bufSize,
1328 GLsizei *length,
1329 GLuint64 *params)
1330{
1331 getQueryObjectui64v(id, pname, params);
1332}
1333
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001334Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001335{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001336 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001337}
1338
Jamie Madill2f348d22017-06-05 10:50:59 -04001339FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001340{
Jamie Madill96a483b2017-06-27 16:49:21 -04001341 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001342}
1343
Corentin Wallezad3ae902018-03-09 13:40:42 -05001344Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001345{
Jamie Madill96a483b2017-06-27 16:49:21 -04001346 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001347 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001348 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001349 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001350
1351 Query *query = mQueryMap.query(handle);
1352 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001353 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001354 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001355 query = new Query(mImplementation->createQuery(type), handle);
1356 query->addRef();
1357 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001358 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001359 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001360}
1361
Geoff Lang70d0f492015-12-10 17:45:46 -05001362Query *Context::getQuery(GLuint handle) const
1363{
Jamie Madill96a483b2017-06-27 16:49:21 -04001364 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001365}
1366
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001367Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001368{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001369 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1370 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001371}
1372
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001373Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001374{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001375 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001376}
1377
Geoff Lang492a7e42014-11-05 13:27:06 -05001378Compiler *Context::getCompiler() const
1379{
Jamie Madill2f348d22017-06-05 10:50:59 -04001380 if (mCompiler.get() == nullptr)
1381 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001382 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001383 }
1384 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001385}
1386
Jamie Madillc1d770e2017-04-13 17:31:24 -04001387void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001388{
1389 switch (pname)
1390 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001391 case GL_SHADER_COMPILER:
1392 *params = GL_TRUE;
1393 break;
1394 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1395 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1396 break;
1397 default:
1398 mGLState.getBooleanv(pname, params);
1399 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001400 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001401}
1402
Jamie Madillc1d770e2017-04-13 17:31:24 -04001403void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001404{
Shannon Woods53a94a82014-06-24 15:20:36 -04001405 // Queries about context capabilities and maximums are answered by Context.
1406 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001407 switch (pname)
1408 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001409 case GL_ALIASED_LINE_WIDTH_RANGE:
1410 params[0] = mCaps.minAliasedLineWidth;
1411 params[1] = mCaps.maxAliasedLineWidth;
1412 break;
1413 case GL_ALIASED_POINT_SIZE_RANGE:
1414 params[0] = mCaps.minAliasedPointSize;
1415 params[1] = mCaps.maxAliasedPointSize;
1416 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001417 case GL_SMOOTH_POINT_SIZE_RANGE:
1418 params[0] = mCaps.minSmoothPointSize;
1419 params[1] = mCaps.maxSmoothPointSize;
1420 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001421 case GL_SMOOTH_LINE_WIDTH_RANGE:
1422 params[0] = mCaps.minSmoothLineWidth;
1423 params[1] = mCaps.maxSmoothLineWidth;
1424 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001425 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1426 ASSERT(mExtensions.textureFilterAnisotropic);
1427 *params = mExtensions.maxTextureAnisotropy;
1428 break;
1429 case GL_MAX_TEXTURE_LOD_BIAS:
1430 *params = mCaps.maxLODBias;
1431 break;
1432
1433 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1434 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1435 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001436 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1437 // GLES1 constants for modelview/projection matrix.
1438 if (getClientVersion() < Version(2, 0))
1439 {
1440 mGLState.getFloatv(pname, params);
1441 }
1442 else
1443 {
1444 ASSERT(mExtensions.pathRendering);
1445 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1446 memcpy(params, m, 16 * sizeof(GLfloat));
1447 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001448 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001449 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001450
Jamie Madill231c7f52017-04-26 13:45:37 -04001451 default:
1452 mGLState.getFloatv(pname, params);
1453 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001454 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001455}
1456
Jamie Madillc1d770e2017-04-13 17:31:24 -04001457void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001458{
Shannon Woods53a94a82014-06-24 15:20:36 -04001459 // Queries about context capabilities and maximums are answered by Context.
1460 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001461
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001462 switch (pname)
1463 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001464 case GL_MAX_VERTEX_ATTRIBS:
1465 *params = mCaps.maxVertexAttributes;
1466 break;
1467 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1468 *params = mCaps.maxVertexUniformVectors;
1469 break;
1470 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001471 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001472 break;
1473 case GL_MAX_VARYING_VECTORS:
1474 *params = mCaps.maxVaryingVectors;
1475 break;
1476 case GL_MAX_VARYING_COMPONENTS:
1477 *params = mCaps.maxVertexOutputComponents;
1478 break;
1479 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1480 *params = mCaps.maxCombinedTextureImageUnits;
1481 break;
1482 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001483 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001484 break;
1485 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001486 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001487 break;
1488 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1489 *params = mCaps.maxFragmentUniformVectors;
1490 break;
1491 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001492 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001493 break;
1494 case GL_MAX_RENDERBUFFER_SIZE:
1495 *params = mCaps.maxRenderbufferSize;
1496 break;
1497 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1498 *params = mCaps.maxColorAttachments;
1499 break;
1500 case GL_MAX_DRAW_BUFFERS_EXT:
1501 *params = mCaps.maxDrawBuffers;
1502 break;
1503 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1504 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1505 case GL_SUBPIXEL_BITS:
1506 *params = 4;
1507 break;
1508 case GL_MAX_TEXTURE_SIZE:
1509 *params = mCaps.max2DTextureSize;
1510 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001511 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1512 *params = mCaps.maxRectangleTextureSize;
1513 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001514 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1515 *params = mCaps.maxCubeMapTextureSize;
1516 break;
1517 case GL_MAX_3D_TEXTURE_SIZE:
1518 *params = mCaps.max3DTextureSize;
1519 break;
1520 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1521 *params = mCaps.maxArrayTextureLayers;
1522 break;
1523 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1524 *params = mCaps.uniformBufferOffsetAlignment;
1525 break;
1526 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1527 *params = mCaps.maxUniformBufferBindings;
1528 break;
1529 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001530 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001531 break;
1532 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001533 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001534 break;
1535 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1536 *params = mCaps.maxCombinedTextureImageUnits;
1537 break;
1538 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1539 *params = mCaps.maxVertexOutputComponents;
1540 break;
1541 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1542 *params = mCaps.maxFragmentInputComponents;
1543 break;
1544 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1545 *params = mCaps.minProgramTexelOffset;
1546 break;
1547 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1548 *params = mCaps.maxProgramTexelOffset;
1549 break;
1550 case GL_MAJOR_VERSION:
1551 *params = getClientVersion().major;
1552 break;
1553 case GL_MINOR_VERSION:
1554 *params = getClientVersion().minor;
1555 break;
1556 case GL_MAX_ELEMENTS_INDICES:
1557 *params = mCaps.maxElementsIndices;
1558 break;
1559 case GL_MAX_ELEMENTS_VERTICES:
1560 *params = mCaps.maxElementsVertices;
1561 break;
1562 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1563 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1564 break;
1565 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1566 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1567 break;
1568 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1569 *params = mCaps.maxTransformFeedbackSeparateComponents;
1570 break;
1571 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1572 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1573 break;
1574 case GL_MAX_SAMPLES_ANGLE:
1575 *params = mCaps.maxSamples;
1576 break;
1577 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001578 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001579 params[0] = mCaps.maxViewportWidth;
1580 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001581 }
1582 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001583 case GL_COMPRESSED_TEXTURE_FORMATS:
1584 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1585 params);
1586 break;
1587 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1588 *params = mResetStrategy;
1589 break;
1590 case GL_NUM_SHADER_BINARY_FORMATS:
1591 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1592 break;
1593 case GL_SHADER_BINARY_FORMATS:
1594 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1595 break;
1596 case GL_NUM_PROGRAM_BINARY_FORMATS:
1597 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1598 break;
1599 case GL_PROGRAM_BINARY_FORMATS:
1600 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1601 break;
1602 case GL_NUM_EXTENSIONS:
1603 *params = static_cast<GLint>(mExtensionStrings.size());
1604 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001605
Geoff Lang38f24ee2018-10-01 13:04:59 -04001606 // GL_ANGLE_request_extension
1607 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1608 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1609 break;
1610
Jamie Madill231c7f52017-04-26 13:45:37 -04001611 // GL_KHR_debug
1612 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1613 *params = mExtensions.maxDebugMessageLength;
1614 break;
1615 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1616 *params = mExtensions.maxDebugLoggedMessages;
1617 break;
1618 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1619 *params = mExtensions.maxDebugGroupStackDepth;
1620 break;
1621 case GL_MAX_LABEL_LENGTH:
1622 *params = mExtensions.maxLabelLength;
1623 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001624
Martin Radeve5285d22017-07-14 16:23:53 +03001625 // GL_ANGLE_multiview
1626 case GL_MAX_VIEWS_ANGLE:
1627 *params = mExtensions.maxViews;
1628 break;
1629
Jamie Madill231c7f52017-04-26 13:45:37 -04001630 // GL_EXT_disjoint_timer_query
1631 case GL_GPU_DISJOINT_EXT:
1632 *params = mImplementation->getGPUDisjoint();
1633 break;
1634 case GL_MAX_FRAMEBUFFER_WIDTH:
1635 *params = mCaps.maxFramebufferWidth;
1636 break;
1637 case GL_MAX_FRAMEBUFFER_HEIGHT:
1638 *params = mCaps.maxFramebufferHeight;
1639 break;
1640 case GL_MAX_FRAMEBUFFER_SAMPLES:
1641 *params = mCaps.maxFramebufferSamples;
1642 break;
1643 case GL_MAX_SAMPLE_MASK_WORDS:
1644 *params = mCaps.maxSampleMaskWords;
1645 break;
1646 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1647 *params = mCaps.maxColorTextureSamples;
1648 break;
1649 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1650 *params = mCaps.maxDepthTextureSamples;
1651 break;
1652 case GL_MAX_INTEGER_SAMPLES:
1653 *params = mCaps.maxIntegerSamples;
1654 break;
1655 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1656 *params = mCaps.maxVertexAttribRelativeOffset;
1657 break;
1658 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1659 *params = mCaps.maxVertexAttribBindings;
1660 break;
1661 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1662 *params = mCaps.maxVertexAttribStride;
1663 break;
1664 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001665 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001666 break;
1667 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001668 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001669 break;
1670 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001671 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001672 break;
1673 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001674 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001675 break;
1676 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001677 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001678 break;
1679 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001680 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001681 break;
1682 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001683 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001684 break;
1685 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001686 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001687 break;
1688 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1689 *params = mCaps.minProgramTextureGatherOffset;
1690 break;
1691 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1692 *params = mCaps.maxProgramTextureGatherOffset;
1693 break;
1694 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1695 *params = mCaps.maxComputeWorkGroupInvocations;
1696 break;
1697 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001698 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001699 break;
1700 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001701 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001702 break;
1703 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1704 *params = mCaps.maxComputeSharedMemorySize;
1705 break;
1706 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001707 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001708 break;
1709 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001710 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001711 break;
1712 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001713 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001714 break;
1715 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001716 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001717 break;
1718 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001719 *params =
1720 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001721 break;
1722 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001723 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001724 break;
1725 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1726 *params = mCaps.maxCombinedShaderOutputResources;
1727 break;
1728 case GL_MAX_UNIFORM_LOCATIONS:
1729 *params = mCaps.maxUniformLocations;
1730 break;
1731 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1732 *params = mCaps.maxAtomicCounterBufferBindings;
1733 break;
1734 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1735 *params = mCaps.maxAtomicCounterBufferSize;
1736 break;
1737 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1738 *params = mCaps.maxCombinedAtomicCounterBuffers;
1739 break;
1740 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1741 *params = mCaps.maxCombinedAtomicCounters;
1742 break;
1743 case GL_MAX_IMAGE_UNITS:
1744 *params = mCaps.maxImageUnits;
1745 break;
1746 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1747 *params = mCaps.maxCombinedImageUniforms;
1748 break;
1749 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1750 *params = mCaps.maxShaderStorageBufferBindings;
1751 break;
1752 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1753 *params = mCaps.maxCombinedShaderStorageBlocks;
1754 break;
1755 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1756 *params = mCaps.shaderStorageBufferOffsetAlignment;
1757 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001758
1759 // GL_EXT_geometry_shader
1760 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1761 *params = mCaps.maxFramebufferLayers;
1762 break;
1763 case GL_LAYER_PROVOKING_VERTEX_EXT:
1764 *params = mCaps.layerProvokingVertex;
1765 break;
1766 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001767 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001768 break;
1769 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001770 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001771 break;
1772 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001773 *params =
1774 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001775 break;
1776 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1777 *params = mCaps.maxGeometryInputComponents;
1778 break;
1779 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1780 *params = mCaps.maxGeometryOutputComponents;
1781 break;
1782 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1783 *params = mCaps.maxGeometryOutputVertices;
1784 break;
1785 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1786 *params = mCaps.maxGeometryTotalOutputComponents;
1787 break;
1788 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1789 *params = mCaps.maxGeometryShaderInvocations;
1790 break;
1791 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001792 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001793 break;
1794 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001795 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001796 break;
1797 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001798 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001799 break;
1800 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001801 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001802 break;
1803 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001804 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001805 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001806 // GLES1 emulation: Caps queries
1807 case GL_MAX_TEXTURE_UNITS:
1808 *params = mCaps.maxMultitextureUnits;
1809 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001810 case GL_MAX_MODELVIEW_STACK_DEPTH:
1811 *params = mCaps.maxModelviewMatrixStackDepth;
1812 break;
1813 case GL_MAX_PROJECTION_STACK_DEPTH:
1814 *params = mCaps.maxProjectionMatrixStackDepth;
1815 break;
1816 case GL_MAX_TEXTURE_STACK_DEPTH:
1817 *params = mCaps.maxTextureMatrixStackDepth;
1818 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001819 case GL_MAX_LIGHTS:
1820 *params = mCaps.maxLights;
1821 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001822 case GL_MAX_CLIP_PLANES:
1823 *params = mCaps.maxClipPlanes;
1824 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001825 // GLES1 emulation: Vertex attribute queries
1826 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1827 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1828 case GL_COLOR_ARRAY_BUFFER_BINDING:
1829 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1830 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1831 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1832 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1833 break;
1834 case GL_VERTEX_ARRAY_STRIDE:
1835 case GL_NORMAL_ARRAY_STRIDE:
1836 case GL_COLOR_ARRAY_STRIDE:
1837 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1838 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1839 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1840 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1841 break;
1842 case GL_VERTEX_ARRAY_SIZE:
1843 case GL_COLOR_ARRAY_SIZE:
1844 case GL_TEXTURE_COORD_ARRAY_SIZE:
1845 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1846 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1847 break;
1848 case GL_VERTEX_ARRAY_TYPE:
1849 case GL_COLOR_ARRAY_TYPE:
1850 case GL_NORMAL_ARRAY_TYPE:
1851 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1852 case GL_TEXTURE_COORD_ARRAY_TYPE:
1853 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1854 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1855 break;
1856
jchen1082af6202018-06-22 10:59:52 +08001857 // GL_KHR_parallel_shader_compile
1858 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1859 *params = mGLState.getMaxShaderCompilerThreads();
1860 break;
1861
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001862 // GL_EXT_blend_func_extended
1863 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1864 *params = mExtensions.maxDualSourceDrawBuffers;
1865 break;
1866
Jamie Madill231c7f52017-04-26 13:45:37 -04001867 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001868 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001869 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001870 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001871}
1872
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001873void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001874{
Shannon Woods53a94a82014-06-24 15:20:36 -04001875 // Queries about context capabilities and maximums are answered by Context.
1876 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001877 switch (pname)
1878 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001879 case GL_MAX_ELEMENT_INDEX:
1880 *params = mCaps.maxElementIndex;
1881 break;
1882 case GL_MAX_UNIFORM_BLOCK_SIZE:
1883 *params = mCaps.maxUniformBlockSize;
1884 break;
1885 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001886 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001887 break;
1888 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001889 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001890 break;
1891 case GL_MAX_SERVER_WAIT_TIMEOUT:
1892 *params = mCaps.maxServerWaitTimeout;
1893 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001894
Jamie Madill231c7f52017-04-26 13:45:37 -04001895 // GL_EXT_disjoint_timer_query
1896 case GL_TIMESTAMP_EXT:
1897 *params = mImplementation->getTimestamp();
1898 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001899
Jamie Madill231c7f52017-04-26 13:45:37 -04001900 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1901 *params = mCaps.maxShaderStorageBlockSize;
1902 break;
1903 default:
1904 UNREACHABLE();
1905 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001906 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001907}
1908
Geoff Lang70d0f492015-12-10 17:45:46 -05001909void Context::getPointerv(GLenum pname, void **params) const
1910{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001911 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001912}
1913
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001914void Context::getPointervRobustANGLERobust(GLenum pname,
1915 GLsizei bufSize,
1916 GLsizei *length,
1917 void **params)
1918{
1919 UNIMPLEMENTED();
1920}
1921
Martin Radev66fb8202016-07-28 11:45:20 +03001922void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001923{
Shannon Woods53a94a82014-06-24 15:20:36 -04001924 // Queries about context capabilities and maximums are answered by Context.
1925 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001926
1927 GLenum nativeType;
1928 unsigned int numParams;
1929 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1930 ASSERT(queryStatus);
1931
1932 if (nativeType == GL_INT)
1933 {
1934 switch (target)
1935 {
1936 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1937 ASSERT(index < 3u);
1938 *data = mCaps.maxComputeWorkGroupCount[index];
1939 break;
1940 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1941 ASSERT(index < 3u);
1942 *data = mCaps.maxComputeWorkGroupSize[index];
1943 break;
1944 default:
1945 mGLState.getIntegeri_v(target, index, data);
1946 }
1947 }
1948 else
1949 {
1950 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1951 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001952}
1953
Brandon Jones59770802018-04-02 13:18:42 -07001954void Context::getIntegeri_vRobust(GLenum target,
1955 GLuint index,
1956 GLsizei bufSize,
1957 GLsizei *length,
1958 GLint *data)
1959{
1960 getIntegeri_v(target, index, data);
1961}
1962
Martin Radev66fb8202016-07-28 11:45:20 +03001963void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001964{
Shannon Woods53a94a82014-06-24 15:20:36 -04001965 // Queries about context capabilities and maximums are answered by Context.
1966 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001967
1968 GLenum nativeType;
1969 unsigned int numParams;
1970 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1971 ASSERT(queryStatus);
1972
1973 if (nativeType == GL_INT_64_ANGLEX)
1974 {
1975 mGLState.getInteger64i_v(target, index, data);
1976 }
1977 else
1978 {
1979 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1980 }
1981}
1982
Brandon Jones59770802018-04-02 13:18:42 -07001983void Context::getInteger64i_vRobust(GLenum target,
1984 GLuint index,
1985 GLsizei bufSize,
1986 GLsizei *length,
1987 GLint64 *data)
1988{
1989 getInteger64i_v(target, index, data);
1990}
1991
Martin Radev66fb8202016-07-28 11:45:20 +03001992void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1993{
1994 // Queries about context capabilities and maximums are answered by Context.
1995 // Queries about current GL state values are answered by State.
1996
1997 GLenum nativeType;
1998 unsigned int numParams;
1999 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
2000 ASSERT(queryStatus);
2001
2002 if (nativeType == GL_BOOL)
2003 {
2004 mGLState.getBooleani_v(target, index, data);
2005 }
2006 else
2007 {
2008 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2009 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002010}
2011
Brandon Jones59770802018-04-02 13:18:42 -07002012void Context::getBooleani_vRobust(GLenum target,
2013 GLuint index,
2014 GLsizei bufSize,
2015 GLsizei *length,
2016 GLboolean *data)
2017{
2018 getBooleani_v(target, index, data);
2019}
2020
Corentin Wallez336129f2017-10-17 15:55:40 -04002021void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002022{
2023 Buffer *buffer = mGLState.getTargetBuffer(target);
2024 QueryBufferParameteriv(buffer, pname, params);
2025}
2026
Brandon Jones59770802018-04-02 13:18:42 -07002027void Context::getBufferParameterivRobust(BufferBinding target,
2028 GLenum pname,
2029 GLsizei bufSize,
2030 GLsizei *length,
2031 GLint *params)
2032{
2033 getBufferParameteriv(target, pname, params);
2034}
2035
He Yunchao010e4db2017-03-03 14:22:06 +08002036void Context::getFramebufferAttachmentParameteriv(GLenum target,
2037 GLenum attachment,
2038 GLenum pname,
2039 GLint *params)
2040{
2041 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002042 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002043}
2044
Brandon Jones59770802018-04-02 13:18:42 -07002045void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2046 GLenum attachment,
2047 GLenum pname,
2048 GLsizei bufSize,
2049 GLsizei *length,
2050 GLint *params)
2051{
2052 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2053}
2054
He Yunchao010e4db2017-03-03 14:22:06 +08002055void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2056{
2057 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2058 QueryRenderbufferiv(this, renderbuffer, pname, params);
2059}
2060
Brandon Jones59770802018-04-02 13:18:42 -07002061void Context::getRenderbufferParameterivRobust(GLenum target,
2062 GLenum pname,
2063 GLsizei bufSize,
2064 GLsizei *length,
2065 GLint *params)
2066{
2067 getRenderbufferParameteriv(target, pname, params);
2068}
2069
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002070void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002071{
Till Rathmannb8543632018-10-02 19:46:14 +02002072 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002073 QueryTexParameterfv(texture, pname, params);
2074}
2075
Brandon Jones59770802018-04-02 13:18:42 -07002076void Context::getTexParameterfvRobust(TextureType target,
2077 GLenum pname,
2078 GLsizei bufSize,
2079 GLsizei *length,
2080 GLfloat *params)
2081{
2082 getTexParameterfv(target, pname, params);
2083}
2084
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002085void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002086{
Till Rathmannb8543632018-10-02 19:46:14 +02002087 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002088 QueryTexParameteriv(texture, pname, params);
2089}
Jiajia Qin5451d532017-11-16 17:16:34 +08002090
Till Rathmannb8543632018-10-02 19:46:14 +02002091void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2092{
2093 const Texture *const texture = getTargetTexture(target);
2094 QueryTexParameterIiv(texture, pname, params);
2095}
2096
2097void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2098{
2099 const Texture *const texture = getTargetTexture(target);
2100 QueryTexParameterIuiv(texture, pname, params);
2101}
2102
Brandon Jones59770802018-04-02 13:18:42 -07002103void Context::getTexParameterivRobust(TextureType target,
2104 GLenum pname,
2105 GLsizei bufSize,
2106 GLsizei *length,
2107 GLint *params)
2108{
2109 getTexParameteriv(target, pname, params);
2110}
2111
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002112void Context::getTexParameterIivRobust(TextureType target,
2113 GLenum pname,
2114 GLsizei bufSize,
2115 GLsizei *length,
2116 GLint *params)
2117{
2118 UNIMPLEMENTED();
2119}
2120
2121void Context::getTexParameterIuivRobust(TextureType target,
2122 GLenum pname,
2123 GLsizei bufSize,
2124 GLsizei *length,
2125 GLuint *params)
2126{
2127 UNIMPLEMENTED();
2128}
2129
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002130void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002131{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002132 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002133 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002134}
2135
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002136void Context::getTexLevelParameterivRobust(TextureTarget target,
2137 GLint level,
2138 GLenum pname,
2139 GLsizei bufSize,
2140 GLsizei *length,
2141 GLint *params)
2142{
2143 UNIMPLEMENTED();
2144}
2145
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002146void Context::getTexLevelParameterfv(TextureTarget target,
2147 GLint level,
2148 GLenum pname,
2149 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002150{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002151 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002152 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002153}
2154
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002155void Context::getTexLevelParameterfvRobust(TextureTarget target,
2156 GLint level,
2157 GLenum pname,
2158 GLsizei bufSize,
2159 GLsizei *length,
2160 GLfloat *params)
2161{
2162 UNIMPLEMENTED();
2163}
2164
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002165void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002166{
Till Rathmannb8543632018-10-02 19:46:14 +02002167 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002168 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002169 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002170}
2171
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002172void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002173{
Till Rathmannb8543632018-10-02 19:46:14 +02002174 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002175 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002176 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002177}
2178
Brandon Jones59770802018-04-02 13:18:42 -07002179void Context::texParameterfvRobust(TextureType target,
2180 GLenum pname,
2181 GLsizei bufSize,
2182 const GLfloat *params)
2183{
2184 texParameterfv(target, pname, params);
2185}
2186
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002187void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002188{
Till Rathmannb8543632018-10-02 19:46:14 +02002189 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002190 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002191 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002192}
2193
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002194void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002195{
Till Rathmannb8543632018-10-02 19:46:14 +02002196 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002197 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002198 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002199}
2200
Till Rathmannb8543632018-10-02 19:46:14 +02002201void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2202{
2203 Texture *const texture = getTargetTexture(target);
2204 SetTexParameterIiv(this, texture, pname, params);
2205 onTextureChange(texture);
2206}
2207
2208void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2209{
2210 Texture *const texture = getTargetTexture(target);
2211 SetTexParameterIuiv(this, texture, pname, params);
2212 onTextureChange(texture);
2213}
2214
Brandon Jones59770802018-04-02 13:18:42 -07002215void Context::texParameterivRobust(TextureType target,
2216 GLenum pname,
2217 GLsizei bufSize,
2218 const GLint *params)
2219{
2220 texParameteriv(target, pname, params);
2221}
2222
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002223void Context::texParameterIivRobust(TextureType target,
2224 GLenum pname,
2225 GLsizei bufSize,
2226 const GLint *params)
2227{
2228 UNIMPLEMENTED();
2229}
2230
2231void Context::texParameterIuivRobust(TextureType target,
2232 GLenum pname,
2233 GLsizei bufSize,
2234 const GLuint *params)
2235{
2236 UNIMPLEMENTED();
2237}
2238
Jamie Madill493f9572018-05-24 19:52:15 -04002239void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002240{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002241 // No-op if count draws no primitives for given mode
2242 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002243 {
2244 return;
2245 }
2246
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002247 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002248 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002249 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002250}
2251
Jamie Madill493f9572018-05-24 19:52:15 -04002252void Context::drawArraysInstanced(PrimitiveMode mode,
2253 GLint first,
2254 GLsizei count,
2255 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002256{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002257 // No-op if count draws no primitives for given mode
2258 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002259 {
2260 return;
2261 }
2262
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002263 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002264 ANGLE_CONTEXT_TRY(
2265 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002266 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2267 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002268}
2269
Jamie Madill493f9572018-05-24 19:52:15 -04002270void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002271{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002272 // No-op if count draws no primitives for given mode
2273 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002274 {
2275 return;
2276 }
2277
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002278 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002279 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002280}
2281
Jamie Madill493f9572018-05-24 19:52:15 -04002282void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002283 GLsizei count,
2284 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002285 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002286 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002287{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002288 // No-op if count draws no primitives for given mode
2289 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002290 {
2291 return;
2292 }
2293
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002294 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002295 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002296 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002297}
2298
Jamie Madill493f9572018-05-24 19:52:15 -04002299void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002300 GLuint start,
2301 GLuint end,
2302 GLsizei count,
2303 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002304 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002305{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002306 // No-op if count draws no primitives for given mode
2307 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002308 {
2309 return;
2310 }
2311
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002312 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002313 ANGLE_CONTEXT_TRY(
2314 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002315}
2316
Jamie Madill493f9572018-05-24 19:52:15 -04002317void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002318{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002319 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002320 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002321}
2322
Jamie Madill493f9572018-05-24 19:52:15 -04002323void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002324{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002325 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002326 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002327}
2328
Jamie Madill675fe712016-12-19 13:07:54 -05002329void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002330{
Jamie Madillafa02a22017-11-23 12:57:38 -05002331 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002332}
2333
Jamie Madill675fe712016-12-19 13:07:54 -05002334void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002335{
Jamie Madillafa02a22017-11-23 12:57:38 -05002336 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002337}
2338
Austin Kinross6ee1e782015-05-29 17:05:37 -07002339void Context::insertEventMarker(GLsizei length, const char *marker)
2340{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002341 ASSERT(mImplementation);
2342 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002343}
2344
2345void Context::pushGroupMarker(GLsizei length, const char *marker)
2346{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002347 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002348
2349 if (marker == nullptr)
2350 {
2351 // From the EXT_debug_marker spec,
2352 // "If <marker> is null then an empty string is pushed on the stack."
2353 mImplementation->pushGroupMarker(length, "");
2354 }
2355 else
2356 {
2357 mImplementation->pushGroupMarker(length, marker);
2358 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002359}
2360
2361void Context::popGroupMarker()
2362{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002363 ASSERT(mImplementation);
2364 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002365}
2366
Geoff Langd8605522016-04-13 10:19:12 -04002367void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2368{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002369 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002370 ASSERT(programObject);
2371
2372 programObject->bindUniformLocation(location, name);
2373}
2374
Brandon Jones59770802018-04-02 13:18:42 -07002375void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002376{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002377 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002378}
2379
Brandon Jones59770802018-04-02 13:18:42 -07002380void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002381{
2382 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2383}
2384
Brandon Jones59770802018-04-02 13:18:42 -07002385void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002386{
2387 GLfloat I[16];
2388 angle::Matrix<GLfloat>::setToIdentity(I);
2389
2390 mGLState.loadPathRenderingMatrix(matrixMode, I);
2391}
2392
2393void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2394{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002395 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002396 if (!pathObj)
2397 return;
2398
Geoff Lang9bf86f02018-07-26 11:46:34 -04002399 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002400
2401 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2402}
2403
2404void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2405{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002406 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002407 if (!pathObj)
2408 return;
2409
Geoff Lang9bf86f02018-07-26 11:46:34 -04002410 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002411
2412 mImplementation->stencilStrokePath(pathObj, reference, mask);
2413}
2414
2415void Context::coverFillPath(GLuint path, GLenum coverMode)
2416{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002417 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002418 if (!pathObj)
2419 return;
2420
Geoff Lang9bf86f02018-07-26 11:46:34 -04002421 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002422
2423 mImplementation->coverFillPath(pathObj, coverMode);
2424}
2425
2426void Context::coverStrokePath(GLuint path, GLenum coverMode)
2427{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002428 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002429 if (!pathObj)
2430 return;
2431
Geoff Lang9bf86f02018-07-26 11:46:34 -04002432 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002433
2434 mImplementation->coverStrokePath(pathObj, coverMode);
2435}
2436
2437void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2438{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002439 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002440 if (!pathObj)
2441 return;
2442
Geoff Lang9bf86f02018-07-26 11:46:34 -04002443 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002444
2445 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2446}
2447
2448void Context::stencilThenCoverStrokePath(GLuint path,
2449 GLint reference,
2450 GLuint mask,
2451 GLenum coverMode)
2452{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002453 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002454 if (!pathObj)
2455 return;
2456
Geoff Lang9bf86f02018-07-26 11:46:34 -04002457 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002458
2459 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2460}
2461
Sami Väisänend59ca052016-06-21 16:10:00 +03002462void Context::coverFillPathInstanced(GLsizei numPaths,
2463 GLenum pathNameType,
2464 const void *paths,
2465 GLuint pathBase,
2466 GLenum coverMode,
2467 GLenum transformType,
2468 const GLfloat *transformValues)
2469{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002470 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002471
Geoff Lang9bf86f02018-07-26 11:46:34 -04002472 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002473
2474 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2475}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002476
Sami Väisänend59ca052016-06-21 16:10:00 +03002477void Context::coverStrokePathInstanced(GLsizei numPaths,
2478 GLenum pathNameType,
2479 const void *paths,
2480 GLuint pathBase,
2481 GLenum coverMode,
2482 GLenum transformType,
2483 const GLfloat *transformValues)
2484{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002485 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002486
2487 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002488 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002489
2490 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2491 transformValues);
2492}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002493
Sami Väisänend59ca052016-06-21 16:10:00 +03002494void Context::stencilFillPathInstanced(GLsizei numPaths,
2495 GLenum pathNameType,
2496 const void *paths,
2497 GLuint pathBase,
2498 GLenum fillMode,
2499 GLuint mask,
2500 GLenum transformType,
2501 const GLfloat *transformValues)
2502{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002503 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002504
2505 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002506 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002507
2508 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2509 transformValues);
2510}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002511
Sami Väisänend59ca052016-06-21 16:10:00 +03002512void Context::stencilStrokePathInstanced(GLsizei numPaths,
2513 GLenum pathNameType,
2514 const void *paths,
2515 GLuint pathBase,
2516 GLint reference,
2517 GLuint mask,
2518 GLenum transformType,
2519 const GLfloat *transformValues)
2520{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002521 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002522
Geoff Lang9bf86f02018-07-26 11:46:34 -04002523 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002524
2525 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2526 transformValues);
2527}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002528
Sami Väisänend59ca052016-06-21 16:10:00 +03002529void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2530 GLenum pathNameType,
2531 const void *paths,
2532 GLuint pathBase,
2533 GLenum fillMode,
2534 GLuint mask,
2535 GLenum coverMode,
2536 GLenum transformType,
2537 const GLfloat *transformValues)
2538{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002539 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002540
Geoff Lang9bf86f02018-07-26 11:46:34 -04002541 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002542
2543 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2544 transformType, transformValues);
2545}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002546
Sami Väisänend59ca052016-06-21 16:10:00 +03002547void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2548 GLenum pathNameType,
2549 const void *paths,
2550 GLuint pathBase,
2551 GLint reference,
2552 GLuint mask,
2553 GLenum coverMode,
2554 GLenum transformType,
2555 const GLfloat *transformValues)
2556{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002557 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002558
Geoff Lang9bf86f02018-07-26 11:46:34 -04002559 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002560
2561 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2562 transformType, transformValues);
2563}
2564
Sami Väisänen46eaa942016-06-29 10:26:37 +03002565void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2566{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002567 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002568
2569 programObject->bindFragmentInputLocation(location, name);
2570}
2571
2572void Context::programPathFragmentInputGen(GLuint program,
2573 GLint location,
2574 GLenum genMode,
2575 GLint components,
2576 const GLfloat *coeffs)
2577{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002578 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002579
jchen103fd614d2018-08-13 12:21:58 +08002580 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002581}
2582
jchen1015015f72017-03-16 13:54:21 +08002583GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2584{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002585 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002586 return QueryProgramResourceIndex(programObject, programInterface, name);
2587}
2588
jchen10fd7c3b52017-03-21 15:36:03 +08002589void Context::getProgramResourceName(GLuint program,
2590 GLenum programInterface,
2591 GLuint index,
2592 GLsizei bufSize,
2593 GLsizei *length,
2594 GLchar *name)
2595{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002596 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002597 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2598}
2599
jchen10191381f2017-04-11 13:59:04 +08002600GLint Context::getProgramResourceLocation(GLuint program,
2601 GLenum programInterface,
2602 const GLchar *name)
2603{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002604 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002605 return QueryProgramResourceLocation(programObject, programInterface, name);
2606}
2607
jchen10880683b2017-04-12 16:21:55 +08002608void Context::getProgramResourceiv(GLuint program,
2609 GLenum programInterface,
2610 GLuint index,
2611 GLsizei propCount,
2612 const GLenum *props,
2613 GLsizei bufSize,
2614 GLsizei *length,
2615 GLint *params)
2616{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002617 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002618 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2619 length, params);
2620}
2621
jchen10d9cd7b72017-08-30 15:04:25 +08002622void Context::getProgramInterfaceiv(GLuint program,
2623 GLenum programInterface,
2624 GLenum pname,
2625 GLint *params)
2626{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002627 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002628 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2629}
2630
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002631void Context::getProgramInterfaceivRobust(GLuint program,
2632 GLenum programInterface,
2633 GLenum pname,
2634 GLsizei bufSize,
2635 GLsizei *length,
2636 GLint *params)
2637{
2638 UNIMPLEMENTED();
2639}
2640
Jamie Madill306b6c12018-07-27 08:12:49 -04002641void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002642{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002643 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002644}
2645
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002646void Context::handleError(GLenum errorCode,
2647 const char *message,
2648 const char *file,
2649 const char *function,
2650 unsigned int line)
2651{
2652 mErrors.handleError(errorCode, message, file, function, line);
2653}
2654
Jamie Madilla139f012018-10-10 16:13:03 -04002655void Context::validationError(GLenum errorCode, const char *message)
2656{
2657 mErrors.validationError(errorCode, message);
2658}
2659
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002660// Get one of the recorded errors and clear its flag, if any.
2661// [OpenGL ES 2.0.24] section 2.5 page 13.
2662GLenum Context::getError()
2663{
Geoff Langda5777c2014-07-11 09:52:58 -04002664 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002665 {
Geoff Langda5777c2014-07-11 09:52:58 -04002666 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002667 }
Geoff Langda5777c2014-07-11 09:52:58 -04002668 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002669 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002670 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002671 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002672}
2673
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002674// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002675void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002676{
2677 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002678 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002679 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002680 mContextLostForced = true;
2681 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002682 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002683}
2684
Jamie Madillfa920eb2018-01-04 11:45:50 -05002685GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002686{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002687 // Even if the application doesn't want to know about resets, we want to know
2688 // as it will allow us to skip all the calls.
2689 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002690 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002691 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002692 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002693 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002694 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002695
2696 // EXT_robustness, section 2.6: If the reset notification behavior is
2697 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2698 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2699 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002700 }
2701
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002702 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2703 // status should be returned at least once, and GL_NO_ERROR should be returned
2704 // once the device has finished resetting.
2705 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002706 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002707 ASSERT(mResetStatus == GL_NO_ERROR);
2708 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002709
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002710 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002711 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002712 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002713 }
2714 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002715 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002716 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002717 // If markContextLost was used to mark the context lost then
2718 // assume that is not recoverable, and continue to report the
2719 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002720 mResetStatus = mImplementation->getResetStatus();
2721 }
Jamie Madill893ab082014-05-16 16:56:10 -04002722
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002723 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002724}
2725
2726bool Context::isResetNotificationEnabled()
2727{
2728 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2729}
2730
Corentin Walleze3b10e82015-05-20 11:06:25 -04002731const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002732{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002733 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002734}
2735
2736EGLenum Context::getClientType() const
2737{
2738 return mClientType;
2739}
2740
2741EGLenum Context::getRenderBuffer() const
2742{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002743 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2744 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002745 {
2746 return EGL_NONE;
2747 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002748
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002749 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002750 ASSERT(backAttachment != nullptr);
2751 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002752}
2753
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002754VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002755{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002756 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002757 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2758 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002759 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002760 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2761 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002762
Jamie Madill96a483b2017-06-27 16:49:21 -04002763 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002764 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002765
2766 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002767}
2768
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002769TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002770{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002771 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002772 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2773 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002774 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002775 transformFeedback =
2776 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002777 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002778 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002779 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002780
2781 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002782}
2783
2784bool Context::isVertexArrayGenerated(GLuint vertexArray)
2785{
Jamie Madill96a483b2017-06-27 16:49:21 -04002786 ASSERT(mVertexArrayMap.contains(0));
2787 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002788}
2789
2790bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2791{
Jamie Madill96a483b2017-06-27 16:49:21 -04002792 ASSERT(mTransformFeedbackMap.contains(0));
2793 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002794}
2795
Shannon Woods53a94a82014-06-24 15:20:36 -04002796void Context::detachTexture(GLuint texture)
2797{
2798 // Simple pass-through to State's detachTexture method, as textures do not require
2799 // allocation map management either here or in the resource manager at detach time.
2800 // Zero textures are held by the Context, and we don't attempt to request them from
2801 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002802 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002803}
2804
James Darpinian4d9d4832018-03-13 12:43:28 -07002805void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002806{
Yuly Novikov5807a532015-12-03 13:01:22 -05002807 // Simple pass-through to State's detachBuffer method, since
2808 // only buffer attachments to container objects that are bound to the current context
2809 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002810
Yuly Novikov5807a532015-12-03 13:01:22 -05002811 // [OpenGL ES 3.2] section 5.1.2 page 45:
2812 // Attachments to unbound container objects, such as
2813 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2814 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002815 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002816}
2817
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002818void Context::detachFramebuffer(GLuint framebuffer)
2819{
Shannon Woods53a94a82014-06-24 15:20:36 -04002820 // Framebuffer detachment is handled by Context, because 0 is a valid
2821 // Framebuffer object, and a pointer to it must be passed from Context
2822 // to State at binding time.
2823
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002824 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002825 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2826 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2827 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002828
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002829 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002830 {
2831 bindReadFramebuffer(0);
2832 }
2833
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002834 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002835 {
2836 bindDrawFramebuffer(0);
2837 }
2838}
2839
2840void Context::detachRenderbuffer(GLuint renderbuffer)
2841{
Jamie Madilla02315b2017-02-23 14:14:47 -05002842 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002843}
2844
Jamie Madill57a89722013-07-02 11:57:03 -04002845void Context::detachVertexArray(GLuint vertexArray)
2846{
Jamie Madill77a72f62015-04-14 11:18:32 -04002847 // Vertex array detachment is handled by Context, because 0 is a valid
2848 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002849 // binding time.
2850
Jamie Madill57a89722013-07-02 11:57:03 -04002851 // [OpenGL ES 3.0.2] section 2.10 page 43:
2852 // If a vertex array object that is currently bound is deleted, the binding
2853 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002854 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002855 {
2856 bindVertexArray(0);
2857 }
2858}
2859
Geoff Langc8058452014-02-03 12:04:11 -05002860void Context::detachTransformFeedback(GLuint transformFeedback)
2861{
Corentin Walleza2257da2016-04-19 16:43:12 -04002862 // Transform feedback detachment is handled by Context, because 0 is a valid
2863 // transform feedback, and a pointer to it must be passed from Context to State at
2864 // binding time.
2865
2866 // The OpenGL specification doesn't mention what should happen when the currently bound
2867 // transform feedback object is deleted. Since it is a container object, we treat it like
2868 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002869 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002870 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002871 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002872 }
Geoff Langc8058452014-02-03 12:04:11 -05002873}
2874
Jamie Madilldc356042013-07-19 16:36:57 -04002875void Context::detachSampler(GLuint sampler)
2876{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002877 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002878}
2879
Yunchao Hea336b902017-08-02 16:05:21 +08002880void Context::detachProgramPipeline(GLuint pipeline)
2881{
2882 mGLState.detachProgramPipeline(this, pipeline);
2883}
2884
Jamie Madill3ef140a2017-08-26 23:11:21 -04002885void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002886{
Shaodde78e82017-05-22 14:13:27 +08002887 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002888 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002889}
2890
Jamie Madille29d1672013-07-19 16:36:57 -04002891void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2892{
Till Rathmannb8543632018-10-02 19:46:14 +02002893 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002894 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002895 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002896}
Jamie Madille29d1672013-07-19 16:36:57 -04002897
Geoff Langc1984ed2016-10-07 12:41:00 -04002898void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2899{
Till Rathmannb8543632018-10-02 19:46:14 +02002900 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002901 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002902 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002903}
2904
Till Rathmannb8543632018-10-02 19:46:14 +02002905void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2906{
2907 Sampler *const samplerObject =
2908 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2909 SetSamplerParameterIiv(this, samplerObject, pname, param);
2910}
2911
2912void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2913{
2914 Sampler *const samplerObject =
2915 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2916 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2917}
2918
Brandon Jones59770802018-04-02 13:18:42 -07002919void Context::samplerParameterivRobust(GLuint sampler,
2920 GLenum pname,
2921 GLsizei bufSize,
2922 const GLint *param)
2923{
2924 samplerParameteriv(sampler, pname, param);
2925}
2926
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002927void Context::samplerParameterIivRobust(GLuint sampler,
2928 GLenum pname,
2929 GLsizei bufSize,
2930 const GLint *param)
2931{
2932 UNIMPLEMENTED();
2933}
2934
2935void Context::samplerParameterIuivRobust(GLuint sampler,
2936 GLenum pname,
2937 GLsizei bufSize,
2938 const GLuint *param)
2939{
2940 UNIMPLEMENTED();
2941}
2942
Jamie Madille29d1672013-07-19 16:36:57 -04002943void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2944{
Till Rathmannb8543632018-10-02 19:46:14 +02002945 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002946 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002947 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002948}
2949
Geoff Langc1984ed2016-10-07 12:41:00 -04002950void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002951{
Till Rathmannb8543632018-10-02 19:46:14 +02002952 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002953 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002954 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002955}
2956
Brandon Jones59770802018-04-02 13:18:42 -07002957void Context::samplerParameterfvRobust(GLuint sampler,
2958 GLenum pname,
2959 GLsizei bufSize,
2960 const GLfloat *param)
2961{
2962 samplerParameterfv(sampler, pname, param);
2963}
2964
Geoff Langc1984ed2016-10-07 12:41:00 -04002965void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002966{
Till Rathmannb8543632018-10-02 19:46:14 +02002967 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002968 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002969 QuerySamplerParameteriv(samplerObject, pname, params);
2970}
Jamie Madill9675b802013-07-19 16:36:59 -04002971
Till Rathmannb8543632018-10-02 19:46:14 +02002972void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2973{
2974 const Sampler *const samplerObject =
2975 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2976 QuerySamplerParameterIiv(samplerObject, pname, params);
2977}
2978
2979void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2980{
2981 const Sampler *const samplerObject =
2982 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2983 QuerySamplerParameterIuiv(samplerObject, pname, params);
2984}
2985
Brandon Jones59770802018-04-02 13:18:42 -07002986void Context::getSamplerParameterivRobust(GLuint sampler,
2987 GLenum pname,
2988 GLsizei bufSize,
2989 GLsizei *length,
2990 GLint *params)
2991{
2992 getSamplerParameteriv(sampler, pname, params);
2993}
2994
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002995void Context::getSamplerParameterIivRobust(GLuint sampler,
2996 GLenum pname,
2997 GLsizei bufSize,
2998 GLsizei *length,
2999 GLint *params)
3000{
3001 UNIMPLEMENTED();
3002}
3003
3004void Context::getSamplerParameterIuivRobust(GLuint sampler,
3005 GLenum pname,
3006 GLsizei bufSize,
3007 GLsizei *length,
3008 GLuint *params)
3009{
3010 UNIMPLEMENTED();
3011}
3012
Geoff Langc1984ed2016-10-07 12:41:00 -04003013void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
3014{
Till Rathmannb8543632018-10-02 19:46:14 +02003015 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05003016 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04003017 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04003018}
3019
Brandon Jones59770802018-04-02 13:18:42 -07003020void Context::getSamplerParameterfvRobust(GLuint sampler,
3021 GLenum pname,
3022 GLsizei bufSize,
3023 GLsizei *length,
3024 GLfloat *params)
3025{
3026 getSamplerParameterfv(sampler, pname, params);
3027}
3028
Olli Etuahof0fee072016-03-30 15:11:58 +03003029void Context::programParameteri(GLuint program, GLenum pname, GLint value)
3030{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04003031 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08003032 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03003033}
3034
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003035void Context::initRendererString()
3036{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003037 std::ostringstream rendererString;
3038 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003039 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003040 rendererString << ")";
3041
Geoff Langcec35902014-04-16 10:52:36 -04003042 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003043}
3044
Geoff Langc339c4e2016-11-29 10:37:36 -05003045void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003046{
Geoff Langc339c4e2016-11-29 10:37:36 -05003047 const Version &clientVersion = getClientVersion();
3048
3049 std::ostringstream versionString;
3050 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3051 << ANGLE_VERSION_STRING << ")";
3052 mVersionString = MakeStaticString(versionString.str());
3053
3054 std::ostringstream shadingLanguageVersionString;
3055 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3056 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3057 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3058 << ")";
3059 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003060}
3061
Geoff Langcec35902014-04-16 10:52:36 -04003062void Context::initExtensionStrings()
3063{
Geoff Langc339c4e2016-11-29 10:37:36 -05003064 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3065 std::ostringstream combinedStringStream;
3066 std::copy(strings.begin(), strings.end(),
3067 std::ostream_iterator<const char *>(combinedStringStream, " "));
3068 return MakeStaticString(combinedStringStream.str());
3069 };
3070
3071 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003072 for (const auto &extensionString : mExtensions.getStrings())
3073 {
3074 mExtensionStrings.push_back(MakeStaticString(extensionString));
3075 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003076 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003077
Geoff Langc339c4e2016-11-29 10:37:36 -05003078 mRequestableExtensionStrings.clear();
3079 for (const auto &extensionInfo : GetExtensionInfoMap())
3080 {
3081 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003082 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003083 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003084 {
3085 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3086 }
3087 }
3088 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003089}
3090
Geoff Langc339c4e2016-11-29 10:37:36 -05003091const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003092{
Geoff Langc339c4e2016-11-29 10:37:36 -05003093 switch (name)
3094 {
3095 case GL_VENDOR:
3096 return reinterpret_cast<const GLubyte *>("Google Inc.");
3097
3098 case GL_RENDERER:
3099 return reinterpret_cast<const GLubyte *>(mRendererString);
3100
3101 case GL_VERSION:
3102 return reinterpret_cast<const GLubyte *>(mVersionString);
3103
3104 case GL_SHADING_LANGUAGE_VERSION:
3105 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3106
3107 case GL_EXTENSIONS:
3108 return reinterpret_cast<const GLubyte *>(mExtensionString);
3109
3110 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3111 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3112
3113 default:
3114 UNREACHABLE();
3115 return nullptr;
3116 }
Geoff Langcec35902014-04-16 10:52:36 -04003117}
3118
Geoff Langc339c4e2016-11-29 10:37:36 -05003119const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003120{
Geoff Langc339c4e2016-11-29 10:37:36 -05003121 switch (name)
3122 {
3123 case GL_EXTENSIONS:
3124 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3125
3126 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3127 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3128
3129 default:
3130 UNREACHABLE();
3131 return nullptr;
3132 }
Geoff Langcec35902014-04-16 10:52:36 -04003133}
3134
3135size_t Context::getExtensionStringCount() const
3136{
3137 return mExtensionStrings.size();
3138}
3139
Geoff Lang111a99e2017-10-17 10:58:41 -04003140bool Context::isExtensionRequestable(const char *name)
3141{
3142 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3143 auto extension = extensionInfos.find(name);
3144
Geoff Lang111a99e2017-10-17 10:58:41 -04003145 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003146 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003147}
3148
Geoff Langc339c4e2016-11-29 10:37:36 -05003149void Context::requestExtension(const char *name)
3150{
3151 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3152 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3153 const auto &extension = extensionInfos.at(name);
3154 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003155 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003156
3157 if (mExtensions.*(extension.ExtensionsMember))
3158 {
3159 // Extension already enabled
3160 return;
3161 }
3162
3163 mExtensions.*(extension.ExtensionsMember) = true;
3164 updateCaps();
3165 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003166
Jamie Madill2f348d22017-06-05 10:50:59 -04003167 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3168 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003169
Jamie Madill81c2e252017-09-09 23:32:46 -04003170 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3171 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003172 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003173 for (auto &zeroTexture : mZeroTextures)
3174 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003175 if (zeroTexture.get() != nullptr)
3176 {
3177 zeroTexture->signalDirty(this, InitState::Initialized);
3178 }
Geoff Lang9aded172017-04-05 11:07:56 -04003179 }
3180
Jamie Madillb983a4b2018-08-01 11:34:51 -04003181 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003182}
3183
3184size_t Context::getRequestableExtensionStringCount() const
3185{
3186 return mRequestableExtensionStrings.size();
3187}
3188
Jamie Madill493f9572018-05-24 19:52:15 -04003189void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003190{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003191 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003192 ASSERT(transformFeedback != nullptr);
3193 ASSERT(!transformFeedback->isPaused());
3194
Jamie Madill6c1f6712017-02-14 19:08:04 -05003195 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003196 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003197}
3198
3199bool Context::hasActiveTransformFeedback(GLuint program) const
3200{
3201 for (auto pair : mTransformFeedbackMap)
3202 {
3203 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3204 {
3205 return true;
3206 }
3207 }
3208 return false;
3209}
3210
Geoff Lang33f11fb2018-05-07 13:42:47 -04003211Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003212{
3213 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3214
jchen1082af6202018-06-22 10:59:52 +08003215 // Explicitly enable GL_KHR_parallel_shader_compile
3216 supportedExtensions.parallelShaderCompile = true;
3217
Geoff Langb0f917f2017-12-05 13:41:54 -05003218 if (getClientVersion() < ES_2_0)
3219 {
3220 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003221 supportedExtensions.pointSizeArray = true;
3222 supportedExtensions.textureCubeMap = true;
3223 supportedExtensions.pointSprite = true;
3224 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003225 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003226 }
3227
3228 if (getClientVersion() < ES_3_0)
3229 {
3230 // Disable ES3+ extensions
3231 supportedExtensions.colorBufferFloat = false;
3232 supportedExtensions.eglImageExternalEssl3 = false;
3233 supportedExtensions.textureNorm16 = false;
3234 supportedExtensions.multiview = false;
3235 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003236 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003237 supportedExtensions.textureMultisample = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003238 }
3239
3240 if (getClientVersion() < ES_3_1)
3241 {
3242 // Disable ES3.1+ extensions
3243 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003244
3245 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3246 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003247 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003248 }
3249
3250 if (getClientVersion() > ES_2_0)
3251 {
3252 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3253 // supportedExtensions.sRGB = false;
3254 }
3255
3256 // Some extensions are always available because they are implemented in the GL layer.
3257 supportedExtensions.bindUniformLocation = true;
3258 supportedExtensions.vertexArrayObject = true;
3259 supportedExtensions.bindGeneratesResource = true;
3260 supportedExtensions.clientArrays = true;
3261 supportedExtensions.requestExtension = true;
Austin Eng7cf9cd22018-10-09 15:27:32 -07003262 supportedExtensions.multiDraw = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003263
3264 // Enable the no error extension if the context was created with the flag.
3265 supportedExtensions.noError = mSkipValidation;
3266
3267 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003268 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003269
3270 // Explicitly enable GL_KHR_debug
3271 supportedExtensions.debug = true;
3272 supportedExtensions.maxDebugMessageLength = 1024;
3273 supportedExtensions.maxDebugLoggedMessages = 1024;
3274 supportedExtensions.maxDebugGroupStackDepth = 1024;
3275 supportedExtensions.maxLabelLength = 1024;
3276
3277 // Explicitly enable GL_ANGLE_robust_client_memory
3278 supportedExtensions.robustClientMemory = true;
3279
3280 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003281 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003282
3283 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3284 // supports it.
3285 supportedExtensions.robustBufferAccessBehavior =
3286 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3287
3288 // Enable the cache control query unconditionally.
3289 supportedExtensions.programCacheControl = true;
3290
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003291 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003292 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003293 {
3294 // GL_ANGLE_explicit_context_gles1
3295 supportedExtensions.explicitContextGles1 = true;
3296 // GL_ANGLE_explicit_context
3297 supportedExtensions.explicitContext = true;
3298 }
3299
Geoff Lang79b91402018-10-04 15:11:30 -04003300 supportedExtensions.memorySize = true;
3301
Geoff Langb0f917f2017-12-05 13:41:54 -05003302 return supportedExtensions;
3303}
3304
Geoff Lang33f11fb2018-05-07 13:42:47 -04003305void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003306{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003307 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003308
Geoff Lang33f11fb2018-05-07 13:42:47 -04003309 mSupportedExtensions = generateSupportedExtensions();
3310 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003311
3312 mLimitations = mImplementation->getNativeLimitations();
3313
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003314 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3315 if (getClientVersion() < Version(2, 0))
3316 {
3317 mCaps.maxMultitextureUnits = 4;
3318 mCaps.maxClipPlanes = 6;
3319 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003320 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3321 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3322 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003323 mCaps.minSmoothPointSize = 1.0f;
3324 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003325 mCaps.minSmoothLineWidth = 1.0f;
3326 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003327 }
3328
Luc Ferronad2ae932018-06-11 15:31:17 -04003329 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003330 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003331
Luc Ferronad2ae932018-06-11 15:31:17 -04003332 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3333
Jamie Madill0f80ed82017-09-19 00:24:56 -04003334 if (getClientVersion() < ES_3_1)
3335 {
3336 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3337 }
3338 else
3339 {
3340 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3341 }
Geoff Lang301d1612014-07-09 10:34:37 -04003342
Jiawei Shao54aafe52018-04-27 14:54:57 +08003343 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3344 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003345 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3346
Jamie Madill0f80ed82017-09-19 00:24:56 -04003347 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3348 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3349
3350 // Limit textures as well, so we can use fast bitsets with texture bindings.
3351 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003352 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3353 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3354 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3355 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003356
Jiawei Shaodb342272017-09-27 10:21:45 +08003357 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3358
Geoff Langc287ea62016-09-16 14:46:51 -04003359 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003360 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003361 for (const auto &extensionInfo : GetExtensionInfoMap())
3362 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003363 // If the user has requested that extensions start disabled and they are requestable,
3364 // disable them.
3365 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003366 {
3367 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3368 }
3369 }
3370
3371 // Generate texture caps
3372 updateCaps();
3373}
3374
3375void Context::updateCaps()
3376{
Geoff Lang900013c2014-07-07 11:32:19 -04003377 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003378 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003379
Jamie Madill7b62cf92017-11-02 15:20:49 -04003380 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003381 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003382 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003383 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003384
Geoff Lang0d8b7242015-09-09 14:56:53 -04003385 // Update the format caps based on the client version and extensions.
3386 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3387 // ES3.
3388 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003389 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003390 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003391 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003392 formatCaps.textureAttachment =
3393 formatCaps.textureAttachment &&
3394 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3395 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3396 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003397
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003398 // OpenGL ES does not support multisampling with non-rendererable formats
3399 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003400 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003401 (getClientVersion() < ES_3_1 &&
3402 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003403 {
Geoff Langd87878e2014-09-19 15:42:59 -04003404 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003405 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003406 else
3407 {
3408 // We may have limited the max samples for some required renderbuffer formats due to
3409 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3410 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3411
3412 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3413 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3414 // exception of signed and unsigned integer formats."
3415 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3416 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3417 {
3418 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3419 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3420 }
3421
3422 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3423 if (getClientVersion() >= ES_3_1)
3424 {
3425 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3426 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3427 // the exception that the signed and unsigned integer formats are required only to
3428 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3429 // multisamples, which must be at least one."
3430 if (formatInfo.componentType == GL_INT ||
3431 formatInfo.componentType == GL_UNSIGNED_INT)
3432 {
3433 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3434 }
3435
3436 // GLES 3.1 section 19.3.1.
3437 if (formatCaps.texturable)
3438 {
3439 if (formatInfo.depthBits > 0)
3440 {
3441 mCaps.maxDepthTextureSamples =
3442 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3443 }
3444 else if (formatInfo.redBits > 0)
3445 {
3446 mCaps.maxColorTextureSamples =
3447 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3448 }
3449 }
3450 }
3451 }
Geoff Langd87878e2014-09-19 15:42:59 -04003452
3453 if (formatCaps.texturable && formatInfo.compressed)
3454 {
Geoff Langca271392017-04-05 12:30:00 -04003455 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003456 }
3457
Geoff Langca271392017-04-05 12:30:00 -04003458 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003459 }
Jamie Madill32447362017-06-28 14:53:52 -04003460
3461 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003462 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003463 {
3464 mMemoryProgramCache = nullptr;
3465 }
Corentin Walleze4477002017-12-01 14:39:58 -05003466
3467 // Compute which buffer types are allowed
3468 mValidBufferBindings.reset();
3469 mValidBufferBindings.set(BufferBinding::ElementArray);
3470 mValidBufferBindings.set(BufferBinding::Array);
3471
3472 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3473 {
3474 mValidBufferBindings.set(BufferBinding::PixelPack);
3475 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3476 }
3477
3478 if (getClientVersion() >= ES_3_0)
3479 {
3480 mValidBufferBindings.set(BufferBinding::CopyRead);
3481 mValidBufferBindings.set(BufferBinding::CopyWrite);
3482 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3483 mValidBufferBindings.set(BufferBinding::Uniform);
3484 }
3485
3486 if (getClientVersion() >= ES_3_1)
3487 {
3488 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3489 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3490 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3491 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3492 }
jchen107ae70d82018-07-06 13:47:01 +08003493
3494 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003495
3496 // Reinitialize state cache after extension changes.
3497 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003498}
3499
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003500void Context::initWorkarounds()
3501{
Jamie Madill761b02c2017-06-23 16:27:06 -04003502 // Apply back-end workarounds.
3503 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3504
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003505 // Lose the context upon out of memory error if the application is
3506 // expecting to watch for those events.
3507 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003508
3509 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3510 {
3511 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3512 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3513 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3514 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003515}
3516
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003517// Return true if the draw is a no-op, else return false.
3518// A no-op draw occurs if the count of vertices is less than the minimum required to
3519// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3520bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3521{
3522 return count < kMinimumPrimitiveCounts[mode];
3523}
3524
3525bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3526{
3527 return (instanceCount == 0) || noopDraw(mode, count);
3528}
3529
Jamie Madill6f755b22018-10-09 12:48:54 -04003530angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003531{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003532 if (mGLES1Renderer)
3533 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003534 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003535 }
3536
Geoff Lang9bf86f02018-07-26 11:46:34 -04003537 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003538
3539 if (isRobustResourceInitEnabled())
3540 {
3541 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3542 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3543 }
3544
Geoff Langa8cb2872018-03-09 16:09:40 -05003545 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003546 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003547}
3548
3549Error Context::prepareForClear(GLbitfield mask)
3550{
Geoff Langa8cb2872018-03-09 16:09:40 -05003551 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003552 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003553 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003554 return NoError();
3555}
3556
3557Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3558{
Geoff Langa8cb2872018-03-09 16:09:40 -05003559 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003560 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3561 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003562 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003563 return NoError();
3564}
3565
Geoff Langa8cb2872018-03-09 16:09:40 -05003566Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003567{
Geoff Langa8cb2872018-03-09 16:09:40 -05003568 ANGLE_TRY(syncDirtyObjects(objectMask));
3569 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003570 return NoError();
3571}
3572
Jamie Madill6f755b22018-10-09 12:48:54 -04003573angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003574{
3575 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003576 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003577 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003578 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003579}
3580
Jamie Madill6f755b22018-10-09 12:48:54 -04003581angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003582{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003583 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003584 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003585 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003586 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003587}
Jamie Madillc29968b2016-01-20 11:17:23 -05003588
Jamie Madill6f755b22018-10-09 12:48:54 -04003589angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003590{
3591 return mGLState.syncDirtyObjects(this, objectMask);
3592}
3593
Jamie Madillc29968b2016-01-20 11:17:23 -05003594void Context::blitFramebuffer(GLint srcX0,
3595 GLint srcY0,
3596 GLint srcX1,
3597 GLint srcY1,
3598 GLint dstX0,
3599 GLint dstY0,
3600 GLint dstX1,
3601 GLint dstY1,
3602 GLbitfield mask,
3603 GLenum filter)
3604{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003605 if (mask == 0)
3606 {
3607 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3608 // buffers are copied.
3609 return;
3610 }
3611
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003612 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003613 ASSERT(drawFramebuffer);
3614
3615 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3616 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3617
Jamie Madillbc918e72018-03-08 09:47:21 -05003618 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003619
Jamie Madillc564c072017-06-01 12:45:42 -04003620 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003621}
Jamie Madillc29968b2016-01-20 11:17:23 -05003622
3623void Context::clear(GLbitfield mask)
3624{
Geoff Langd4fff502017-09-22 11:28:28 -04003625 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3626 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003627}
3628
3629void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3630{
Olli Etuaho78df3362018-10-05 16:43:27 +03003631 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3632 const FramebufferAttachment *attachment = nullptr;
3633 if (buffer == GL_DEPTH)
3634 {
3635 attachment = framebufferObject->getDepthbuffer();
3636 }
3637 if (buffer == GL_COLOR &&
3638 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3639 {
3640 attachment = framebufferObject->getColorbuffer(drawbuffer);
3641 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003642 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3643 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003644 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003645 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003646 return;
3647 }
Geoff Langd4fff502017-09-22 11:28:28 -04003648 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003649 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003650}
3651
3652void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3653{
Olli Etuaho78df3362018-10-05 16:43:27 +03003654 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3655 const FramebufferAttachment *attachment = nullptr;
3656 if (buffer == GL_COLOR &&
3657 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3658 {
3659 attachment = framebufferObject->getColorbuffer(drawbuffer);
3660 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003661 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3662 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003663 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003664 {
3665 return;
3666 }
Geoff Langd4fff502017-09-22 11:28:28 -04003667 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003668 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003669}
3670
3671void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3672{
Olli Etuaho78df3362018-10-05 16:43:27 +03003673 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3674 const FramebufferAttachment *attachment = nullptr;
3675 if (buffer == GL_STENCIL)
3676 {
3677 attachment = framebufferObject->getStencilbuffer();
3678 }
3679 if (buffer == GL_COLOR &&
3680 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3681 {
3682 attachment = framebufferObject->getColorbuffer(drawbuffer);
3683 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003684 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3685 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003686 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003687 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003688 return;
3689 }
Geoff Langd4fff502017-09-22 11:28:28 -04003690 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003691 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003692}
3693
3694void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3695{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003696 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003697 ASSERT(framebufferObject);
3698
3699 // If a buffer is not present, the clear has no effect
3700 if (framebufferObject->getDepthbuffer() == nullptr &&
3701 framebufferObject->getStencilbuffer() == nullptr)
3702 {
3703 return;
3704 }
3705
Geoff Langd4fff502017-09-22 11:28:28 -04003706 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3707 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003708}
3709
3710void Context::readPixels(GLint x,
3711 GLint y,
3712 GLsizei width,
3713 GLsizei height,
3714 GLenum format,
3715 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003716 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003717{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003718 if (width == 0 || height == 0)
3719 {
3720 return;
3721 }
3722
Jamie Madillbc918e72018-03-08 09:47:21 -05003723 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003724
Jamie Madillb6664922017-07-25 12:55:04 -04003725 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3726 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003727
3728 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003729 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003730}
3731
Brandon Jones59770802018-04-02 13:18:42 -07003732void Context::readPixelsRobust(GLint x,
3733 GLint y,
3734 GLsizei width,
3735 GLsizei height,
3736 GLenum format,
3737 GLenum type,
3738 GLsizei bufSize,
3739 GLsizei *length,
3740 GLsizei *columns,
3741 GLsizei *rows,
3742 void *pixels)
3743{
3744 readPixels(x, y, width, height, format, type, pixels);
3745}
3746
3747void Context::readnPixelsRobust(GLint x,
3748 GLint y,
3749 GLsizei width,
3750 GLsizei height,
3751 GLenum format,
3752 GLenum type,
3753 GLsizei bufSize,
3754 GLsizei *length,
3755 GLsizei *columns,
3756 GLsizei *rows,
3757 void *data)
3758{
3759 readPixels(x, y, width, height, format, type, data);
3760}
3761
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003762void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003763 GLint level,
3764 GLenum internalformat,
3765 GLint x,
3766 GLint y,
3767 GLsizei width,
3768 GLsizei height,
3769 GLint border)
3770{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003771 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003772 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003773
Jamie Madillc29968b2016-01-20 11:17:23 -05003774 Rectangle sourceArea(x, y, width, height);
3775
Jamie Madill05b35b22017-10-03 09:01:44 -04003776 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003777 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003778 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003779}
3780
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003781void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003782 GLint level,
3783 GLint xoffset,
3784 GLint yoffset,
3785 GLint x,
3786 GLint y,
3787 GLsizei width,
3788 GLsizei height)
3789{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003790 if (width == 0 || height == 0)
3791 {
3792 return;
3793 }
3794
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003795 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003796 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003797
Jamie Madillc29968b2016-01-20 11:17:23 -05003798 Offset destOffset(xoffset, yoffset, 0);
3799 Rectangle sourceArea(x, y, width, height);
3800
Jamie Madill05b35b22017-10-03 09:01:44 -04003801 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003802 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003803 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003804}
3805
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003806void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003807 GLint level,
3808 GLint xoffset,
3809 GLint yoffset,
3810 GLint zoffset,
3811 GLint x,
3812 GLint y,
3813 GLsizei width,
3814 GLsizei height)
3815{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003816 if (width == 0 || height == 0)
3817 {
3818 return;
3819 }
3820
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003821 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003822 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003823
Jamie Madillc29968b2016-01-20 11:17:23 -05003824 Offset destOffset(xoffset, yoffset, zoffset);
3825 Rectangle sourceArea(x, y, width, height);
3826
Jamie Madill05b35b22017-10-03 09:01:44 -04003827 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3828 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003829 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3830 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003831}
3832
3833void Context::framebufferTexture2D(GLenum target,
3834 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003835 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003836 GLuint texture,
3837 GLint level)
3838{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003839 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003840 ASSERT(framebuffer);
3841
3842 if (texture != 0)
3843 {
3844 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003845 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003846 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003847 }
3848 else
3849 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003850 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003851 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003852
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003853 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003854}
3855
3856void Context::framebufferRenderbuffer(GLenum target,
3857 GLenum attachment,
3858 GLenum renderbuffertarget,
3859 GLuint renderbuffer)
3860{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003861 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003862 ASSERT(framebuffer);
3863
3864 if (renderbuffer != 0)
3865 {
3866 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003867
Jamie Madillcc129372018-04-12 09:13:18 -04003868 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003869 renderbufferObject);
3870 }
3871 else
3872 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003873 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003874 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003875
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003876 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003877}
3878
3879void Context::framebufferTextureLayer(GLenum target,
3880 GLenum attachment,
3881 GLuint texture,
3882 GLint level,
3883 GLint layer)
3884{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003885 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003886 ASSERT(framebuffer);
3887
3888 if (texture != 0)
3889 {
3890 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003891 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003892 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003893 }
3894 else
3895 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003896 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003897 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003898
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003899 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003900}
3901
Brandon Jones59770802018-04-02 13:18:42 -07003902void Context::framebufferTextureMultiviewLayered(GLenum target,
3903 GLenum attachment,
3904 GLuint texture,
3905 GLint level,
3906 GLint baseViewIndex,
3907 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003908{
Martin Radev82ef7742017-08-08 17:44:58 +03003909 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3910 ASSERT(framebuffer);
3911
3912 if (texture != 0)
3913 {
3914 Texture *textureObj = getTexture(texture);
3915
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003916 ImageIndex index;
3917 if (textureObj->getType() == TextureType::_2DArray)
3918 {
3919 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3920 }
3921 else
3922 {
3923 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3924 ASSERT(level == 0);
3925 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3926 }
Martin Radev82ef7742017-08-08 17:44:58 +03003927 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3928 numViews, baseViewIndex);
3929 }
3930 else
3931 {
3932 framebuffer->resetAttachment(this, attachment);
3933 }
3934
3935 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003936}
3937
Brandon Jones59770802018-04-02 13:18:42 -07003938void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3939 GLenum attachment,
3940 GLuint texture,
3941 GLint level,
3942 GLsizei numViews,
3943 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003944{
Martin Radev5dae57b2017-07-14 16:15:55 +03003945 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3946 ASSERT(framebuffer);
3947
3948 if (texture != 0)
3949 {
3950 Texture *textureObj = getTexture(texture);
3951
3952 ImageIndex index = ImageIndex::Make2D(level);
3953 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3954 textureObj, numViews, viewportOffsets);
3955 }
3956 else
3957 {
3958 framebuffer->resetAttachment(this, attachment);
3959 }
3960
3961 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003962}
3963
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003964void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3965{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003966 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3967 ASSERT(framebuffer);
3968
3969 if (texture != 0)
3970 {
3971 Texture *textureObj = getTexture(texture);
3972
3973 ImageIndex index = ImageIndex::MakeFromType(
3974 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3975 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3976 }
3977 else
3978 {
3979 framebuffer->resetAttachment(this, attachment);
3980 }
3981
3982 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003983}
3984
Jamie Madillc29968b2016-01-20 11:17:23 -05003985void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3986{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003987 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003988 ASSERT(framebuffer);
3989 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003990 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003991 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003992}
3993
3994void Context::readBuffer(GLenum mode)
3995{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003996 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003997 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003998 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003999}
4000
4001void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
4002{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004003 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004004 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004005
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004006 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004007 ASSERT(framebuffer);
4008
4009 // The specification isn't clear what should be done when the framebuffer isn't complete.
4010 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04004011 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004012}
4013
4014void Context::invalidateFramebuffer(GLenum target,
4015 GLsizei numAttachments,
4016 const GLenum *attachments)
4017{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004018 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004019 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004020
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004021 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004022 ASSERT(framebuffer);
4023
Jamie Madill427064d2018-04-13 16:20:34 -04004024 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004025 {
Jamie Madill437fa652016-05-03 15:13:24 -04004026 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004027 }
Jamie Madill437fa652016-05-03 15:13:24 -04004028
Jamie Madill4928b7c2017-06-20 12:57:39 -04004029 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004030}
4031
4032void Context::invalidateSubFramebuffer(GLenum target,
4033 GLsizei numAttachments,
4034 const GLenum *attachments,
4035 GLint x,
4036 GLint y,
4037 GLsizei width,
4038 GLsizei height)
4039{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004040 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004041 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004042
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004043 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004044 ASSERT(framebuffer);
4045
Jamie Madill427064d2018-04-13 16:20:34 -04004046 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004047 {
Jamie Madill437fa652016-05-03 15:13:24 -04004048 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004049 }
Jamie Madill437fa652016-05-03 15:13:24 -04004050
4051 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004052 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05004053}
4054
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004055void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004056 GLint level,
4057 GLint internalformat,
4058 GLsizei width,
4059 GLsizei height,
4060 GLint border,
4061 GLenum format,
4062 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004063 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004064{
Jamie Madillbc918e72018-03-08 09:47:21 -05004065 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004066
4067 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004068 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004069 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004070 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004071}
4072
Brandon Jones59770802018-04-02 13:18:42 -07004073void Context::texImage2DRobust(TextureTarget target,
4074 GLint level,
4075 GLint internalformat,
4076 GLsizei width,
4077 GLsizei height,
4078 GLint border,
4079 GLenum format,
4080 GLenum type,
4081 GLsizei bufSize,
4082 const void *pixels)
4083{
4084 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4085}
4086
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004087void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004088 GLint level,
4089 GLint internalformat,
4090 GLsizei width,
4091 GLsizei height,
4092 GLsizei depth,
4093 GLint border,
4094 GLenum format,
4095 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004096 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004097{
Jamie Madillbc918e72018-03-08 09:47:21 -05004098 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004099
4100 Extents size(width, height, depth);
4101 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004102 handleError(texture->setImage(this, mGLState.getUnpackState(),
4103 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004104 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004105}
4106
Brandon Jones59770802018-04-02 13:18:42 -07004107void Context::texImage3DRobust(TextureType target,
4108 GLint level,
4109 GLint internalformat,
4110 GLsizei width,
4111 GLsizei height,
4112 GLsizei depth,
4113 GLint border,
4114 GLenum format,
4115 GLenum type,
4116 GLsizei bufSize,
4117 const void *pixels)
4118{
4119 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4120}
4121
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004122void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004123 GLint level,
4124 GLint xoffset,
4125 GLint yoffset,
4126 GLsizei width,
4127 GLsizei height,
4128 GLenum format,
4129 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004130 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004131{
4132 // Zero sized uploads are valid but no-ops
4133 if (width == 0 || height == 0)
4134 {
4135 return;
4136 }
4137
Jamie Madillbc918e72018-03-08 09:47:21 -05004138 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004139
4140 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004141 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004142
4143 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4144
4145 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4146 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004147}
4148
Brandon Jones59770802018-04-02 13:18:42 -07004149void Context::texSubImage2DRobust(TextureTarget target,
4150 GLint level,
4151 GLint xoffset,
4152 GLint yoffset,
4153 GLsizei width,
4154 GLsizei height,
4155 GLenum format,
4156 GLenum type,
4157 GLsizei bufSize,
4158 const void *pixels)
4159{
4160 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4161}
4162
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004163void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004164 GLint level,
4165 GLint xoffset,
4166 GLint yoffset,
4167 GLint zoffset,
4168 GLsizei width,
4169 GLsizei height,
4170 GLsizei depth,
4171 GLenum format,
4172 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004173 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004174{
4175 // Zero sized uploads are valid but no-ops
4176 if (width == 0 || height == 0 || depth == 0)
4177 {
4178 return;
4179 }
4180
Jamie Madillbc918e72018-03-08 09:47:21 -05004181 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004182
4183 Box area(xoffset, yoffset, zoffset, width, height, depth);
4184 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004185
4186 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4187
4188 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004189 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004190 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004191}
4192
Brandon Jones59770802018-04-02 13:18:42 -07004193void Context::texSubImage3DRobust(TextureType target,
4194 GLint level,
4195 GLint xoffset,
4196 GLint yoffset,
4197 GLint zoffset,
4198 GLsizei width,
4199 GLsizei height,
4200 GLsizei depth,
4201 GLenum format,
4202 GLenum type,
4203 GLsizei bufSize,
4204 const void *pixels)
4205{
4206 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4207 pixels);
4208}
4209
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004210void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004211 GLint level,
4212 GLenum internalformat,
4213 GLsizei width,
4214 GLsizei height,
4215 GLint border,
4216 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004217 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004218{
Jamie Madillbc918e72018-03-08 09:47:21 -05004219 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004220
4221 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004222 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004223 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4224 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004225 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004226}
4227
Brandon Jones59770802018-04-02 13:18:42 -07004228void Context::compressedTexImage2DRobust(TextureTarget target,
4229 GLint level,
4230 GLenum internalformat,
4231 GLsizei width,
4232 GLsizei height,
4233 GLint border,
4234 GLsizei imageSize,
4235 GLsizei dataSize,
4236 const GLvoid *data)
4237{
4238 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4239}
4240
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004241void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004242 GLint level,
4243 GLenum internalformat,
4244 GLsizei width,
4245 GLsizei height,
4246 GLsizei depth,
4247 GLint border,
4248 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004249 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004250{
Jamie Madillbc918e72018-03-08 09:47:21 -05004251 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004252
4253 Extents size(width, height, depth);
4254 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004255 handleError(texture->setCompressedImage(
4256 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004257 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004258}
4259
Brandon Jones59770802018-04-02 13:18:42 -07004260void Context::compressedTexImage3DRobust(TextureType target,
4261 GLint level,
4262 GLenum internalformat,
4263 GLsizei width,
4264 GLsizei height,
4265 GLsizei depth,
4266 GLint border,
4267 GLsizei imageSize,
4268 GLsizei dataSize,
4269 const GLvoid *data)
4270{
4271 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4272 data);
4273}
4274
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004275void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004276 GLint level,
4277 GLint xoffset,
4278 GLint yoffset,
4279 GLsizei width,
4280 GLsizei height,
4281 GLenum format,
4282 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004283 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004284{
Jamie Madillbc918e72018-03-08 09:47:21 -05004285 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004286
4287 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004288 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004289 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4290 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004291 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004292}
4293
Brandon Jones59770802018-04-02 13:18:42 -07004294void Context::compressedTexSubImage2DRobust(TextureTarget target,
4295 GLint level,
4296 GLint xoffset,
4297 GLint yoffset,
4298 GLsizei width,
4299 GLsizei height,
4300 GLenum format,
4301 GLsizei imageSize,
4302 GLsizei dataSize,
4303 const GLvoid *data)
4304{
4305 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4306 data);
4307}
4308
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004309void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004310 GLint level,
4311 GLint xoffset,
4312 GLint yoffset,
4313 GLint zoffset,
4314 GLsizei width,
4315 GLsizei height,
4316 GLsizei depth,
4317 GLenum format,
4318 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004319 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004320{
4321 // Zero sized uploads are valid but no-ops
4322 if (width == 0 || height == 0)
4323 {
4324 return;
4325 }
4326
Jamie Madillbc918e72018-03-08 09:47:21 -05004327 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004328
4329 Box area(xoffset, yoffset, zoffset, width, height, depth);
4330 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004331 handleError(texture->setCompressedSubImage(
4332 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004333 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004334}
4335
Brandon Jones59770802018-04-02 13:18:42 -07004336void Context::compressedTexSubImage3DRobust(TextureType target,
4337 GLint level,
4338 GLint xoffset,
4339 GLint yoffset,
4340 GLint zoffset,
4341 GLsizei width,
4342 GLsizei height,
4343 GLsizei depth,
4344 GLenum format,
4345 GLsizei imageSize,
4346 GLsizei dataSize,
4347 const GLvoid *data)
4348{
4349 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4350 imageSize, data);
4351}
4352
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004353void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004354{
4355 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004356 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004357}
4358
Jamie Madill007530e2017-12-28 14:27:04 -05004359void Context::copyTexture(GLuint sourceId,
4360 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004361 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004362 GLuint destId,
4363 GLint destLevel,
4364 GLint internalFormat,
4365 GLenum destType,
4366 GLboolean unpackFlipY,
4367 GLboolean unpackPremultiplyAlpha,
4368 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004369{
Jamie Madillbc918e72018-03-08 09:47:21 -05004370 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004371
4372 gl::Texture *sourceTexture = getTexture(sourceId);
4373 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004374 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4375 sourceLevel, ConvertToBool(unpackFlipY),
4376 ConvertToBool(unpackPremultiplyAlpha),
4377 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004378}
4379
Jamie Madill007530e2017-12-28 14:27:04 -05004380void Context::copySubTexture(GLuint sourceId,
4381 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004382 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004383 GLuint destId,
4384 GLint destLevel,
4385 GLint xoffset,
4386 GLint yoffset,
4387 GLint x,
4388 GLint y,
4389 GLsizei width,
4390 GLsizei height,
4391 GLboolean unpackFlipY,
4392 GLboolean unpackPremultiplyAlpha,
4393 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004394{
4395 // Zero sized copies are valid but no-ops
4396 if (width == 0 || height == 0)
4397 {
4398 return;
4399 }
4400
Jamie Madillbc918e72018-03-08 09:47:21 -05004401 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004402
4403 gl::Texture *sourceTexture = getTexture(sourceId);
4404 gl::Texture *destTexture = getTexture(destId);
4405 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004406 Box box(x, y, 0, width, height, 1);
4407 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4408 ConvertToBool(unpackFlipY),
4409 ConvertToBool(unpackPremultiplyAlpha),
4410 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4411}
4412
4413void Context::copyTexture3D(GLuint sourceId,
4414 GLint sourceLevel,
4415 TextureTarget destTarget,
4416 GLuint destId,
4417 GLint destLevel,
4418 GLint internalFormat,
4419 GLenum destType,
4420 GLboolean unpackFlipY,
4421 GLboolean unpackPremultiplyAlpha,
4422 GLboolean unpackUnmultiplyAlpha)
4423{
4424 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4425
4426 Texture *sourceTexture = getTexture(sourceId);
4427 Texture *destTexture = getTexture(destId);
4428 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4429 sourceLevel, ConvertToBool(unpackFlipY),
4430 ConvertToBool(unpackPremultiplyAlpha),
4431 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4432}
4433
4434void Context::copySubTexture3D(GLuint sourceId,
4435 GLint sourceLevel,
4436 TextureTarget destTarget,
4437 GLuint destId,
4438 GLint destLevel,
4439 GLint xoffset,
4440 GLint yoffset,
4441 GLint zoffset,
4442 GLint x,
4443 GLint y,
4444 GLint z,
4445 GLsizei width,
4446 GLsizei height,
4447 GLsizei depth,
4448 GLboolean unpackFlipY,
4449 GLboolean unpackPremultiplyAlpha,
4450 GLboolean unpackUnmultiplyAlpha)
4451{
4452 // Zero sized copies are valid but no-ops
4453 if (width == 0 || height == 0 || depth == 0)
4454 {
4455 return;
4456 }
4457
4458 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4459
4460 Texture *sourceTexture = getTexture(sourceId);
4461 Texture *destTexture = getTexture(destId);
4462 Offset offset(xoffset, yoffset, zoffset);
4463 Box box(x, y, z, width, height, depth);
4464 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004465 ConvertToBool(unpackFlipY),
4466 ConvertToBool(unpackPremultiplyAlpha),
4467 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004468}
4469
Jamie Madill007530e2017-12-28 14:27:04 -05004470void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004471{
Jamie Madillbc918e72018-03-08 09:47:21 -05004472 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004473
4474 gl::Texture *sourceTexture = getTexture(sourceId);
4475 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004476 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004477}
4478
Corentin Wallez336129f2017-10-17 15:55:40 -04004479void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004480{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004481 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004482 ASSERT(buffer);
4483
Geoff Lang496c02d2016-10-20 11:38:11 -07004484 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004485}
4486
Brandon Jones59770802018-04-02 13:18:42 -07004487void Context::getBufferPointervRobust(BufferBinding target,
4488 GLenum pname,
4489 GLsizei bufSize,
4490 GLsizei *length,
4491 void **params)
4492{
4493 getBufferPointerv(target, pname, params);
4494}
4495
Corentin Wallez336129f2017-10-17 15:55:40 -04004496void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004497{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004498 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004499 ASSERT(buffer);
4500
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004501 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004502 if (error.isError())
4503 {
Jamie Madill437fa652016-05-03 15:13:24 -04004504 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004505 return nullptr;
4506 }
4507
4508 return buffer->getMapPointer();
4509}
4510
Corentin Wallez336129f2017-10-17 15:55:40 -04004511GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004512{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004513 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004514 ASSERT(buffer);
4515
4516 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004517 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004518 if (error.isError())
4519 {
Jamie Madill437fa652016-05-03 15:13:24 -04004520 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004521 return GL_FALSE;
4522 }
4523
4524 return result;
4525}
4526
Corentin Wallez336129f2017-10-17 15:55:40 -04004527void *Context::mapBufferRange(BufferBinding target,
4528 GLintptr offset,
4529 GLsizeiptr length,
4530 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004531{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004532 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004533 ASSERT(buffer);
4534
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004535 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004536 if (error.isError())
4537 {
Jamie Madill437fa652016-05-03 15:13:24 -04004538 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004539 return nullptr;
4540 }
4541
4542 return buffer->getMapPointer();
4543}
4544
Corentin Wallez336129f2017-10-17 15:55:40 -04004545void Context::flushMappedBufferRange(BufferBinding /*target*/,
4546 GLintptr /*offset*/,
4547 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004548{
4549 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4550}
4551
Jamie Madillbc918e72018-03-08 09:47:21 -05004552Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004553{
Geoff Langa8cb2872018-03-09 16:09:40 -05004554 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004555}
4556
Jamie Madillbc918e72018-03-08 09:47:21 -05004557Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004558{
Geoff Langa8cb2872018-03-09 16:09:40 -05004559 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004560}
4561
Jamie Madillbc918e72018-03-08 09:47:21 -05004562Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004563{
Geoff Langa8cb2872018-03-09 16:09:40 -05004564 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004565}
4566
Geoff Lang9bf86f02018-07-26 11:46:34 -04004567Error Context::syncStateForPathOperation()
4568{
4569 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4570
4571 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4572 ANGLE_TRY(syncDirtyBits());
4573
4574 return NoError();
4575}
4576
Jiajia Qin5451d532017-11-16 17:16:34 +08004577void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4578{
4579 UNIMPLEMENTED();
4580}
4581
Jamie Madillc20ab272016-06-09 07:20:46 -07004582void Context::activeTexture(GLenum texture)
4583{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004584 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004585}
4586
Jamie Madill876429b2017-04-20 15:46:24 -04004587void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004588{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004589 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004590}
4591
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004592void Context::blendEquation(GLenum mode)
4593{
4594 mGLState.setBlendEquation(mode, mode);
4595}
4596
Jamie Madillc20ab272016-06-09 07:20:46 -07004597void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4598{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004599 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004600}
4601
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004602void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4603{
4604 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4605}
4606
Jamie Madillc20ab272016-06-09 07:20:46 -07004607void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4608{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004609 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004610}
4611
Jamie Madill876429b2017-04-20 15:46:24 -04004612void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004613{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004614 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004615}
4616
Jamie Madill876429b2017-04-20 15:46:24 -04004617void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004618{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004619 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004620}
4621
4622void Context::clearStencil(GLint s)
4623{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004624 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004625}
4626
4627void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4628{
Geoff Lang92019432017-11-20 13:09:34 -05004629 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4630 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004631}
4632
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004633void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004634{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004635 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004636}
4637
4638void Context::depthFunc(GLenum func)
4639{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004640 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004641}
4642
4643void Context::depthMask(GLboolean flag)
4644{
Geoff Lang92019432017-11-20 13:09:34 -05004645 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004646}
4647
Jamie Madill876429b2017-04-20 15:46:24 -04004648void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004649{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004650 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004651}
4652
4653void Context::disable(GLenum cap)
4654{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004655 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004656 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004657}
4658
4659void Context::disableVertexAttribArray(GLuint index)
4660{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004661 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004662 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004663}
4664
4665void Context::enable(GLenum cap)
4666{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004667 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004668 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004669}
4670
4671void Context::enableVertexAttribArray(GLuint index)
4672{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004673 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004674 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004675}
4676
4677void Context::frontFace(GLenum mode)
4678{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004679 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004680}
4681
4682void Context::hint(GLenum target, GLenum mode)
4683{
4684 switch (target)
4685 {
4686 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004687 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004688 break;
4689
4690 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004691 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004692 break;
4693
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004694 case GL_PERSPECTIVE_CORRECTION_HINT:
4695 case GL_POINT_SMOOTH_HINT:
4696 case GL_LINE_SMOOTH_HINT:
4697 case GL_FOG_HINT:
4698 mGLState.gles1().setHint(target, mode);
4699 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004700 default:
4701 UNREACHABLE();
4702 return;
4703 }
4704}
4705
4706void Context::lineWidth(GLfloat width)
4707{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004708 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004709}
4710
4711void Context::pixelStorei(GLenum pname, GLint param)
4712{
4713 switch (pname)
4714 {
4715 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004716 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004717 break;
4718
4719 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004720 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004721 break;
4722
4723 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004724 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004725 break;
4726
4727 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004728 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004729 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004730 break;
4731
4732 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004733 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004734 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004735 break;
4736
4737 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004738 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004739 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004740 break;
4741
4742 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004743 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004744 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004745 break;
4746
4747 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004748 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004749 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004750 break;
4751
4752 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004753 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004754 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004755 break;
4756
4757 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004758 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004759 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004760 break;
4761
4762 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004763 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004764 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004765 break;
4766
4767 default:
4768 UNREACHABLE();
4769 return;
4770 }
4771}
4772
4773void Context::polygonOffset(GLfloat factor, GLfloat units)
4774{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004775 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004776}
4777
Jamie Madill876429b2017-04-20 15:46:24 -04004778void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004779{
Geoff Lang92019432017-11-20 13:09:34 -05004780 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004781}
4782
Jiawei Shaodb342272017-09-27 10:21:45 +08004783void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4784{
4785 mGLState.setSampleMaskParams(maskNumber, mask);
4786}
4787
Jamie Madillc20ab272016-06-09 07:20:46 -07004788void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4789{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004790 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004791}
4792
4793void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4794{
4795 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4796 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004797 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004798 }
4799
4800 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4801 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004802 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004803 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004804
4805 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004806}
4807
4808void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4809{
4810 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4811 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004812 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004813 }
4814
4815 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4816 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004817 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004818 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004819
4820 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004821}
4822
4823void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4824{
4825 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4826 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004827 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004828 }
4829
4830 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4831 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004832 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004833 }
4834}
4835
4836void Context::vertexAttrib1f(GLuint index, GLfloat x)
4837{
4838 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004839 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004840 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004841}
4842
4843void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4844{
4845 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004846 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004847 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004848}
4849
4850void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4851{
4852 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004853 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004854 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004855}
4856
4857void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4858{
4859 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004860 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004861 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004862}
4863
4864void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4865{
4866 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004867 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004868 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004869}
4870
4871void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4872{
4873 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004874 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004875 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004876}
4877
4878void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4879{
4880 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004881 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004882 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004883}
4884
4885void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4886{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004887 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004888 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004889}
4890
4891void Context::vertexAttribPointer(GLuint index,
4892 GLint size,
4893 GLenum type,
4894 GLboolean normalized,
4895 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004896 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004897{
Corentin Wallez336129f2017-10-17 15:55:40 -04004898 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004899 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004900 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004901}
4902
Shao80957d92017-02-20 21:25:59 +08004903void Context::vertexAttribFormat(GLuint attribIndex,
4904 GLint size,
4905 GLenum type,
4906 GLboolean normalized,
4907 GLuint relativeOffset)
4908{
Geoff Lang92019432017-11-20 13:09:34 -05004909 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004910 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004911 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004912}
4913
4914void Context::vertexAttribIFormat(GLuint attribIndex,
4915 GLint size,
4916 GLenum type,
4917 GLuint relativeOffset)
4918{
4919 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004920 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004921}
4922
4923void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4924{
Shaodde78e82017-05-22 14:13:27 +08004925 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004926 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004927}
4928
Jiajia Qin5451d532017-11-16 17:16:34 +08004929void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004930{
4931 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004932 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004933}
4934
Jamie Madillc20ab272016-06-09 07:20:46 -07004935void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4936{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004937 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004938}
4939
4940void Context::vertexAttribIPointer(GLuint index,
4941 GLint size,
4942 GLenum type,
4943 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004944 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004945{
Corentin Wallez336129f2017-10-17 15:55:40 -04004946 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4947 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004948 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004949}
4950
4951void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4952{
4953 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004954 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004955 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004956}
4957
4958void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4959{
4960 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004961 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004962 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004963}
4964
4965void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4966{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004967 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004968 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004969}
4970
4971void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4972{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004973 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004974 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004975}
4976
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004977void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4978{
4979 const VertexAttribCurrentValueData &currentValues =
4980 getGLState().getVertexAttribCurrentValue(index);
4981 const VertexArray *vao = getGLState().getVertexArray();
4982 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4983 currentValues, pname, params);
4984}
4985
Brandon Jones59770802018-04-02 13:18:42 -07004986void Context::getVertexAttribivRobust(GLuint index,
4987 GLenum pname,
4988 GLsizei bufSize,
4989 GLsizei *length,
4990 GLint *params)
4991{
4992 getVertexAttribiv(index, pname, params);
4993}
4994
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004995void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4996{
4997 const VertexAttribCurrentValueData &currentValues =
4998 getGLState().getVertexAttribCurrentValue(index);
4999 const VertexArray *vao = getGLState().getVertexArray();
5000 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5001 currentValues, pname, params);
5002}
5003
Brandon Jones59770802018-04-02 13:18:42 -07005004void Context::getVertexAttribfvRobust(GLuint index,
5005 GLenum pname,
5006 GLsizei bufSize,
5007 GLsizei *length,
5008 GLfloat *params)
5009{
5010 getVertexAttribfv(index, pname, params);
5011}
5012
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005013void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
5014{
5015 const VertexAttribCurrentValueData &currentValues =
5016 getGLState().getVertexAttribCurrentValue(index);
5017 const VertexArray *vao = getGLState().getVertexArray();
5018 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5019 currentValues, pname, params);
5020}
5021
Brandon Jones59770802018-04-02 13:18:42 -07005022void Context::getVertexAttribIivRobust(GLuint index,
5023 GLenum pname,
5024 GLsizei bufSize,
5025 GLsizei *length,
5026 GLint *params)
5027{
5028 getVertexAttribIiv(index, pname, params);
5029}
5030
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005031void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
5032{
5033 const VertexAttribCurrentValueData &currentValues =
5034 getGLState().getVertexAttribCurrentValue(index);
5035 const VertexArray *vao = getGLState().getVertexArray();
5036 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5037 currentValues, pname, params);
5038}
5039
Brandon Jones59770802018-04-02 13:18:42 -07005040void Context::getVertexAttribIuivRobust(GLuint index,
5041 GLenum pname,
5042 GLsizei bufSize,
5043 GLsizei *length,
5044 GLuint *params)
5045{
5046 getVertexAttribIuiv(index, pname, params);
5047}
5048
Jamie Madill876429b2017-04-20 15:46:24 -04005049void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005050{
5051 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
5052 QueryVertexAttribPointerv(attrib, pname, pointer);
5053}
5054
Brandon Jones59770802018-04-02 13:18:42 -07005055void Context::getVertexAttribPointervRobust(GLuint index,
5056 GLenum pname,
5057 GLsizei bufSize,
5058 GLsizei *length,
5059 void **pointer)
5060{
5061 getVertexAttribPointerv(index, pname, pointer);
5062}
5063
Jamie Madillc20ab272016-06-09 07:20:46 -07005064void Context::debugMessageControl(GLenum source,
5065 GLenum type,
5066 GLenum severity,
5067 GLsizei count,
5068 const GLuint *ids,
5069 GLboolean enabled)
5070{
5071 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005072 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005073 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005074}
5075
5076void Context::debugMessageInsert(GLenum source,
5077 GLenum type,
5078 GLuint id,
5079 GLenum severity,
5080 GLsizei length,
5081 const GLchar *buf)
5082{
5083 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005084 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005085}
5086
5087void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5088{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005089 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005090}
5091
5092GLuint Context::getDebugMessageLog(GLuint count,
5093 GLsizei bufSize,
5094 GLenum *sources,
5095 GLenum *types,
5096 GLuint *ids,
5097 GLenum *severities,
5098 GLsizei *lengths,
5099 GLchar *messageLog)
5100{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005101 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5102 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005103}
5104
5105void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5106{
5107 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005108 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005109 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005110}
5111
5112void Context::popDebugGroup()
5113{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005114 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005115 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005116}
5117
Corentin Wallez336129f2017-10-17 15:55:40 -04005118void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005119{
5120 Buffer *buffer = mGLState.getTargetBuffer(target);
5121 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005122 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005123}
5124
Corentin Wallez336129f2017-10-17 15:55:40 -04005125void Context::bufferSubData(BufferBinding target,
5126 GLintptr offset,
5127 GLsizeiptr size,
5128 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005129{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005130 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005131 {
5132 return;
5133 }
5134
5135 Buffer *buffer = mGLState.getTargetBuffer(target);
5136 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005137 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005138}
5139
Jamie Madillef300b12016-10-07 15:12:09 -04005140void Context::attachShader(GLuint program, GLuint shader)
5141{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005142 Program *programObject = mState.mShaderPrograms->getProgram(program);
5143 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005144 ASSERT(programObject && shaderObject);
5145 programObject->attachShader(shaderObject);
5146}
5147
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005148const Workarounds &Context::getWorkarounds() const
5149{
5150 return mWorkarounds;
5151}
5152
Corentin Wallez336129f2017-10-17 15:55:40 -04005153void Context::copyBufferSubData(BufferBinding readTarget,
5154 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005155 GLintptr readOffset,
5156 GLintptr writeOffset,
5157 GLsizeiptr size)
5158{
5159 // if size is zero, the copy is a successful no-op
5160 if (size == 0)
5161 {
5162 return;
5163 }
5164
5165 // TODO(jmadill): cache these.
5166 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5167 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5168
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005169 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005170}
5171
Jamie Madill01a80ee2016-11-07 12:06:18 -05005172void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5173{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005174 // Ideally we could share the program query with the validation layer if possible.
5175 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005176 ASSERT(programObject);
5177 programObject->bindAttributeLocation(index, name);
5178}
5179
Corentin Wallez336129f2017-10-17 15:55:40 -04005180void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005181{
Corentin Wallez336129f2017-10-17 15:55:40 -04005182 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5183 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005184 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005185}
5186
Corentin Wallez336129f2017-10-17 15:55:40 -04005187void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005188{
5189 bindBufferRange(target, index, buffer, 0, 0);
5190}
5191
Corentin Wallez336129f2017-10-17 15:55:40 -04005192void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005193 GLuint index,
5194 GLuint buffer,
5195 GLintptr offset,
5196 GLsizeiptr size)
5197{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005198 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5199 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5200 if (target == BufferBinding::Uniform)
5201 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005202 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005203 mStateCache.onUniformBufferStateChange(this);
5204 }
5205 else
5206 {
5207 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005208 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005209}
5210
Jamie Madill01a80ee2016-11-07 12:06:18 -05005211void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5212{
5213 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5214 {
5215 bindReadFramebuffer(framebuffer);
5216 }
5217
5218 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5219 {
5220 bindDrawFramebuffer(framebuffer);
5221 }
5222}
5223
5224void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5225{
5226 ASSERT(target == GL_RENDERBUFFER);
5227 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005228 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005229 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005230}
5231
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005232void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005233 GLsizei samples,
5234 GLenum internalformat,
5235 GLsizei width,
5236 GLsizei height,
5237 GLboolean fixedsamplelocations)
5238{
5239 Extents size(width, height, 1);
5240 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005241 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5242 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005243}
5244
Olli Etuaho89664842018-08-24 14:45:36 +03005245void Context::texStorage3DMultisample(TextureType target,
5246 GLsizei samples,
5247 GLenum internalformat,
5248 GLsizei width,
5249 GLsizei height,
5250 GLsizei depth,
5251 GLboolean fixedsamplelocations)
5252{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005253 Extents size(width, height, depth);
5254 Texture *texture = getTargetTexture(target);
5255 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5256 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005257}
5258
JiangYizhoubddc46b2016-12-09 09:50:51 +08005259void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5260{
JiangYizhou5b03f472017-01-09 10:22:53 +08005261 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5262 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005263 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005264 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005265
5266 switch (pname)
5267 {
5268 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005269 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005270 break;
5271 default:
5272 UNREACHABLE();
5273 }
5274}
5275
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005276void Context::getMultisamplefvRobust(GLenum pname,
5277 GLuint index,
5278 GLsizei bufSize,
5279 GLsizei *length,
5280 GLfloat *val)
5281{
5282 UNIMPLEMENTED();
5283}
5284
Jamie Madille8fb6402017-02-14 17:56:40 -05005285void Context::renderbufferStorage(GLenum target,
5286 GLenum internalformat,
5287 GLsizei width,
5288 GLsizei height)
5289{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005290 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5291 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5292
Jamie Madille8fb6402017-02-14 17:56:40 -05005293 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005294 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005295}
5296
5297void Context::renderbufferStorageMultisample(GLenum target,
5298 GLsizei samples,
5299 GLenum internalformat,
5300 GLsizei width,
5301 GLsizei height)
5302{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005303 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5304 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005305
5306 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005307 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005308 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005309}
5310
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005311void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5312{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005313 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005314 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005315}
5316
JiangYizhoue18e6392017-02-20 10:32:23 +08005317void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5318{
5319 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5320 QueryFramebufferParameteriv(framebuffer, pname, params);
5321}
5322
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005323void Context::getFramebufferParameterivRobust(GLenum target,
5324 GLenum pname,
5325 GLsizei bufSize,
5326 GLsizei *length,
5327 GLint *params)
5328{
5329 UNIMPLEMENTED();
5330}
5331
Jiajia Qin5451d532017-11-16 17:16:34 +08005332void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005333{
5334 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005335 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005336}
5337
Jamie Madilldec86232018-07-11 09:01:18 -04005338bool Context::getScratchBuffer(size_t requstedSizeBytes,
5339 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005340{
Jamie Madilldec86232018-07-11 09:01:18 -04005341 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005342}
5343
Jamie Madilldec86232018-07-11 09:01:18 -04005344bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5345 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005346{
Jamie Madilldec86232018-07-11 09:01:18 -04005347 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005348}
5349
Xinghua Cao10a4d432017-11-28 14:46:26 +08005350Error Context::prepareForDispatch()
5351{
Jamie Madill0cc11c62018-10-12 18:07:18 -04005352 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005353
5354 if (isRobustResourceInitEnabled())
5355 {
5356 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5357 }
5358
Jamie Madill0cc11c62018-10-12 18:07:18 -04005359 return syncDirtyBits(mComputeDirtyBits);
Xinghua Cao10a4d432017-11-28 14:46:26 +08005360}
5361
Xinghua Cao2b396592017-03-29 15:36:04 +08005362void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5363{
5364 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5365 {
5366 return;
5367 }
5368
Xinghua Cao10a4d432017-11-28 14:46:26 +08005369 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005370 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005371}
5372
Jiajia Qin5451d532017-11-16 17:16:34 +08005373void Context::dispatchComputeIndirect(GLintptr indirect)
5374{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005375 ANGLE_CONTEXT_TRY(prepareForDispatch());
5376 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005377}
5378
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005379void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005380 GLsizei levels,
5381 GLenum internalFormat,
5382 GLsizei width,
5383 GLsizei height)
5384{
5385 Extents size(width, height, 1);
5386 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005387 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005388}
5389
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005390void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005391 GLsizei levels,
5392 GLenum internalFormat,
5393 GLsizei width,
5394 GLsizei height,
5395 GLsizei depth)
5396{
5397 Extents size(width, height, depth);
5398 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005399 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005400}
5401
Jiajia Qin5451d532017-11-16 17:16:34 +08005402void Context::memoryBarrier(GLbitfield barriers)
5403{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005404 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005405}
5406
5407void Context::memoryBarrierByRegion(GLbitfield barriers)
5408{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005409 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005410}
5411
Austin Eng1bf18ce2018-10-19 15:34:02 -07005412void Context::multiDrawArrays(PrimitiveMode mode,
5413 const GLint *firsts,
5414 const GLsizei *counts,
5415 GLsizei drawcount)
5416{
5417 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5418 Program *programObject = mGLState.getLinkedProgram(this);
5419 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5420 if (hasDrawID)
5421 {
5422 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5423 {
5424 if (noopDraw(mode, counts[drawID]))
5425 {
5426 continue;
5427 }
5428 programObject->setDrawIDUniform(drawID);
5429 ANGLE_CONTEXT_TRY(
5430 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5431 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5432 counts[drawID], 1);
5433 }
5434 }
5435 else
5436 {
5437 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5438 {
5439 if (noopDraw(mode, counts[drawID]))
5440 {
5441 continue;
5442 }
5443 ANGLE_CONTEXT_TRY(
5444 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5445 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5446 counts[drawID], 1);
5447 }
5448 }
5449}
5450
5451void Context::multiDrawArraysInstanced(PrimitiveMode mode,
5452 const GLint *firsts,
5453 const GLsizei *counts,
5454 const GLsizei *instanceCounts,
5455 GLsizei drawcount)
5456{
5457 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5458 Program *programObject = mGLState.getLinkedProgram(this);
5459 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5460 if (hasDrawID)
5461 {
5462 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5463 {
5464 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5465 {
5466 continue;
5467 }
5468 programObject->setDrawIDUniform(drawID);
5469 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5470 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5471 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5472 counts[drawID], instanceCounts[drawID]);
5473 }
5474 }
5475 else
5476 {
5477 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5478 {
5479 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5480 {
5481 continue;
5482 }
5483 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5484 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5485 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5486 counts[drawID], instanceCounts[drawID]);
5487 }
5488 }
5489}
5490
5491void Context::multiDrawElements(PrimitiveMode mode,
5492 const GLsizei *counts,
5493 GLenum type,
5494 const GLsizei *offsets,
5495 GLsizei drawcount)
5496{
5497 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5498 Program *programObject = mGLState.getLinkedProgram(this);
5499 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5500 if (hasDrawID)
5501 {
5502 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5503 {
5504 if (noopDraw(mode, counts[drawID]))
5505 {
5506 continue;
5507 }
5508 programObject->setDrawIDUniform(drawID);
5509 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5510 ANGLE_CONTEXT_TRY(
5511 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5512 }
5513 }
5514 else
5515 {
5516 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5517 {
5518 if (noopDraw(mode, counts[drawID]))
5519 {
5520 continue;
5521 }
5522 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5523 ANGLE_CONTEXT_TRY(
5524 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5525 }
5526 }
5527}
5528
5529void Context::multiDrawElementsInstanced(PrimitiveMode mode,
5530 const GLsizei *counts,
5531 GLenum type,
5532 const GLsizei *offsets,
5533 const GLsizei *instanceCounts,
5534 GLsizei drawcount)
5535{
5536 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5537 Program *programObject = mGLState.getLinkedProgram(this);
5538 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5539 if (hasDrawID)
5540 {
5541 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5542 {
5543 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5544 {
5545 continue;
5546 }
5547 programObject->setDrawIDUniform(drawID);
5548 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5549 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5550 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5551 }
5552 }
5553 else
5554 {
5555 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5556 {
5557 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5558 {
5559 continue;
5560 }
5561 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5562 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5563 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5564 }
5565 }
5566}
5567
Jamie Madillc1d770e2017-04-13 17:31:24 -04005568GLenum Context::checkFramebufferStatus(GLenum target)
5569{
5570 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5571 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005572 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005573}
5574
5575void Context::compileShader(GLuint shader)
5576{
5577 Shader *shaderObject = GetValidShader(this, shader);
5578 if (!shaderObject)
5579 {
5580 return;
5581 }
5582 shaderObject->compile(this);
5583}
5584
5585void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5586{
5587 for (int i = 0; i < n; i++)
5588 {
5589 deleteBuffer(buffers[i]);
5590 }
5591}
5592
5593void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5594{
5595 for (int i = 0; i < n; i++)
5596 {
5597 if (framebuffers[i] != 0)
5598 {
5599 deleteFramebuffer(framebuffers[i]);
5600 }
5601 }
5602}
5603
5604void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5605{
5606 for (int i = 0; i < n; i++)
5607 {
5608 deleteRenderbuffer(renderbuffers[i]);
5609 }
5610}
5611
5612void Context::deleteTextures(GLsizei n, const GLuint *textures)
5613{
5614 for (int i = 0; i < n; i++)
5615 {
5616 if (textures[i] != 0)
5617 {
5618 deleteTexture(textures[i]);
5619 }
5620 }
5621}
5622
5623void Context::detachShader(GLuint program, GLuint shader)
5624{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005625 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005626 ASSERT(programObject);
5627
5628 Shader *shaderObject = getShader(shader);
5629 ASSERT(shaderObject);
5630
5631 programObject->detachShader(this, shaderObject);
5632}
5633
5634void Context::genBuffers(GLsizei n, GLuint *buffers)
5635{
5636 for (int i = 0; i < n; i++)
5637 {
5638 buffers[i] = createBuffer();
5639 }
5640}
5641
5642void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5643{
5644 for (int i = 0; i < n; i++)
5645 {
5646 framebuffers[i] = createFramebuffer();
5647 }
5648}
5649
5650void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5651{
5652 for (int i = 0; i < n; i++)
5653 {
5654 renderbuffers[i] = createRenderbuffer();
5655 }
5656}
5657
5658void Context::genTextures(GLsizei n, GLuint *textures)
5659{
5660 for (int i = 0; i < n; i++)
5661 {
5662 textures[i] = createTexture();
5663 }
5664}
5665
5666void Context::getActiveAttrib(GLuint program,
5667 GLuint index,
5668 GLsizei bufsize,
5669 GLsizei *length,
5670 GLint *size,
5671 GLenum *type,
5672 GLchar *name)
5673{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005674 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005675 ASSERT(programObject);
5676 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5677}
5678
5679void Context::getActiveUniform(GLuint program,
5680 GLuint index,
5681 GLsizei bufsize,
5682 GLsizei *length,
5683 GLint *size,
5684 GLenum *type,
5685 GLchar *name)
5686{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005687 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005688 ASSERT(programObject);
5689 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5690}
5691
5692void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5693{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005694 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005695 ASSERT(programObject);
5696 programObject->getAttachedShaders(maxcount, count, shaders);
5697}
5698
5699GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5700{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005701 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005702 ASSERT(programObject);
5703 return programObject->getAttributeLocation(name);
5704}
5705
5706void Context::getBooleanv(GLenum pname, GLboolean *params)
5707{
5708 GLenum nativeType;
5709 unsigned int numParams = 0;
5710 getQueryParameterInfo(pname, &nativeType, &numParams);
5711
5712 if (nativeType == GL_BOOL)
5713 {
5714 getBooleanvImpl(pname, params);
5715 }
5716 else
5717 {
5718 CastStateValues(this, nativeType, pname, numParams, params);
5719 }
5720}
5721
Brandon Jones59770802018-04-02 13:18:42 -07005722void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5723{
5724 getBooleanv(pname, params);
5725}
5726
Jamie Madillc1d770e2017-04-13 17:31:24 -04005727void Context::getFloatv(GLenum pname, GLfloat *params)
5728{
5729 GLenum nativeType;
5730 unsigned int numParams = 0;
5731 getQueryParameterInfo(pname, &nativeType, &numParams);
5732
5733 if (nativeType == GL_FLOAT)
5734 {
5735 getFloatvImpl(pname, params);
5736 }
5737 else
5738 {
5739 CastStateValues(this, nativeType, pname, numParams, params);
5740 }
5741}
5742
Brandon Jones59770802018-04-02 13:18:42 -07005743void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5744{
5745 getFloatv(pname, params);
5746}
5747
Jamie Madillc1d770e2017-04-13 17:31:24 -04005748void Context::getIntegerv(GLenum pname, GLint *params)
5749{
5750 GLenum nativeType;
5751 unsigned int numParams = 0;
5752 getQueryParameterInfo(pname, &nativeType, &numParams);
5753
5754 if (nativeType == GL_INT)
5755 {
5756 getIntegervImpl(pname, params);
5757 }
5758 else
5759 {
5760 CastStateValues(this, nativeType, pname, numParams, params);
5761 }
5762}
5763
Brandon Jones59770802018-04-02 13:18:42 -07005764void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5765{
5766 getIntegerv(pname, data);
5767}
5768
Jamie Madillc1d770e2017-04-13 17:31:24 -04005769void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5770{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005771 // Don't resolve link if checking the link completion status.
5772 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5773 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005774 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005775 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005776}
5777
Brandon Jones59770802018-04-02 13:18:42 -07005778void Context::getProgramivRobust(GLuint program,
5779 GLenum pname,
5780 GLsizei bufSize,
5781 GLsizei *length,
5782 GLint *params)
5783{
5784 getProgramiv(program, pname, params);
5785}
5786
Jiajia Qin5451d532017-11-16 17:16:34 +08005787void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5788{
5789 UNIMPLEMENTED();
5790}
5791
Jamie Madillbe849e42017-05-02 15:49:00 -04005792void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005793{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005794 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005795 ASSERT(programObject);
5796 programObject->getInfoLog(bufsize, length, infolog);
5797}
5798
Jiajia Qin5451d532017-11-16 17:16:34 +08005799void Context::getProgramPipelineInfoLog(GLuint pipeline,
5800 GLsizei bufSize,
5801 GLsizei *length,
5802 GLchar *infoLog)
5803{
5804 UNIMPLEMENTED();
5805}
5806
Jamie Madillc1d770e2017-04-13 17:31:24 -04005807void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5808{
5809 Shader *shaderObject = getShader(shader);
5810 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005811 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005812}
5813
Brandon Jones59770802018-04-02 13:18:42 -07005814void Context::getShaderivRobust(GLuint shader,
5815 GLenum pname,
5816 GLsizei bufSize,
5817 GLsizei *length,
5818 GLint *params)
5819{
5820 getShaderiv(shader, pname, params);
5821}
5822
Jamie Madillc1d770e2017-04-13 17:31:24 -04005823void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5824{
5825 Shader *shaderObject = getShader(shader);
5826 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005827 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005828}
5829
5830void Context::getShaderPrecisionFormat(GLenum shadertype,
5831 GLenum precisiontype,
5832 GLint *range,
5833 GLint *precision)
5834{
5835 // TODO(jmadill): Compute shaders.
5836
5837 switch (shadertype)
5838 {
5839 case GL_VERTEX_SHADER:
5840 switch (precisiontype)
5841 {
5842 case GL_LOW_FLOAT:
5843 mCaps.vertexLowpFloat.get(range, precision);
5844 break;
5845 case GL_MEDIUM_FLOAT:
5846 mCaps.vertexMediumpFloat.get(range, precision);
5847 break;
5848 case GL_HIGH_FLOAT:
5849 mCaps.vertexHighpFloat.get(range, precision);
5850 break;
5851
5852 case GL_LOW_INT:
5853 mCaps.vertexLowpInt.get(range, precision);
5854 break;
5855 case GL_MEDIUM_INT:
5856 mCaps.vertexMediumpInt.get(range, precision);
5857 break;
5858 case GL_HIGH_INT:
5859 mCaps.vertexHighpInt.get(range, precision);
5860 break;
5861
5862 default:
5863 UNREACHABLE();
5864 return;
5865 }
5866 break;
5867
5868 case GL_FRAGMENT_SHADER:
5869 switch (precisiontype)
5870 {
5871 case GL_LOW_FLOAT:
5872 mCaps.fragmentLowpFloat.get(range, precision);
5873 break;
5874 case GL_MEDIUM_FLOAT:
5875 mCaps.fragmentMediumpFloat.get(range, precision);
5876 break;
5877 case GL_HIGH_FLOAT:
5878 mCaps.fragmentHighpFloat.get(range, precision);
5879 break;
5880
5881 case GL_LOW_INT:
5882 mCaps.fragmentLowpInt.get(range, precision);
5883 break;
5884 case GL_MEDIUM_INT:
5885 mCaps.fragmentMediumpInt.get(range, precision);
5886 break;
5887 case GL_HIGH_INT:
5888 mCaps.fragmentHighpInt.get(range, precision);
5889 break;
5890
5891 default:
5892 UNREACHABLE();
5893 return;
5894 }
5895 break;
5896
5897 default:
5898 UNREACHABLE();
5899 return;
5900 }
5901}
5902
5903void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5904{
5905 Shader *shaderObject = getShader(shader);
5906 ASSERT(shaderObject);
5907 shaderObject->getSource(bufsize, length, source);
5908}
5909
5910void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5911{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005912 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005913 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005914 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005915}
5916
Brandon Jones59770802018-04-02 13:18:42 -07005917void Context::getUniformfvRobust(GLuint program,
5918 GLint location,
5919 GLsizei bufSize,
5920 GLsizei *length,
5921 GLfloat *params)
5922{
5923 getUniformfv(program, location, params);
5924}
5925
Jamie Madillc1d770e2017-04-13 17:31:24 -04005926void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5927{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005928 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005929 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005930 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005931}
5932
Brandon Jones59770802018-04-02 13:18:42 -07005933void Context::getUniformivRobust(GLuint program,
5934 GLint location,
5935 GLsizei bufSize,
5936 GLsizei *length,
5937 GLint *params)
5938{
5939 getUniformiv(program, location, params);
5940}
5941
Jamie Madillc1d770e2017-04-13 17:31:24 -04005942GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5943{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005944 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005945 ASSERT(programObject);
5946 return programObject->getUniformLocation(name);
5947}
5948
5949GLboolean Context::isBuffer(GLuint buffer)
5950{
5951 if (buffer == 0)
5952 {
5953 return GL_FALSE;
5954 }
5955
5956 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5957}
5958
5959GLboolean Context::isEnabled(GLenum cap)
5960{
5961 return mGLState.getEnableFeature(cap);
5962}
5963
5964GLboolean Context::isFramebuffer(GLuint framebuffer)
5965{
5966 if (framebuffer == 0)
5967 {
5968 return GL_FALSE;
5969 }
5970
5971 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5972}
5973
5974GLboolean Context::isProgram(GLuint program)
5975{
5976 if (program == 0)
5977 {
5978 return GL_FALSE;
5979 }
5980
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005981 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005982}
5983
5984GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5985{
5986 if (renderbuffer == 0)
5987 {
5988 return GL_FALSE;
5989 }
5990
5991 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5992}
5993
5994GLboolean Context::isShader(GLuint shader)
5995{
5996 if (shader == 0)
5997 {
5998 return GL_FALSE;
5999 }
6000
6001 return (getShader(shader) ? GL_TRUE : GL_FALSE);
6002}
6003
6004GLboolean Context::isTexture(GLuint texture)
6005{
6006 if (texture == 0)
6007 {
6008 return GL_FALSE;
6009 }
6010
6011 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
6012}
6013
6014void Context::linkProgram(GLuint program)
6015{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006016 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006017 ASSERT(programObject);
6018 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08006019
6020 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
6021 // don't need to worry that:
6022 // 1. Draw calls after link use the new executable code or the old one depending on the link
6023 // result.
6024 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
6025 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
6026 // ProgramD3D.
6027 if (programObject->isInUse())
6028 {
Jamie Madill785e8a02018-10-04 17:42:00 -04006029 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04006030 if (programObject->isLinked())
6031 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006032 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006033 }
jchen107ae70d82018-07-06 13:47:01 +08006034 mStateCache.onProgramExecutableChange(this);
6035 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006036}
6037
6038void Context::releaseShaderCompiler()
6039{
Jamie Madill4928b7c2017-06-20 12:57:39 -04006040 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006041}
6042
6043void Context::shaderBinary(GLsizei n,
6044 const GLuint *shaders,
6045 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04006046 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04006047 GLsizei length)
6048{
6049 // No binary shader formats are supported.
6050 UNIMPLEMENTED();
6051}
6052
Olli Etuaho0ca09752018-09-24 11:00:50 +03006053void Context::bindFragDataLocationIndexed(GLuint program,
6054 GLuint colorNumber,
6055 GLuint index,
6056 const char *name)
6057{
6058 Program *programObject = getProgramNoResolveLink(program);
6059 programObject->bindFragmentOutputLocation(colorNumber, name);
6060 programObject->bindFragmentOutputIndex(index, name);
6061}
6062
6063void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
6064{
6065 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
6066}
6067
6068int Context::getFragDataIndex(GLuint program, const char *name)
6069{
6070 Program *programObject = getProgramResolveLink(program);
6071 return programObject->getFragDataIndex(name);
6072}
6073
6074int Context::getProgramResourceLocationIndex(GLuint program,
6075 GLenum programInterface,
6076 const char *name)
6077{
6078 Program *programObject = getProgramResolveLink(program);
6079 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
6080 return programObject->getFragDataIndex(name);
6081}
6082
Jamie Madillc1d770e2017-04-13 17:31:24 -04006083void Context::shaderSource(GLuint shader,
6084 GLsizei count,
6085 const GLchar *const *string,
6086 const GLint *length)
6087{
6088 Shader *shaderObject = getShader(shader);
6089 ASSERT(shaderObject);
6090 shaderObject->setSource(count, string, length);
6091}
6092
6093void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
6094{
6095 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
6096}
6097
6098void Context::stencilMask(GLuint mask)
6099{
6100 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
6101}
6102
6103void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
6104{
6105 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
6106}
6107
6108void Context::uniform1f(GLint location, GLfloat x)
6109{
6110 Program *program = mGLState.getProgram();
6111 program->setUniform1fv(location, 1, &x);
6112}
6113
6114void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
6115{
6116 Program *program = mGLState.getProgram();
6117 program->setUniform1fv(location, count, v);
6118}
6119
Jamie Madill7e4eff12018-08-08 15:49:26 -04006120void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006121{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006122 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04006123 {
6124 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006125 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04006126 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006127}
6128
Jamie Madill7e4eff12018-08-08 15:49:26 -04006129void Context::uniform1i(GLint location, GLint x)
6130{
6131 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
6132}
6133
Jamie Madillc1d770e2017-04-13 17:31:24 -04006134void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
6135{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006136 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006137}
6138
6139void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
6140{
6141 GLfloat xy[2] = {x, y};
6142 Program *program = mGLState.getProgram();
6143 program->setUniform2fv(location, 1, xy);
6144}
6145
6146void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
6147{
6148 Program *program = mGLState.getProgram();
6149 program->setUniform2fv(location, count, v);
6150}
6151
6152void Context::uniform2i(GLint location, GLint x, GLint y)
6153{
6154 GLint xy[2] = {x, y};
6155 Program *program = mGLState.getProgram();
6156 program->setUniform2iv(location, 1, xy);
6157}
6158
6159void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6160{
6161 Program *program = mGLState.getProgram();
6162 program->setUniform2iv(location, count, v);
6163}
6164
6165void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6166{
6167 GLfloat xyz[3] = {x, y, z};
6168 Program *program = mGLState.getProgram();
6169 program->setUniform3fv(location, 1, xyz);
6170}
6171
6172void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6173{
6174 Program *program = mGLState.getProgram();
6175 program->setUniform3fv(location, count, v);
6176}
6177
6178void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6179{
6180 GLint xyz[3] = {x, y, z};
6181 Program *program = mGLState.getProgram();
6182 program->setUniform3iv(location, 1, xyz);
6183}
6184
6185void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6186{
6187 Program *program = mGLState.getProgram();
6188 program->setUniform3iv(location, count, v);
6189}
6190
6191void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6192{
6193 GLfloat xyzw[4] = {x, y, z, w};
6194 Program *program = mGLState.getProgram();
6195 program->setUniform4fv(location, 1, xyzw);
6196}
6197
6198void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6199{
6200 Program *program = mGLState.getProgram();
6201 program->setUniform4fv(location, count, v);
6202}
6203
6204void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6205{
6206 GLint xyzw[4] = {x, y, z, w};
6207 Program *program = mGLState.getProgram();
6208 program->setUniform4iv(location, 1, xyzw);
6209}
6210
6211void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6212{
6213 Program *program = mGLState.getProgram();
6214 program->setUniform4iv(location, count, v);
6215}
6216
6217void Context::uniformMatrix2fv(GLint location,
6218 GLsizei count,
6219 GLboolean transpose,
6220 const GLfloat *value)
6221{
6222 Program *program = mGLState.getProgram();
6223 program->setUniformMatrix2fv(location, count, transpose, value);
6224}
6225
6226void Context::uniformMatrix3fv(GLint location,
6227 GLsizei count,
6228 GLboolean transpose,
6229 const GLfloat *value)
6230{
6231 Program *program = mGLState.getProgram();
6232 program->setUniformMatrix3fv(location, count, transpose, value);
6233}
6234
6235void Context::uniformMatrix4fv(GLint location,
6236 GLsizei count,
6237 GLboolean transpose,
6238 const GLfloat *value)
6239{
6240 Program *program = mGLState.getProgram();
6241 program->setUniformMatrix4fv(location, count, transpose, value);
6242}
6243
6244void Context::validateProgram(GLuint program)
6245{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006246 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006247 ASSERT(programObject);
6248 programObject->validate(mCaps);
6249}
6250
Jiajia Qin5451d532017-11-16 17:16:34 +08006251void Context::validateProgramPipeline(GLuint pipeline)
6252{
6253 UNIMPLEMENTED();
6254}
6255
Jamie Madilld04908b2017-06-09 14:15:35 -04006256void Context::getProgramBinary(GLuint program,
6257 GLsizei bufSize,
6258 GLsizei *length,
6259 GLenum *binaryFormat,
6260 void *binary)
6261{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006262 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006263 ASSERT(programObject != nullptr);
6264
6265 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6266}
6267
6268void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6269{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006270 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006271 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006272
Jamie Madilld04908b2017-06-09 14:15:35 -04006273 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006274 if (programObject->isInUse())
6275 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006276 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006277 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006278 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006279}
6280
Jamie Madillff325f12017-08-26 15:06:05 -04006281void Context::uniform1ui(GLint location, GLuint v0)
6282{
6283 Program *program = mGLState.getProgram();
6284 program->setUniform1uiv(location, 1, &v0);
6285}
6286
6287void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6288{
6289 Program *program = mGLState.getProgram();
6290 const GLuint xy[] = {v0, v1};
6291 program->setUniform2uiv(location, 1, xy);
6292}
6293
6294void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6295{
6296 Program *program = mGLState.getProgram();
6297 const GLuint xyz[] = {v0, v1, v2};
6298 program->setUniform3uiv(location, 1, xyz);
6299}
6300
6301void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6302{
6303 Program *program = mGLState.getProgram();
6304 const GLuint xyzw[] = {v0, v1, v2, v3};
6305 program->setUniform4uiv(location, 1, xyzw);
6306}
6307
6308void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6309{
6310 Program *program = mGLState.getProgram();
6311 program->setUniform1uiv(location, count, value);
6312}
6313void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6314{
6315 Program *program = mGLState.getProgram();
6316 program->setUniform2uiv(location, count, value);
6317}
6318
6319void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6320{
6321 Program *program = mGLState.getProgram();
6322 program->setUniform3uiv(location, count, value);
6323}
6324
6325void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6326{
6327 Program *program = mGLState.getProgram();
6328 program->setUniform4uiv(location, count, value);
6329}
6330
Jamie Madillf0e04492017-08-26 15:28:42 -04006331void Context::genQueries(GLsizei n, GLuint *ids)
6332{
6333 for (GLsizei i = 0; i < n; i++)
6334 {
6335 GLuint handle = mQueryHandleAllocator.allocate();
6336 mQueryMap.assign(handle, nullptr);
6337 ids[i] = handle;
6338 }
6339}
6340
6341void Context::deleteQueries(GLsizei n, const GLuint *ids)
6342{
6343 for (int i = 0; i < n; i++)
6344 {
6345 GLuint query = ids[i];
6346
6347 Query *queryObject = nullptr;
6348 if (mQueryMap.erase(query, &queryObject))
6349 {
6350 mQueryHandleAllocator.release(query);
6351 if (queryObject)
6352 {
6353 queryObject->release(this);
6354 }
6355 }
6356 }
6357}
6358
6359GLboolean Context::isQuery(GLuint id)
6360{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006361 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006362}
6363
Jamie Madillc8c95812017-08-26 18:40:09 -04006364void Context::uniformMatrix2x3fv(GLint location,
6365 GLsizei count,
6366 GLboolean transpose,
6367 const GLfloat *value)
6368{
6369 Program *program = mGLState.getProgram();
6370 program->setUniformMatrix2x3fv(location, count, transpose, value);
6371}
6372
6373void Context::uniformMatrix3x2fv(GLint location,
6374 GLsizei count,
6375 GLboolean transpose,
6376 const GLfloat *value)
6377{
6378 Program *program = mGLState.getProgram();
6379 program->setUniformMatrix3x2fv(location, count, transpose, value);
6380}
6381
6382void Context::uniformMatrix2x4fv(GLint location,
6383 GLsizei count,
6384 GLboolean transpose,
6385 const GLfloat *value)
6386{
6387 Program *program = mGLState.getProgram();
6388 program->setUniformMatrix2x4fv(location, count, transpose, value);
6389}
6390
6391void Context::uniformMatrix4x2fv(GLint location,
6392 GLsizei count,
6393 GLboolean transpose,
6394 const GLfloat *value)
6395{
6396 Program *program = mGLState.getProgram();
6397 program->setUniformMatrix4x2fv(location, count, transpose, value);
6398}
6399
6400void Context::uniformMatrix3x4fv(GLint location,
6401 GLsizei count,
6402 GLboolean transpose,
6403 const GLfloat *value)
6404{
6405 Program *program = mGLState.getProgram();
6406 program->setUniformMatrix3x4fv(location, count, transpose, value);
6407}
6408
6409void Context::uniformMatrix4x3fv(GLint location,
6410 GLsizei count,
6411 GLboolean transpose,
6412 const GLfloat *value)
6413{
6414 Program *program = mGLState.getProgram();
6415 program->setUniformMatrix4x3fv(location, count, transpose, value);
6416}
6417
Jamie Madilld7576732017-08-26 18:49:50 -04006418void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6419{
6420 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6421 {
6422 GLuint vertexArray = arrays[arrayIndex];
6423
6424 if (arrays[arrayIndex] != 0)
6425 {
6426 VertexArray *vertexArrayObject = nullptr;
6427 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6428 {
6429 if (vertexArrayObject != nullptr)
6430 {
6431 detachVertexArray(vertexArray);
6432 vertexArrayObject->onDestroy(this);
6433 }
6434
6435 mVertexArrayHandleAllocator.release(vertexArray);
6436 }
6437 }
6438 }
6439}
6440
6441void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6442{
6443 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6444 {
6445 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6446 mVertexArrayMap.assign(vertexArray, nullptr);
6447 arrays[arrayIndex] = vertexArray;
6448 }
6449}
6450
6451bool Context::isVertexArray(GLuint array)
6452{
6453 if (array == 0)
6454 {
6455 return GL_FALSE;
6456 }
6457
6458 VertexArray *vao = getVertexArray(array);
6459 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6460}
6461
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006462void Context::endTransformFeedback()
6463{
6464 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6465 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006466 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006467}
6468
6469void Context::transformFeedbackVaryings(GLuint program,
6470 GLsizei count,
6471 const GLchar *const *varyings,
6472 GLenum bufferMode)
6473{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006474 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006475 ASSERT(programObject);
6476 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6477}
6478
6479void Context::getTransformFeedbackVarying(GLuint program,
6480 GLuint index,
6481 GLsizei bufSize,
6482 GLsizei *length,
6483 GLsizei *size,
6484 GLenum *type,
6485 GLchar *name)
6486{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006487 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006488 ASSERT(programObject);
6489 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6490}
6491
6492void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6493{
6494 for (int i = 0; i < n; i++)
6495 {
6496 GLuint transformFeedback = ids[i];
6497 if (transformFeedback == 0)
6498 {
6499 continue;
6500 }
6501
6502 TransformFeedback *transformFeedbackObject = nullptr;
6503 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6504 {
6505 if (transformFeedbackObject != nullptr)
6506 {
6507 detachTransformFeedback(transformFeedback);
6508 transformFeedbackObject->release(this);
6509 }
6510
6511 mTransformFeedbackHandleAllocator.release(transformFeedback);
6512 }
6513 }
6514}
6515
6516void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6517{
6518 for (int i = 0; i < n; i++)
6519 {
6520 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6521 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6522 ids[i] = transformFeedback;
6523 }
6524}
6525
6526bool Context::isTransformFeedback(GLuint id)
6527{
6528 if (id == 0)
6529 {
6530 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6531 // returns FALSE
6532 return GL_FALSE;
6533 }
6534
6535 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6536 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6537}
6538
6539void Context::pauseTransformFeedback()
6540{
6541 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6542 transformFeedback->pause();
6543}
6544
6545void Context::resumeTransformFeedback()
6546{
6547 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6548 transformFeedback->resume();
6549}
6550
Jamie Madill12e957f2017-08-26 21:42:26 -04006551void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6552{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006553 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006554 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006555}
6556
Brandon Jones59770802018-04-02 13:18:42 -07006557void Context::getUniformuivRobust(GLuint program,
6558 GLint location,
6559 GLsizei bufSize,
6560 GLsizei *length,
6561 GLuint *params)
6562{
6563 getUniformuiv(program, location, params);
6564}
6565
Jamie Madill12e957f2017-08-26 21:42:26 -04006566GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6567{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006568 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006569 return programObject->getFragDataLocation(name);
6570}
6571
6572void Context::getUniformIndices(GLuint program,
6573 GLsizei uniformCount,
6574 const GLchar *const *uniformNames,
6575 GLuint *uniformIndices)
6576{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006577 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006578 if (!programObject->isLinked())
6579 {
6580 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6581 {
6582 uniformIndices[uniformId] = GL_INVALID_INDEX;
6583 }
6584 }
6585 else
6586 {
6587 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6588 {
6589 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6590 }
6591 }
6592}
6593
6594void Context::getActiveUniformsiv(GLuint program,
6595 GLsizei uniformCount,
6596 const GLuint *uniformIndices,
6597 GLenum pname,
6598 GLint *params)
6599{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006600 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006601 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6602 {
6603 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006604 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006605 }
6606}
6607
6608GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6609{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006610 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006611 return programObject->getUniformBlockIndex(uniformBlockName);
6612}
6613
6614void Context::getActiveUniformBlockiv(GLuint program,
6615 GLuint uniformBlockIndex,
6616 GLenum pname,
6617 GLint *params)
6618{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006619 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006620 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6621}
6622
Brandon Jones59770802018-04-02 13:18:42 -07006623void Context::getActiveUniformBlockivRobust(GLuint program,
6624 GLuint uniformBlockIndex,
6625 GLenum pname,
6626 GLsizei bufSize,
6627 GLsizei *length,
6628 GLint *params)
6629{
6630 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6631}
6632
Jamie Madill12e957f2017-08-26 21:42:26 -04006633void Context::getActiveUniformBlockName(GLuint program,
6634 GLuint uniformBlockIndex,
6635 GLsizei bufSize,
6636 GLsizei *length,
6637 GLchar *uniformBlockName)
6638{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006639 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006640 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6641}
6642
6643void Context::uniformBlockBinding(GLuint program,
6644 GLuint uniformBlockIndex,
6645 GLuint uniformBlockBinding)
6646{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006647 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006648 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006649
Jamie Madill956ab4d2018-10-10 16:13:03 -04006650 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006651 if (programObject->isInUse())
6652 {
6653 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006654 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006655 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006656}
6657
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006658GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6659{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006660 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6661 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006662
Jamie Madill70b5bb02017-08-28 13:32:37 -04006663 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006664 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006665 if (error.isError())
6666 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006667 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006668 handleError(error);
6669 return nullptr;
6670 }
6671
Jamie Madill70b5bb02017-08-28 13:32:37 -04006672 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006673}
6674
6675GLboolean Context::isSync(GLsync sync)
6676{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006677 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006678}
6679
6680GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6681{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006682 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006683
6684 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006685 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006686 return result;
6687}
6688
6689void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6690{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006691 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006692 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006693}
6694
6695void Context::getInteger64v(GLenum pname, GLint64 *params)
6696{
6697 GLenum nativeType = GL_NONE;
6698 unsigned int numParams = 0;
6699 getQueryParameterInfo(pname, &nativeType, &numParams);
6700
6701 if (nativeType == GL_INT_64_ANGLEX)
6702 {
6703 getInteger64vImpl(pname, params);
6704 }
6705 else
6706 {
6707 CastStateValues(this, nativeType, pname, numParams, params);
6708 }
6709}
6710
Brandon Jones59770802018-04-02 13:18:42 -07006711void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6712{
6713 getInteger64v(pname, data);
6714}
6715
Corentin Wallez336129f2017-10-17 15:55:40 -04006716void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006717{
6718 Buffer *buffer = mGLState.getTargetBuffer(target);
6719 QueryBufferParameteri64v(buffer, pname, params);
6720}
6721
Brandon Jones59770802018-04-02 13:18:42 -07006722void Context::getBufferParameteri64vRobust(BufferBinding target,
6723 GLenum pname,
6724 GLsizei bufSize,
6725 GLsizei *length,
6726 GLint64 *params)
6727{
6728 getBufferParameteri64v(target, pname, params);
6729}
6730
Jamie Madill3ef140a2017-08-26 23:11:21 -04006731void Context::genSamplers(GLsizei count, GLuint *samplers)
6732{
6733 for (int i = 0; i < count; i++)
6734 {
6735 samplers[i] = mState.mSamplers->createSampler();
6736 }
6737}
6738
6739void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6740{
6741 for (int i = 0; i < count; i++)
6742 {
6743 GLuint sampler = samplers[i];
6744
6745 if (mState.mSamplers->getSampler(sampler))
6746 {
6747 detachSampler(sampler);
6748 }
6749
6750 mState.mSamplers->deleteObject(this, sampler);
6751 }
6752}
6753
6754void Context::getInternalformativ(GLenum target,
6755 GLenum internalformat,
6756 GLenum pname,
6757 GLsizei bufSize,
6758 GLint *params)
6759{
6760 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6761 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6762}
6763
Brandon Jones59770802018-04-02 13:18:42 -07006764void Context::getInternalformativRobust(GLenum target,
6765 GLenum internalformat,
6766 GLenum pname,
6767 GLsizei bufSize,
6768 GLsizei *length,
6769 GLint *params)
6770{
6771 getInternalformativ(target, internalformat, pname, bufSize, params);
6772}
6773
Jiajia Qin5451d532017-11-16 17:16:34 +08006774void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6775{
6776 programUniform1iv(program, location, 1, &v0);
6777}
6778
6779void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6780{
6781 GLint xy[2] = {v0, v1};
6782 programUniform2iv(program, location, 1, xy);
6783}
6784
6785void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6786{
6787 GLint xyz[3] = {v0, v1, v2};
6788 programUniform3iv(program, location, 1, xyz);
6789}
6790
6791void Context::programUniform4i(GLuint program,
6792 GLint location,
6793 GLint v0,
6794 GLint v1,
6795 GLint v2,
6796 GLint v3)
6797{
6798 GLint xyzw[4] = {v0, v1, v2, v3};
6799 programUniform4iv(program, location, 1, xyzw);
6800}
6801
6802void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6803{
6804 programUniform1uiv(program, location, 1, &v0);
6805}
6806
6807void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6808{
6809 GLuint xy[2] = {v0, v1};
6810 programUniform2uiv(program, location, 1, xy);
6811}
6812
6813void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6814{
6815 GLuint xyz[3] = {v0, v1, v2};
6816 programUniform3uiv(program, location, 1, xyz);
6817}
6818
6819void Context::programUniform4ui(GLuint program,
6820 GLint location,
6821 GLuint v0,
6822 GLuint v1,
6823 GLuint v2,
6824 GLuint v3)
6825{
6826 GLuint xyzw[4] = {v0, v1, v2, v3};
6827 programUniform4uiv(program, location, 1, xyzw);
6828}
6829
6830void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6831{
6832 programUniform1fv(program, location, 1, &v0);
6833}
6834
6835void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6836{
6837 GLfloat xy[2] = {v0, v1};
6838 programUniform2fv(program, location, 1, xy);
6839}
6840
6841void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6842{
6843 GLfloat xyz[3] = {v0, v1, v2};
6844 programUniform3fv(program, location, 1, xyz);
6845}
6846
6847void Context::programUniform4f(GLuint program,
6848 GLint location,
6849 GLfloat v0,
6850 GLfloat v1,
6851 GLfloat v2,
6852 GLfloat v3)
6853{
6854 GLfloat xyzw[4] = {v0, v1, v2, v3};
6855 programUniform4fv(program, location, 1, xyzw);
6856}
6857
Jamie Madill81c2e252017-09-09 23:32:46 -04006858void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6859{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006860 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006861 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006862 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006863}
6864
Jiajia Qin5451d532017-11-16 17:16:34 +08006865void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6866{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006867 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006868 ASSERT(programObject);
6869 programObject->setUniform2iv(location, count, value);
6870}
6871
6872void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6873{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006874 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006875 ASSERT(programObject);
6876 programObject->setUniform3iv(location, count, value);
6877}
6878
6879void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6880{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006881 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006882 ASSERT(programObject);
6883 programObject->setUniform4iv(location, count, value);
6884}
6885
6886void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6887{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006888 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006889 ASSERT(programObject);
6890 programObject->setUniform1uiv(location, count, value);
6891}
6892
6893void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6894{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006895 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006896 ASSERT(programObject);
6897 programObject->setUniform2uiv(location, count, value);
6898}
6899
6900void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6901{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006902 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006903 ASSERT(programObject);
6904 programObject->setUniform3uiv(location, count, value);
6905}
6906
6907void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6908{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006909 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006910 ASSERT(programObject);
6911 programObject->setUniform4uiv(location, count, value);
6912}
6913
6914void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6915{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006916 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006917 ASSERT(programObject);
6918 programObject->setUniform1fv(location, count, value);
6919}
6920
6921void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6922{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006923 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006924 ASSERT(programObject);
6925 programObject->setUniform2fv(location, count, value);
6926}
6927
6928void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6929{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006930 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006931 ASSERT(programObject);
6932 programObject->setUniform3fv(location, count, value);
6933}
6934
6935void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6936{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006937 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006938 ASSERT(programObject);
6939 programObject->setUniform4fv(location, count, value);
6940}
6941
6942void Context::programUniformMatrix2fv(GLuint program,
6943 GLint location,
6944 GLsizei count,
6945 GLboolean transpose,
6946 const GLfloat *value)
6947{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006948 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006949 ASSERT(programObject);
6950 programObject->setUniformMatrix2fv(location, count, transpose, value);
6951}
6952
6953void Context::programUniformMatrix3fv(GLuint program,
6954 GLint location,
6955 GLsizei count,
6956 GLboolean transpose,
6957 const GLfloat *value)
6958{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006959 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006960 ASSERT(programObject);
6961 programObject->setUniformMatrix3fv(location, count, transpose, value);
6962}
6963
6964void Context::programUniformMatrix4fv(GLuint program,
6965 GLint location,
6966 GLsizei count,
6967 GLboolean transpose,
6968 const GLfloat *value)
6969{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006970 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006971 ASSERT(programObject);
6972 programObject->setUniformMatrix4fv(location, count, transpose, value);
6973}
6974
6975void Context::programUniformMatrix2x3fv(GLuint program,
6976 GLint location,
6977 GLsizei count,
6978 GLboolean transpose,
6979 const GLfloat *value)
6980{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006981 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006982 ASSERT(programObject);
6983 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6984}
6985
6986void Context::programUniformMatrix3x2fv(GLuint program,
6987 GLint location,
6988 GLsizei count,
6989 GLboolean transpose,
6990 const GLfloat *value)
6991{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006992 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006993 ASSERT(programObject);
6994 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6995}
6996
6997void Context::programUniformMatrix2x4fv(GLuint program,
6998 GLint location,
6999 GLsizei count,
7000 GLboolean transpose,
7001 const GLfloat *value)
7002{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007003 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007004 ASSERT(programObject);
7005 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
7006}
7007
7008void Context::programUniformMatrix4x2fv(GLuint program,
7009 GLint location,
7010 GLsizei count,
7011 GLboolean transpose,
7012 const GLfloat *value)
7013{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007014 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007015 ASSERT(programObject);
7016 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
7017}
7018
7019void Context::programUniformMatrix3x4fv(GLuint program,
7020 GLint location,
7021 GLsizei count,
7022 GLboolean transpose,
7023 const GLfloat *value)
7024{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007025 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007026 ASSERT(programObject);
7027 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
7028}
7029
7030void Context::programUniformMatrix4x3fv(GLuint program,
7031 GLint location,
7032 GLsizei count,
7033 GLboolean transpose,
7034 const GLfloat *value)
7035{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007036 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007037 ASSERT(programObject);
7038 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
7039}
7040
Jamie Madill81c2e252017-09-09 23:32:46 -04007041void Context::onTextureChange(const Texture *texture)
7042{
7043 // Conservatively assume all textures are dirty.
7044 // TODO(jmadill): More fine-grained update.
7045 mGLState.setObjectDirty(GL_TEXTURE);
7046}
7047
James Darpiniane8a93c62018-01-04 18:02:24 -08007048bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
7049{
7050 return mGLState.isCurrentTransformFeedback(tf);
7051}
James Darpiniane8a93c62018-01-04 18:02:24 -08007052
Yunchao Hea336b902017-08-02 16:05:21 +08007053void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
7054{
7055 for (int i = 0; i < count; i++)
7056 {
7057 pipelines[i] = createProgramPipeline();
7058 }
7059}
7060
7061void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
7062{
7063 for (int i = 0; i < count; i++)
7064 {
7065 if (pipelines[i] != 0)
7066 {
7067 deleteProgramPipeline(pipelines[i]);
7068 }
7069 }
7070}
7071
7072GLboolean Context::isProgramPipeline(GLuint pipeline)
7073{
7074 if (pipeline == 0)
7075 {
7076 return GL_FALSE;
7077 }
7078
7079 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
7080}
7081
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007082void Context::finishFenceNV(GLuint fence)
7083{
7084 FenceNV *fenceObject = getFenceNV(fence);
7085
7086 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04007087 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007088}
7089
7090void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
7091{
7092 FenceNV *fenceObject = getFenceNV(fence);
7093
7094 ASSERT(fenceObject && fenceObject->isSet());
7095
7096 switch (pname)
7097 {
7098 case GL_FENCE_STATUS_NV:
7099 {
7100 // GL_NV_fence spec:
7101 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
7102 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
7103 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
7104 GLboolean status = GL_TRUE;
7105 if (fenceObject->getStatus() != GL_TRUE)
7106 {
Jamie Madilla0691b72018-07-25 10:41:22 -04007107 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007108 }
7109 *params = status;
7110 break;
7111 }
7112
7113 case GL_FENCE_CONDITION_NV:
7114 {
7115 *params = static_cast<GLint>(fenceObject->getCondition());
7116 break;
7117 }
7118
7119 default:
7120 UNREACHABLE();
7121 }
7122}
7123
7124void Context::getTranslatedShaderSource(GLuint shader,
7125 GLsizei bufsize,
7126 GLsizei *length,
7127 GLchar *source)
7128{
7129 Shader *shaderObject = getShader(shader);
7130 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08007131 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007132}
7133
7134void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
7135{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007136 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007137 ASSERT(programObject);
7138
7139 programObject->getUniformfv(this, location, params);
7140}
7141
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007142void Context::getnUniformfvRobust(GLuint program,
7143 GLint location,
7144 GLsizei bufSize,
7145 GLsizei *length,
7146 GLfloat *params)
7147{
7148 UNIMPLEMENTED();
7149}
7150
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007151void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
7152{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007153 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007154 ASSERT(programObject);
7155
7156 programObject->getUniformiv(this, location, params);
7157}
7158
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007159void Context::getnUniformivRobust(GLuint program,
7160 GLint location,
7161 GLsizei bufSize,
7162 GLsizei *length,
7163 GLint *params)
7164{
7165 UNIMPLEMENTED();
7166}
7167
7168void Context::getnUniformuivRobust(GLuint program,
7169 GLint location,
7170 GLsizei bufSize,
7171 GLsizei *length,
7172 GLuint *params)
7173{
7174 UNIMPLEMENTED();
7175}
7176
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007177GLboolean Context::isFenceNV(GLuint fence)
7178{
7179 FenceNV *fenceObject = getFenceNV(fence);
7180
7181 if (fenceObject == nullptr)
7182 {
7183 return GL_FALSE;
7184 }
7185
7186 // GL_NV_fence spec:
7187 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7188 // existing fence.
7189 return fenceObject->isSet();
7190}
7191
7192void Context::readnPixels(GLint x,
7193 GLint y,
7194 GLsizei width,
7195 GLsizei height,
7196 GLenum format,
7197 GLenum type,
7198 GLsizei bufSize,
7199 void *data)
7200{
7201 return readPixels(x, y, width, height, format, type, data);
7202}
7203
Jamie Madill007530e2017-12-28 14:27:04 -05007204void Context::setFenceNV(GLuint fence, GLenum condition)
7205{
7206 ASSERT(condition == GL_ALL_COMPLETED_NV);
7207
7208 FenceNV *fenceObject = getFenceNV(fence);
7209 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04007210 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007211}
7212
7213GLboolean Context::testFenceNV(GLuint fence)
7214{
7215 FenceNV *fenceObject = getFenceNV(fence);
7216
7217 ASSERT(fenceObject != nullptr);
7218 ASSERT(fenceObject->isSet() == GL_TRUE);
7219
7220 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007221 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007222 if (error.isError())
7223 {
7224 handleError(error);
7225 return GL_TRUE;
7226 }
7227
7228 return result;
7229}
7230
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007231void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007232{
7233 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007234 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007235 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007236}
7237
Jamie Madillfa920eb2018-01-04 11:45:50 -05007238void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007239{
7240 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007241 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007242 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7243}
7244
Jamie Madillfa920eb2018-01-04 11:45:50 -05007245void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7246{
7247 UNIMPLEMENTED();
7248}
7249
Jamie Madill5b772312018-03-08 20:28:32 -05007250bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7251{
7252 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7253 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7254 // to the fact that it is stored internally as a float, and so would require conversion
7255 // if returned from Context::getIntegerv. Since this conversion is already implemented
7256 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7257 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7258 // application.
7259 switch (pname)
7260 {
7261 case GL_COMPRESSED_TEXTURE_FORMATS:
7262 {
7263 *type = GL_INT;
7264 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7265 return true;
7266 }
7267 case GL_SHADER_BINARY_FORMATS:
7268 {
7269 *type = GL_INT;
7270 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7271 return true;
7272 }
7273
7274 case GL_MAX_VERTEX_ATTRIBS:
7275 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7276 case GL_MAX_VARYING_VECTORS:
7277 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7278 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7279 case GL_MAX_TEXTURE_IMAGE_UNITS:
7280 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7281 case GL_MAX_RENDERBUFFER_SIZE:
7282 case GL_NUM_SHADER_BINARY_FORMATS:
7283 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7284 case GL_ARRAY_BUFFER_BINDING:
7285 case GL_FRAMEBUFFER_BINDING:
7286 case GL_RENDERBUFFER_BINDING:
7287 case GL_CURRENT_PROGRAM:
7288 case GL_PACK_ALIGNMENT:
7289 case GL_UNPACK_ALIGNMENT:
7290 case GL_GENERATE_MIPMAP_HINT:
7291 case GL_RED_BITS:
7292 case GL_GREEN_BITS:
7293 case GL_BLUE_BITS:
7294 case GL_ALPHA_BITS:
7295 case GL_DEPTH_BITS:
7296 case GL_STENCIL_BITS:
7297 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7298 case GL_CULL_FACE_MODE:
7299 case GL_FRONT_FACE:
7300 case GL_ACTIVE_TEXTURE:
7301 case GL_STENCIL_FUNC:
7302 case GL_STENCIL_VALUE_MASK:
7303 case GL_STENCIL_REF:
7304 case GL_STENCIL_FAIL:
7305 case GL_STENCIL_PASS_DEPTH_FAIL:
7306 case GL_STENCIL_PASS_DEPTH_PASS:
7307 case GL_STENCIL_BACK_FUNC:
7308 case GL_STENCIL_BACK_VALUE_MASK:
7309 case GL_STENCIL_BACK_REF:
7310 case GL_STENCIL_BACK_FAIL:
7311 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7312 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7313 case GL_DEPTH_FUNC:
7314 case GL_BLEND_SRC_RGB:
7315 case GL_BLEND_SRC_ALPHA:
7316 case GL_BLEND_DST_RGB:
7317 case GL_BLEND_DST_ALPHA:
7318 case GL_BLEND_EQUATION_RGB:
7319 case GL_BLEND_EQUATION_ALPHA:
7320 case GL_STENCIL_WRITEMASK:
7321 case GL_STENCIL_BACK_WRITEMASK:
7322 case GL_STENCIL_CLEAR_VALUE:
7323 case GL_SUBPIXEL_BITS:
7324 case GL_MAX_TEXTURE_SIZE:
7325 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7326 case GL_SAMPLE_BUFFERS:
7327 case GL_SAMPLES:
7328 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7329 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7330 case GL_TEXTURE_BINDING_2D:
7331 case GL_TEXTURE_BINDING_CUBE_MAP:
7332 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7333 {
7334 *type = GL_INT;
7335 *numParams = 1;
7336 return true;
7337 }
7338 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7339 {
7340 if (!getExtensions().packReverseRowOrder)
7341 {
7342 return false;
7343 }
7344 *type = GL_INT;
7345 *numParams = 1;
7346 return true;
7347 }
7348 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7349 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7350 {
7351 if (!getExtensions().textureRectangle)
7352 {
7353 return false;
7354 }
7355 *type = GL_INT;
7356 *numParams = 1;
7357 return true;
7358 }
7359 case GL_MAX_DRAW_BUFFERS_EXT:
7360 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7361 {
7362 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7363 {
7364 return false;
7365 }
7366 *type = GL_INT;
7367 *numParams = 1;
7368 return true;
7369 }
7370 case GL_MAX_VIEWPORT_DIMS:
7371 {
7372 *type = GL_INT;
7373 *numParams = 2;
7374 return true;
7375 }
7376 case GL_VIEWPORT:
7377 case GL_SCISSOR_BOX:
7378 {
7379 *type = GL_INT;
7380 *numParams = 4;
7381 return true;
7382 }
7383 case GL_SHADER_COMPILER:
7384 case GL_SAMPLE_COVERAGE_INVERT:
7385 case GL_DEPTH_WRITEMASK:
7386 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7387 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7388 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7389 // bool-natural
7390 case GL_SAMPLE_COVERAGE:
7391 case GL_SCISSOR_TEST:
7392 case GL_STENCIL_TEST:
7393 case GL_DEPTH_TEST:
7394 case GL_BLEND:
7395 case GL_DITHER:
7396 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7397 {
7398 *type = GL_BOOL;
7399 *numParams = 1;
7400 return true;
7401 }
7402 case GL_COLOR_WRITEMASK:
7403 {
7404 *type = GL_BOOL;
7405 *numParams = 4;
7406 return true;
7407 }
7408 case GL_POLYGON_OFFSET_FACTOR:
7409 case GL_POLYGON_OFFSET_UNITS:
7410 case GL_SAMPLE_COVERAGE_VALUE:
7411 case GL_DEPTH_CLEAR_VALUE:
7412 case GL_LINE_WIDTH:
7413 {
7414 *type = GL_FLOAT;
7415 *numParams = 1;
7416 return true;
7417 }
7418 case GL_ALIASED_LINE_WIDTH_RANGE:
7419 case GL_ALIASED_POINT_SIZE_RANGE:
7420 case GL_DEPTH_RANGE:
7421 {
7422 *type = GL_FLOAT;
7423 *numParams = 2;
7424 return true;
7425 }
7426 case GL_COLOR_CLEAR_VALUE:
7427 case GL_BLEND_COLOR:
7428 {
7429 *type = GL_FLOAT;
7430 *numParams = 4;
7431 return true;
7432 }
7433 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7434 if (!getExtensions().textureFilterAnisotropic)
7435 {
7436 return false;
7437 }
7438 *type = GL_FLOAT;
7439 *numParams = 1;
7440 return true;
7441 case GL_TIMESTAMP_EXT:
7442 if (!getExtensions().disjointTimerQuery)
7443 {
7444 return false;
7445 }
7446 *type = GL_INT_64_ANGLEX;
7447 *numParams = 1;
7448 return true;
7449 case GL_GPU_DISJOINT_EXT:
7450 if (!getExtensions().disjointTimerQuery)
7451 {
7452 return false;
7453 }
7454 *type = GL_INT;
7455 *numParams = 1;
7456 return true;
7457 case GL_COVERAGE_MODULATION_CHROMIUM:
7458 if (!getExtensions().framebufferMixedSamples)
7459 {
7460 return false;
7461 }
7462 *type = GL_INT;
7463 *numParams = 1;
7464 return true;
7465 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7466 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7467 {
7468 return false;
7469 }
7470 *type = GL_INT;
7471 *numParams = 1;
7472 return true;
7473 }
7474
7475 if (getExtensions().debug)
7476 {
7477 switch (pname)
7478 {
7479 case GL_DEBUG_LOGGED_MESSAGES:
7480 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7481 case GL_DEBUG_GROUP_STACK_DEPTH:
7482 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7483 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7484 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7485 case GL_MAX_LABEL_LENGTH:
7486 *type = GL_INT;
7487 *numParams = 1;
7488 return true;
7489
7490 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7491 case GL_DEBUG_OUTPUT:
7492 *type = GL_BOOL;
7493 *numParams = 1;
7494 return true;
7495 }
7496 }
7497
7498 if (getExtensions().multisampleCompatibility)
7499 {
7500 switch (pname)
7501 {
7502 case GL_MULTISAMPLE_EXT:
7503 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7504 *type = GL_BOOL;
7505 *numParams = 1;
7506 return true;
7507 }
7508 }
7509
7510 if (getExtensions().pathRendering)
7511 {
7512 switch (pname)
7513 {
7514 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7515 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7516 *type = GL_FLOAT;
7517 *numParams = 16;
7518 return true;
7519 }
7520 }
7521
7522 if (getExtensions().bindGeneratesResource)
7523 {
7524 switch (pname)
7525 {
7526 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7527 *type = GL_BOOL;
7528 *numParams = 1;
7529 return true;
7530 }
7531 }
7532
7533 if (getExtensions().clientArrays)
7534 {
7535 switch (pname)
7536 {
7537 case GL_CLIENT_ARRAYS_ANGLE:
7538 *type = GL_BOOL;
7539 *numParams = 1;
7540 return true;
7541 }
7542 }
7543
7544 if (getExtensions().sRGBWriteControl)
7545 {
7546 switch (pname)
7547 {
7548 case GL_FRAMEBUFFER_SRGB_EXT:
7549 *type = GL_BOOL;
7550 *numParams = 1;
7551 return true;
7552 }
7553 }
7554
7555 if (getExtensions().robustResourceInitialization &&
7556 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7557 {
7558 *type = GL_BOOL;
7559 *numParams = 1;
7560 return true;
7561 }
7562
7563 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7564 {
7565 *type = GL_BOOL;
7566 *numParams = 1;
7567 return true;
7568 }
7569
jchen1082af6202018-06-22 10:59:52 +08007570 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7571 {
7572 *type = GL_INT;
7573 *numParams = 1;
7574 return true;
7575 }
7576
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007577 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7578 {
7579 *type = GL_INT;
7580 *numParams = 1;
7581 return true;
7582 }
7583
Jamie Madill5b772312018-03-08 20:28:32 -05007584 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7585 switch (pname)
7586 {
7587 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7588 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7589 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7590 {
7591 return false;
7592 }
7593 *type = GL_INT;
7594 *numParams = 1;
7595 return true;
7596
7597 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7598 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7599 {
7600 return false;
7601 }
7602 *type = GL_INT;
7603 *numParams = 1;
7604 return true;
7605
7606 case GL_PROGRAM_BINARY_FORMATS_OES:
7607 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7608 {
7609 return false;
7610 }
7611 *type = GL_INT;
7612 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7613 return true;
7614
7615 case GL_PACK_ROW_LENGTH:
7616 case GL_PACK_SKIP_ROWS:
7617 case GL_PACK_SKIP_PIXELS:
7618 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7619 {
7620 return false;
7621 }
7622 *type = GL_INT;
7623 *numParams = 1;
7624 return true;
7625 case GL_UNPACK_ROW_LENGTH:
7626 case GL_UNPACK_SKIP_ROWS:
7627 case GL_UNPACK_SKIP_PIXELS:
7628 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7629 {
7630 return false;
7631 }
7632 *type = GL_INT;
7633 *numParams = 1;
7634 return true;
7635 case GL_VERTEX_ARRAY_BINDING:
7636 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7637 {
7638 return false;
7639 }
7640 *type = GL_INT;
7641 *numParams = 1;
7642 return true;
7643 case GL_PIXEL_PACK_BUFFER_BINDING:
7644 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7645 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7646 {
7647 return false;
7648 }
7649 *type = GL_INT;
7650 *numParams = 1;
7651 return true;
7652 case GL_MAX_SAMPLES:
7653 {
7654 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7655 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7656 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7657 {
7658 return false;
7659 }
7660 *type = GL_INT;
7661 *numParams = 1;
7662 return true;
7663
7664 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7665 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7666 {
7667 return false;
7668 }
7669 *type = GL_INT;
7670 *numParams = 1;
7671 return true;
7672 }
7673 }
7674
7675 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7676 {
7677 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7678 {
7679 return false;
7680 }
7681 *type = GL_INT;
7682 *numParams = 1;
7683 return true;
7684 }
7685
7686 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7687 {
7688 *type = GL_INT;
7689 *numParams = 1;
7690 return true;
7691 }
7692
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007693 if (getClientVersion() < Version(2, 0))
7694 {
7695 switch (pname)
7696 {
7697 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007698 case GL_CLIENT_ACTIVE_TEXTURE:
7699 case GL_MATRIX_MODE:
7700 case GL_MAX_TEXTURE_UNITS:
7701 case GL_MAX_MODELVIEW_STACK_DEPTH:
7702 case GL_MAX_PROJECTION_STACK_DEPTH:
7703 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007704 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007705 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007706 case GL_VERTEX_ARRAY_STRIDE:
7707 case GL_NORMAL_ARRAY_STRIDE:
7708 case GL_COLOR_ARRAY_STRIDE:
7709 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7710 case GL_VERTEX_ARRAY_SIZE:
7711 case GL_COLOR_ARRAY_SIZE:
7712 case GL_TEXTURE_COORD_ARRAY_SIZE:
7713 case GL_VERTEX_ARRAY_TYPE:
7714 case GL_NORMAL_ARRAY_TYPE:
7715 case GL_COLOR_ARRAY_TYPE:
7716 case GL_TEXTURE_COORD_ARRAY_TYPE:
7717 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7718 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7719 case GL_COLOR_ARRAY_BUFFER_BINDING:
7720 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7721 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7722 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7723 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007724 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007725 case GL_MODELVIEW_STACK_DEPTH:
7726 case GL_PROJECTION_STACK_DEPTH:
7727 case GL_TEXTURE_STACK_DEPTH:
7728 case GL_LOGIC_OP_MODE:
7729 case GL_BLEND_SRC:
7730 case GL_BLEND_DST:
7731 case GL_PERSPECTIVE_CORRECTION_HINT:
7732 case GL_POINT_SMOOTH_HINT:
7733 case GL_LINE_SMOOTH_HINT:
7734 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007735 *type = GL_INT;
7736 *numParams = 1;
7737 return true;
7738 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007739 case GL_FOG_DENSITY:
7740 case GL_FOG_START:
7741 case GL_FOG_END:
7742 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007743 case GL_POINT_SIZE:
7744 case GL_POINT_SIZE_MIN:
7745 case GL_POINT_SIZE_MAX:
7746 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007747 *type = GL_FLOAT;
7748 *numParams = 1;
7749 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007750 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007751 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007752 *type = GL_FLOAT;
7753 *numParams = 2;
7754 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007755 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007756 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007757 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007758 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007759 *type = GL_FLOAT;
7760 *numParams = 4;
7761 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007762 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007763 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007764 *type = GL_FLOAT;
7765 *numParams = 3;
7766 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007767 case GL_MODELVIEW_MATRIX:
7768 case GL_PROJECTION_MATRIX:
7769 case GL_TEXTURE_MATRIX:
7770 *type = GL_FLOAT;
7771 *numParams = 16;
7772 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007773 case GL_LIGHT_MODEL_TWO_SIDE:
7774 *type = GL_BOOL;
7775 *numParams = 1;
7776 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007777 }
7778 }
7779
Jamie Madill5b772312018-03-08 20:28:32 -05007780 if (getClientVersion() < Version(3, 0))
7781 {
7782 return false;
7783 }
7784
7785 // Check for ES3.0+ parameter names
7786 switch (pname)
7787 {
7788 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7789 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7790 case GL_UNIFORM_BUFFER_BINDING:
7791 case GL_TRANSFORM_FEEDBACK_BINDING:
7792 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7793 case GL_COPY_READ_BUFFER_BINDING:
7794 case GL_COPY_WRITE_BUFFER_BINDING:
7795 case GL_SAMPLER_BINDING:
7796 case GL_READ_BUFFER:
7797 case GL_TEXTURE_BINDING_3D:
7798 case GL_TEXTURE_BINDING_2D_ARRAY:
7799 case GL_MAX_3D_TEXTURE_SIZE:
7800 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7801 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7802 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7803 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7804 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7805 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7806 case GL_MAX_VARYING_COMPONENTS:
7807 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7808 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7809 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7810 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7811 case GL_NUM_EXTENSIONS:
7812 case GL_MAJOR_VERSION:
7813 case GL_MINOR_VERSION:
7814 case GL_MAX_ELEMENTS_INDICES:
7815 case GL_MAX_ELEMENTS_VERTICES:
7816 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7817 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7818 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7819 case GL_UNPACK_IMAGE_HEIGHT:
7820 case GL_UNPACK_SKIP_IMAGES:
7821 {
7822 *type = GL_INT;
7823 *numParams = 1;
7824 return true;
7825 }
7826
7827 case GL_MAX_ELEMENT_INDEX:
7828 case GL_MAX_UNIFORM_BLOCK_SIZE:
7829 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7830 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7831 case GL_MAX_SERVER_WAIT_TIMEOUT:
7832 {
7833 *type = GL_INT_64_ANGLEX;
7834 *numParams = 1;
7835 return true;
7836 }
7837
7838 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7839 case GL_TRANSFORM_FEEDBACK_PAUSED:
7840 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7841 case GL_RASTERIZER_DISCARD:
7842 {
7843 *type = GL_BOOL;
7844 *numParams = 1;
7845 return true;
7846 }
7847
7848 case GL_MAX_TEXTURE_LOD_BIAS:
7849 {
7850 *type = GL_FLOAT;
7851 *numParams = 1;
7852 return true;
7853 }
7854 }
7855
7856 if (getExtensions().requestExtension)
7857 {
7858 switch (pname)
7859 {
7860 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7861 *type = GL_INT;
7862 *numParams = 1;
7863 return true;
7864 }
7865 }
7866
Yizhou Jiang7818a852018-09-06 15:02:04 +08007867 if (getExtensions().textureMultisample)
7868 {
7869 switch (pname)
7870 {
7871 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7872 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7873 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7874 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
7875 *type = GL_INT;
7876 *numParams = 1;
7877 return true;
7878 }
7879 }
7880
Jamie Madill5b772312018-03-08 20:28:32 -05007881 if (getClientVersion() < Version(3, 1))
7882 {
7883 return false;
7884 }
7885
7886 switch (pname)
7887 {
7888 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7889 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7890 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7891 case GL_MAX_FRAMEBUFFER_WIDTH:
7892 case GL_MAX_FRAMEBUFFER_HEIGHT:
7893 case GL_MAX_FRAMEBUFFER_SAMPLES:
7894 case GL_MAX_SAMPLE_MASK_WORDS:
7895 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7896 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7897 case GL_MAX_INTEGER_SAMPLES:
7898 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7899 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7900 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7901 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7902 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7903 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7904 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7905 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7906 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7907 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7908 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7909 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7910 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7911 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7912 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7913 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7914 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7915 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7916 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7917 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7918 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7919 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7920 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7921 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7922 case GL_MAX_UNIFORM_LOCATIONS:
7923 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7924 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7925 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7926 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7927 case GL_MAX_IMAGE_UNITS:
7928 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7929 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7930 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7931 case GL_SHADER_STORAGE_BUFFER_BINDING:
7932 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7933 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007934 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007935 *type = GL_INT;
7936 *numParams = 1;
7937 return true;
7938 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7939 *type = GL_INT_64_ANGLEX;
7940 *numParams = 1;
7941 return true;
7942 case GL_SAMPLE_MASK:
7943 *type = GL_BOOL;
7944 *numParams = 1;
7945 return true;
7946 }
7947
7948 if (getExtensions().geometryShader)
7949 {
7950 switch (pname)
7951 {
7952 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7953 case GL_LAYER_PROVOKING_VERTEX_EXT:
7954 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7955 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7956 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7957 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7958 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7959 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7960 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7961 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7962 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7963 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7964 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7965 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7966 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7967 *type = GL_INT;
7968 *numParams = 1;
7969 return true;
7970 }
7971 }
7972
7973 return false;
7974}
7975
7976bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7977{
7978 if (getClientVersion() < Version(3, 0))
7979 {
7980 return false;
7981 }
7982
7983 switch (target)
7984 {
7985 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7986 case GL_UNIFORM_BUFFER_BINDING:
7987 {
7988 *type = GL_INT;
7989 *numParams = 1;
7990 return true;
7991 }
7992 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7993 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7994 case GL_UNIFORM_BUFFER_START:
7995 case GL_UNIFORM_BUFFER_SIZE:
7996 {
7997 *type = GL_INT_64_ANGLEX;
7998 *numParams = 1;
7999 return true;
8000 }
8001 }
8002
8003 if (getClientVersion() < Version(3, 1))
8004 {
8005 return false;
8006 }
8007
8008 switch (target)
8009 {
8010 case GL_IMAGE_BINDING_LAYERED:
8011 {
8012 *type = GL_BOOL;
8013 *numParams = 1;
8014 return true;
8015 }
8016 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
8017 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
8018 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
8019 case GL_SHADER_STORAGE_BUFFER_BINDING:
8020 case GL_VERTEX_BINDING_BUFFER:
8021 case GL_VERTEX_BINDING_DIVISOR:
8022 case GL_VERTEX_BINDING_OFFSET:
8023 case GL_VERTEX_BINDING_STRIDE:
8024 case GL_SAMPLE_MASK_VALUE:
8025 case GL_IMAGE_BINDING_NAME:
8026 case GL_IMAGE_BINDING_LEVEL:
8027 case GL_IMAGE_BINDING_LAYER:
8028 case GL_IMAGE_BINDING_ACCESS:
8029 case GL_IMAGE_BINDING_FORMAT:
8030 {
8031 *type = GL_INT;
8032 *numParams = 1;
8033 return true;
8034 }
8035 case GL_ATOMIC_COUNTER_BUFFER_START:
8036 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
8037 case GL_SHADER_STORAGE_BUFFER_START:
8038 case GL_SHADER_STORAGE_BUFFER_SIZE:
8039 {
8040 *type = GL_INT_64_ANGLEX;
8041 *numParams = 1;
8042 return true;
8043 }
8044 }
8045
8046 return false;
8047}
8048
Jamie Madill44a6fbf2018-10-02 13:38:56 -04008049Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05008050{
8051 return mState.mShaderPrograms->getProgram(handle);
8052}
8053
8054Shader *Context::getShader(GLuint handle) const
8055{
8056 return mState.mShaderPrograms->getShader(handle);
8057}
8058
Jamie Madill5b772312018-03-08 20:28:32 -05008059bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
8060{
8061 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
8062}
8063
8064bool Context::isFramebufferGenerated(GLuint framebuffer) const
8065{
8066 return mState.mFramebuffers->isHandleGenerated(framebuffer);
8067}
8068
8069bool Context::isProgramPipelineGenerated(GLuint pipeline) const
8070{
8071 return mState.mPipelines->isHandleGenerated(pipeline);
8072}
8073
8074bool Context::usingDisplayTextureShareGroup() const
8075{
8076 return mDisplayTextureShareGroup;
8077}
8078
8079GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
8080{
8081 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
8082 internalformat == GL_DEPTH_STENCIL
8083 ? GL_DEPTH24_STENCIL8
8084 : internalformat;
8085}
8086
jchen1082af6202018-06-22 10:59:52 +08008087void Context::maxShaderCompilerThreads(GLuint count)
8088{
jchen107ae70d82018-07-06 13:47:01 +08008089 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08008090 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08008091 // A count of zero specifies a request for no parallel compiling or linking.
8092 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
8093 {
8094 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
8095 }
8096 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08008097}
8098
Jamie Madill2eb65032018-07-30 10:25:57 -04008099bool Context::isGLES1() const
8100{
8101 return mState.getClientVersion() < Version(2, 0);
8102}
8103
Jamie Madilla11819d2018-07-30 10:26:01 -04008104void Context::onSubjectStateChange(const Context *context,
8105 angle::SubjectIndex index,
8106 angle::SubjectMessage message)
8107{
Jamie Madilla11819d2018-07-30 10:26:01 -04008108 switch (index)
8109 {
8110 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008111 switch (message)
8112 {
8113 case angle::SubjectMessage::CONTENTS_CHANGED:
8114 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
8115 mStateCache.onVertexArrayBufferContentsChange(this);
8116 break;
8117 case angle::SubjectMessage::RESOURCE_MAPPED:
8118 case angle::SubjectMessage::RESOURCE_UNMAPPED:
8119 case angle::SubjectMessage::BINDING_CHANGED:
8120 mStateCache.onVertexArrayBufferStateChange(this);
8121 break;
8122 default:
8123 break;
8124 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008125 break;
8126
8127 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008128 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8129 {
8130 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
8131 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008132 break;
8133
8134 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008135 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8136 {
8137 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
8138 }
8139 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04008140 break;
8141
8142 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04008143 if (index < kTextureMaxSubjectIndex)
8144 {
8145 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04008146 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008147 }
Jamie Madille25b8002018-09-20 13:39:49 -04008148 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04008149 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04008150 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04008151 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008152 }
Jamie Madille25b8002018-09-20 13:39:49 -04008153 else
8154 {
8155 ASSERT(index < kSamplerMaxSubjectIndex);
8156 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
8157 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008158 break;
8159 }
8160}
8161
Jamie Madill6b873dd2018-07-12 23:56:30 -04008162// ErrorSet implementation.
8163ErrorSet::ErrorSet(Context *context) : mContext(context)
8164{
8165}
8166
8167ErrorSet::~ErrorSet() = default;
8168
Jamie Madill306b6c12018-07-27 08:12:49 -04008169void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04008170{
8171 // This internal enum is used to filter internal errors that are already handled.
8172 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
8173 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
8174 {
8175 return;
8176 }
8177
8178 if (ANGLE_UNLIKELY(error.isError()))
8179 {
8180 GLenum code = error.getCode();
8181 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04008182
Jamie Madill6b873dd2018-07-12 23:56:30 -04008183 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8184 {
8185 mContext->markContextLost();
8186 }
8187
8188 ASSERT(!error.getMessage().empty());
8189 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8190 error.getID(), GL_DEBUG_SEVERITY_HIGH,
8191 error.getMessage());
8192 }
8193}
8194
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008195void ErrorSet::handleError(GLenum errorCode,
8196 const char *message,
8197 const char *file,
8198 const char *function,
8199 unsigned int line)
8200{
8201 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
8202 std::stringstream errorStream;
8203 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
8204 << function << ":" << line << ". " << message;
8205
8206 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
8207}
8208
Jamie Madilla139f012018-10-10 16:13:03 -04008209void ErrorSet::validationError(GLenum errorCode, const char *message)
8210{
8211 handleError(gl::Error(errorCode, message));
8212}
8213
Jamie Madill6b873dd2018-07-12 23:56:30 -04008214bool ErrorSet::empty() const
8215{
8216 return mErrors.empty();
8217}
8218
8219GLenum ErrorSet::popError()
8220{
8221 ASSERT(!empty());
8222 GLenum error = *mErrors.begin();
8223 mErrors.erase(mErrors.begin());
8224 return error;
8225}
Jamie Madilldc358af2018-07-31 11:22:13 -04008226
8227// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008228StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008229 : mCachedHasAnyEnabledClientAttrib(false),
8230 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008231 mCachedInstancedVertexElementLimit(0),
8232 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008233{
8234}
8235
8236StateCache::~StateCache() = default;
8237
Jamie Madillac66f982018-10-09 18:30:01 -04008238void StateCache::initialize(Context *context)
8239{
8240 updateValidDrawModes(context);
8241 updateValidBindTextureTypes(context);
8242}
8243
Jamie Madilldc358af2018-07-31 11:22:13 -04008244void StateCache::updateActiveAttribsMask(Context *context)
8245{
8246 bool isGLES1 = context->isGLES1();
8247 const State &glState = context->getGLState();
8248
8249 if (!isGLES1 && !glState.getProgram())
8250 {
8251 mCachedActiveBufferedAttribsMask = AttributesMask();
8252 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008253 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008254 return;
8255 }
8256
8257 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8258 : glState.getProgram()->getActiveAttribLocationsMask();
8259
8260 const VertexArray *vao = glState.getVertexArray();
8261 ASSERT(vao);
8262
8263 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8264 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008265 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008266
Jamie Madill0a17e482018-08-31 17:19:11 -04008267 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8268 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008269 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008270 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8271}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008272
8273void StateCache::updateVertexElementLimits(Context *context)
8274{
8275 const VertexArray *vao = context->getGLState().getVertexArray();
8276
8277 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8278 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8279
8280 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8281 // If there are no buffered attributes then we should not limit the draw call count.
8282 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8283 {
8284 return;
8285 }
8286
8287 const auto &vertexAttribs = vao->getVertexAttributes();
8288 const auto &vertexBindings = vao->getVertexBindings();
8289
8290 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8291 {
8292 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8293 ASSERT(attrib.enabled);
8294
8295 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8296 ASSERT(context->isGLES1() ||
8297 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8298
8299 GLint64 limit = attrib.getCachedElementLimit();
8300 if (binding.getDivisor() > 0)
8301 {
8302 mCachedInstancedVertexElementLimit =
8303 std::min(mCachedInstancedVertexElementLimit, limit);
8304 }
8305 else
8306 {
8307 mCachedNonInstancedVertexElementLimit =
8308 std::min(mCachedNonInstancedVertexElementLimit, limit);
8309 }
8310 }
8311}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008312
Jamie Madilld84b6732018-09-06 15:54:35 -04008313void StateCache::updateBasicDrawStatesError()
8314{
8315 mCachedBasicDrawStatesError = kInvalidPointer;
8316}
8317
8318intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8319{
8320 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8321 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8322 return mCachedBasicDrawStatesError;
8323}
8324
Jamie Madillc43cdad2018-08-08 15:49:25 -04008325void StateCache::onVertexArrayBindingChange(Context *context)
8326{
8327 updateActiveAttribsMask(context);
8328 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008329 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008330}
8331
8332void StateCache::onProgramExecutableChange(Context *context)
8333{
8334 updateActiveAttribsMask(context);
8335 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008336 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008337 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008338}
8339
Jamie Madilld84b6732018-09-06 15:54:35 -04008340void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008341{
8342 updateVertexElementLimits(context);
8343}
8344
Jamie Madilld84b6732018-09-06 15:54:35 -04008345void StateCache::onVertexArrayBufferContentsChange(Context *context)
8346{
8347 updateVertexElementLimits(context);
8348 updateBasicDrawStatesError();
8349}
8350
Jamie Madillc43cdad2018-08-08 15:49:25 -04008351void StateCache::onVertexArrayStateChange(Context *context)
8352{
8353 updateActiveAttribsMask(context);
8354 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008355 updateBasicDrawStatesError();
8356}
8357
8358void StateCache::onVertexArrayBufferStateChange(Context *context)
8359{
8360 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008361}
8362
8363void StateCache::onGLES1ClientStateChange(Context *context)
8364{
8365 updateActiveAttribsMask(context);
8366}
Jamie Madilld84b6732018-09-06 15:54:35 -04008367
8368void StateCache::onDrawFramebufferChange(Context *context)
8369{
8370 updateBasicDrawStatesError();
8371}
8372
8373void StateCache::onContextCapChange(Context *context)
8374{
8375 updateBasicDrawStatesError();
8376}
8377
8378void StateCache::onStencilStateChange(Context *context)
8379{
8380 updateBasicDrawStatesError();
8381}
8382
8383void StateCache::onDefaultVertexAttributeChange(Context *context)
8384{
8385 updateBasicDrawStatesError();
8386}
8387
8388void StateCache::onActiveTextureChange(Context *context)
8389{
8390 updateBasicDrawStatesError();
8391}
8392
8393void StateCache::onQueryChange(Context *context)
8394{
8395 updateBasicDrawStatesError();
8396}
8397
8398void StateCache::onTransformFeedbackChange(Context *context)
8399{
8400 updateBasicDrawStatesError();
8401}
8402
8403void StateCache::onUniformBufferStateChange(Context *context)
8404{
8405 updateBasicDrawStatesError();
8406}
8407
8408void StateCache::onBufferBindingChange(Context *context)
8409{
8410 updateBasicDrawStatesError();
8411}
Jamie Madill526a6f62018-09-12 11:03:05 -04008412
8413void StateCache::updateValidDrawModes(Context *context)
8414{
8415 Program *program = context->getGLState().getProgram();
8416 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8417 {
8418 mCachedValidDrawModes = {{
8419 true, /* Points */
8420 true, /* Lines */
8421 true, /* LineLoop */
8422 true, /* LineStrip */
8423 true, /* Triangles */
8424 true, /* TriangleStrip */
8425 true, /* TriangleFan */
8426 false, /* LinesAdjacency */
8427 false, /* LineStripAdjacency */
8428 false, /* TrianglesAdjacency */
8429 false, /* TriangleStripAdjacency */
8430 false, /* InvalidEnum */
8431 }};
8432 }
8433 else
8434 {
8435 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8436
8437 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8438
8439 mCachedValidDrawModes = {{
8440 gsMode == PrimitiveMode::Points, /* Points */
8441 gsMode == PrimitiveMode::Lines, /* Lines */
8442 gsMode == PrimitiveMode::Lines, /* LineLoop */
8443 gsMode == PrimitiveMode::Lines, /* LineStrip */
8444 gsMode == PrimitiveMode::Triangles, /* Triangles */
8445 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8446 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8447 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8448 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8449 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8450 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8451 false, /* InvalidEnum */
8452 }};
8453 }
8454}
Jamie Madillac66f982018-10-09 18:30:01 -04008455
8456void StateCache::updateValidBindTextureTypes(Context *context)
8457{
8458 const Extensions &exts = context->getExtensions();
8459 bool isGLES3 = context->getClientMajorVersion() >= 3;
8460 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8461
8462 mCachedValidBindTextureTypes = {{
8463 true, /* _2D */
8464 isGLES3, /* _2DArray */
Yizhou Jiang7818a852018-09-06 15:02:04 +08008465 isGLES31 || exts.textureMultisample, /* _2DMultisample */
Jamie Madillac66f982018-10-09 18:30:01 -04008466 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8467 isGLES3, /* _3D */
8468 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8469 exts.textureRectangle, /* Rectangle */
8470 true, /* CubeMap */
8471 false, /* InvalidEnum */
8472
8473 }};
8474}
Jamie Madillc29968b2016-01-20 11:17:23 -05008475} // namespace gl