blob: 58a9c8a6f7b9bf13c6b9bcc2f0bbcb129c5091ba [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 ANGLE_TRY(releaseSurface(display));
554
Corentin Wallez80b24112015-08-25 16:41:57 -0400555 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000556 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400557 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000558 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400559 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000560
Corentin Wallez80b24112015-08-25 16:41:57 -0400561 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000562 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400563 if (query.second != nullptr)
564 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400565 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400566 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000567 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400568 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000569
Corentin Wallez80b24112015-08-25 16:41:57 -0400570 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400571 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400572 if (vertexArray.second)
573 {
574 vertexArray.second->onDestroy(this);
575 }
Jamie Madill57a89722013-07-02 11:57:03 -0400576 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400577 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400578
Corentin Wallez80b24112015-08-25 16:41:57 -0400579 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500580 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500581 if (transformFeedback.second != nullptr)
582 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500583 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500584 }
Geoff Langc8058452014-02-03 12:04:11 -0500585 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400586 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500587
Jamie Madill5b772312018-03-08 20:28:32 -0500588 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400589 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800590 if (zeroTexture.get() != nullptr)
591 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400592 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800593 zeroTexture.set(this, nullptr);
594 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400595 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000596
Jamie Madill2f348d22017-06-05 10:50:59 -0400597 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500598
Jamie Madill4928b7c2017-06-20 12:57:39 -0400599 mGLState.reset(this);
600
Jamie Madill6c1f6712017-02-14 19:08:04 -0500601 mState.mBuffers->release(this);
602 mState.mShaderPrograms->release(this);
603 mState.mTextures->release(this);
604 mState.mRenderbuffers->release(this);
605 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400606 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500607 mState.mPaths->release(this);
608 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800609 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400610
jchen107ae70d82018-07-06 13:47:01 +0800611 mThreadPool.reset();
612
Jamie Madill76e471e2017-10-21 09:56:01 -0400613 mImplementation->onDestroy(this);
614
Jamie Madill4928b7c2017-06-20 12:57:39 -0400615 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000616}
617
Jamie Madill70ee0f62017-02-06 16:04:20 -0500618Context::~Context()
619{
620}
621
Geoff Lang75359662018-04-11 01:42:27 -0400622void Context::setLabel(EGLLabelKHR label)
623{
624 mLabel = label;
625}
626
627EGLLabelKHR Context::getLabel() const
628{
629 return mLabel;
630}
631
Jamie Madill4928b7c2017-06-20 12:57:39 -0400632egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000633{
Jamie Madill61e16b42017-06-19 11:13:23 -0400634 mCurrentDisplay = display;
635
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000636 if (!mHasBeenCurrent)
637 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400638 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000639 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500640 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400641 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000642
Corentin Wallezc295e512017-01-27 17:47:50 -0500643 int width = 0;
644 int height = 0;
645 if (surface != nullptr)
646 {
647 width = surface->getWidth();
648 height = surface->getHeight();
649 }
650
651 mGLState.setViewportParams(0, 0, width, height);
652 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000653
654 mHasBeenCurrent = true;
655 }
656
Jamie Madill1b94d432015-08-07 13:23:23 -0400657 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700658 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400659 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400660
Jamie Madill4928b7c2017-06-20 12:57:39 -0400661 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500662
663 Framebuffer *newDefault = nullptr;
664 if (surface != nullptr)
665 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400666 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500667 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400668 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500669 }
670 else
671 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400672 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500673 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000674
Corentin Wallez37c39792015-08-20 14:19:46 -0400675 // Update default framebuffer, the binding of the previous default
676 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400677 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400678 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700679 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400680 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400681 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400682 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700683 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400684 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400685 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400686 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400687 }
Ian Ewell292f0052016-02-04 10:37:32 -0500688
Jamie Madill32643ce2018-10-19 11:38:03 -0400689 // Notify the renderer of a context switch.
690 // TODO(jmadill): Fix this error handling. http://anglebug.com/2491
691 (void)(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400692 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000693}
694
Jamie Madill4928b7c2017-06-20 12:57:39 -0400695egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400696{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400697 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400698
Geoff Langbf7b95d2018-05-01 16:48:21 -0400699 // Remove the default framebuffer
700 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500701 {
702 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400703 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500704 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400705
706 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500707 {
708 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400709 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500710 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400711
712 if (defaultFramebuffer)
713 {
714 defaultFramebuffer->onDestroy(this);
715 delete defaultFramebuffer;
716 }
717
Corentin Wallezc295e512017-01-27 17:47:50 -0500718 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
719
720 if (mCurrentSurface)
721 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400722 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500723 mCurrentSurface = nullptr;
724 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400725
726 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400727}
728
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000729GLuint Context::createBuffer()
730{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500731 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000732}
733
734GLuint Context::createProgram()
735{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500736 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000737}
738
Jiawei Shao385b3e02018-03-21 09:43:28 +0800739GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000740{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500741 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000742}
743
744GLuint Context::createTexture()
745{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500746 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000747}
748
749GLuint Context::createRenderbuffer()
750{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500751 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000752}
753
Jamie Madill13951342018-09-30 15:24:28 -0400754void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
755{
756 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
757}
758
Brandon Jones59770802018-04-02 13:18:42 -0700759GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300760{
Jamie Madill13951342018-09-30 15:24:28 -0400761 GLuint created = 0;
762 tryGenPaths(range, &created);
763 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300764}
765
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000766// Returns an unused framebuffer name
767GLuint Context::createFramebuffer()
768{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500769 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000770}
771
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500772void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000773{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500774 for (int i = 0; i < n; i++)
775 {
776 GLuint handle = mFenceNVHandleAllocator.allocate();
777 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
778 fences[i] = handle;
779 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000780}
781
Yunchao Hea336b902017-08-02 16:05:21 +0800782GLuint Context::createProgramPipeline()
783{
784 return mState.mPipelines->createProgramPipeline();
785}
786
Jiawei Shao385b3e02018-03-21 09:43:28 +0800787GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800788{
789 UNIMPLEMENTED();
790 return 0u;
791}
792
James Darpinian4d9d4832018-03-13 12:43:28 -0700793void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000794{
James Darpinian4d9d4832018-03-13 12:43:28 -0700795 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
796 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000797 {
798 detachBuffer(buffer);
799 }
Jamie Madill893ab082014-05-16 16:56:10 -0400800
James Darpinian4d9d4832018-03-13 12:43:28 -0700801 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000802}
803
804void Context::deleteShader(GLuint shader)
805{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500806 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000807}
808
809void Context::deleteProgram(GLuint program)
810{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500811 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000812}
813
814void Context::deleteTexture(GLuint texture)
815{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500816 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000817 {
818 detachTexture(texture);
819 }
820
Jamie Madill6c1f6712017-02-14 19:08:04 -0500821 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000822}
823
824void Context::deleteRenderbuffer(GLuint renderbuffer)
825{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500826 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000827 {
828 detachRenderbuffer(renderbuffer);
829 }
Jamie Madill893ab082014-05-16 16:56:10 -0400830
Jamie Madill6c1f6712017-02-14 19:08:04 -0500831 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000832}
833
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400834void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400835{
836 // The spec specifies the underlying Fence object is not deleted until all current
837 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
838 // and since our API is currently designed for being called from a single thread, we can delete
839 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400840 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400841}
842
Yunchao Hea336b902017-08-02 16:05:21 +0800843void Context::deleteProgramPipeline(GLuint pipeline)
844{
845 if (mState.mPipelines->getProgramPipeline(pipeline))
846 {
847 detachProgramPipeline(pipeline);
848 }
849
850 mState.mPipelines->deleteObject(this, pipeline);
851}
852
Sami Väisänene45e53b2016-05-25 10:36:04 +0300853void Context::deletePaths(GLuint first, GLsizei range)
854{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500855 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300856}
857
Brandon Jones59770802018-04-02 13:18:42 -0700858bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300859{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500860 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300861 if (pathObj == nullptr)
862 return false;
863
864 return pathObj->hasPathData();
865}
866
Brandon Jones59770802018-04-02 13:18:42 -0700867bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300868{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500869 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300870}
871
Brandon Jones59770802018-04-02 13:18:42 -0700872void Context::pathCommands(GLuint path,
873 GLsizei numCommands,
874 const GLubyte *commands,
875 GLsizei numCoords,
876 GLenum coordType,
877 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300878{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500879 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300880
881 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
882}
883
Jamie Madill007530e2017-12-28 14:27:04 -0500884void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300885{
Jamie Madill007530e2017-12-28 14:27:04 -0500886 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300887
888 switch (pname)
889 {
890 case GL_PATH_STROKE_WIDTH_CHROMIUM:
891 pathObj->setStrokeWidth(value);
892 break;
893 case GL_PATH_END_CAPS_CHROMIUM:
894 pathObj->setEndCaps(static_cast<GLenum>(value));
895 break;
896 case GL_PATH_JOIN_STYLE_CHROMIUM:
897 pathObj->setJoinStyle(static_cast<GLenum>(value));
898 break;
899 case GL_PATH_MITER_LIMIT_CHROMIUM:
900 pathObj->setMiterLimit(value);
901 break;
902 case GL_PATH_STROKE_BOUND_CHROMIUM:
903 pathObj->setStrokeBound(value);
904 break;
905 default:
906 UNREACHABLE();
907 break;
908 }
909}
910
Jamie Madill007530e2017-12-28 14:27:04 -0500911void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300912{
Jamie Madill007530e2017-12-28 14:27:04 -0500913 // TODO(jmadill): Should use proper clamping/casting.
914 pathParameterf(path, pname, static_cast<GLfloat>(value));
915}
916
917void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
918{
919 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300920
921 switch (pname)
922 {
923 case GL_PATH_STROKE_WIDTH_CHROMIUM:
924 *value = pathObj->getStrokeWidth();
925 break;
926 case GL_PATH_END_CAPS_CHROMIUM:
927 *value = static_cast<GLfloat>(pathObj->getEndCaps());
928 break;
929 case GL_PATH_JOIN_STYLE_CHROMIUM:
930 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
931 break;
932 case GL_PATH_MITER_LIMIT_CHROMIUM:
933 *value = pathObj->getMiterLimit();
934 break;
935 case GL_PATH_STROKE_BOUND_CHROMIUM:
936 *value = pathObj->getStrokeBound();
937 break;
938 default:
939 UNREACHABLE();
940 break;
941 }
942}
943
Jamie Madill007530e2017-12-28 14:27:04 -0500944void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
945{
946 GLfloat val = 0.0f;
947 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
948 if (value)
949 *value = static_cast<GLint>(val);
950}
951
Brandon Jones59770802018-04-02 13:18:42 -0700952void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300953{
954 mGLState.setPathStencilFunc(func, ref, mask);
955}
956
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000957void Context::deleteFramebuffer(GLuint framebuffer)
958{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500959 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000960 {
961 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000962 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500963
Jamie Madill6c1f6712017-02-14 19:08:04 -0500964 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000965}
966
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500967void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000968{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500969 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000970 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500971 GLuint fence = fences[i];
972
973 FenceNV *fenceObject = nullptr;
974 if (mFenceNVMap.erase(fence, &fenceObject))
975 {
976 mFenceNVHandleAllocator.release(fence);
977 delete fenceObject;
978 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000979 }
980}
981
Geoff Lang70d0f492015-12-10 17:45:46 -0500982Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000983{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500984 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000985}
986
Geoff Lang70d0f492015-12-10 17:45:46 -0500987Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000988{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500989 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000990}
991
Jamie Madill70b5bb02017-08-28 13:32:37 -0400992Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400993{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400994 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400995}
996
Jamie Madill57a89722013-07-02 11:57:03 -0400997VertexArray *Context::getVertexArray(GLuint handle) const
998{
Jamie Madill96a483b2017-06-27 16:49:21 -0400999 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -04001000}
1001
Jamie Madilldc356042013-07-19 16:36:57 -04001002Sampler *Context::getSampler(GLuint handle) const
1003{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001004 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001005}
1006
Geoff Langc8058452014-02-03 12:04:11 -05001007TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1008{
Jamie Madill96a483b2017-06-27 16:49:21 -04001009 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001010}
1011
Yunchao Hea336b902017-08-02 16:05:21 +08001012ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1013{
1014 return mState.mPipelines->getProgramPipeline(handle);
1015}
1016
Geoff Lang75359662018-04-11 01:42:27 -04001017gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001018{
1019 switch (identifier)
1020 {
1021 case GL_BUFFER:
1022 return getBuffer(name);
1023 case GL_SHADER:
1024 return getShader(name);
1025 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001026 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001027 case GL_VERTEX_ARRAY:
1028 return getVertexArray(name);
1029 case GL_QUERY:
1030 return getQuery(name);
1031 case GL_TRANSFORM_FEEDBACK:
1032 return getTransformFeedback(name);
1033 case GL_SAMPLER:
1034 return getSampler(name);
1035 case GL_TEXTURE:
1036 return getTexture(name);
1037 case GL_RENDERBUFFER:
1038 return getRenderbuffer(name);
1039 case GL_FRAMEBUFFER:
1040 return getFramebuffer(name);
1041 default:
1042 UNREACHABLE();
1043 return nullptr;
1044 }
1045}
1046
Geoff Lang75359662018-04-11 01:42:27 -04001047gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001048{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001049 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001050}
1051
Martin Radev9d901792016-07-15 15:58:58 +03001052void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1053{
Geoff Lang75359662018-04-11 01:42:27 -04001054 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001055 ASSERT(object != nullptr);
1056
1057 std::string labelName = GetObjectLabelFromPointer(length, label);
1058 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001059
1060 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1061 // specified object is active until we do this.
1062 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001063}
1064
1065void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1066{
Geoff Lang75359662018-04-11 01:42:27 -04001067 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001068 ASSERT(object != nullptr);
1069
1070 std::string labelName = GetObjectLabelFromPointer(length, label);
1071 object->setLabel(labelName);
1072}
1073
1074void Context::getObjectLabel(GLenum identifier,
1075 GLuint name,
1076 GLsizei bufSize,
1077 GLsizei *length,
1078 GLchar *label) const
1079{
Geoff Lang75359662018-04-11 01:42:27 -04001080 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001081 ASSERT(object != nullptr);
1082
1083 const std::string &objectLabel = object->getLabel();
1084 GetObjectLabelBase(objectLabel, bufSize, length, label);
1085}
1086
1087void Context::getObjectPtrLabel(const void *ptr,
1088 GLsizei bufSize,
1089 GLsizei *length,
1090 GLchar *label) const
1091{
Geoff Lang75359662018-04-11 01:42:27 -04001092 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001093 ASSERT(object != nullptr);
1094
1095 const std::string &objectLabel = object->getLabel();
1096 GetObjectLabelBase(objectLabel, bufSize, length, label);
1097}
1098
Jamie Madilldc356042013-07-19 16:36:57 -04001099bool Context::isSampler(GLuint samplerName) const
1100{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001101 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001102}
1103
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001104void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001105{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001106 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001107
Jamie Madilldedd7b92014-11-05 16:30:36 -05001108 if (handle == 0)
1109 {
1110 texture = mZeroTextures[target].get();
1111 }
1112 else
1113 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001114 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001115 }
1116
1117 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001118 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001119 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001120}
1121
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001122void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001123{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001124 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1125 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001126 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001127 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001128}
1129
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001130void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001131{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001132 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1133 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001134 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001135 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001136 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001137}
1138
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001139void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001140{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001141 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001142 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001143 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001144 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001145}
1146
Shao80957d92017-02-20 21:25:59 +08001147void Context::bindVertexBuffer(GLuint bindingIndex,
1148 GLuint bufferHandle,
1149 GLintptr offset,
1150 GLsizei stride)
1151{
1152 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001153 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001154 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001155}
1156
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001157void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001158{
Geoff Lang76b10c92014-09-05 16:28:14 -04001159 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001160 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001161 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001162 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001163 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001164}
1165
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001166void Context::bindImageTexture(GLuint unit,
1167 GLuint texture,
1168 GLint level,
1169 GLboolean layered,
1170 GLint layer,
1171 GLenum access,
1172 GLenum format)
1173{
1174 Texture *tex = mState.mTextures->getTexture(texture);
1175 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1176}
1177
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001178void Context::useProgram(GLuint program)
1179{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001180 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001181 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001182}
1183
Jiajia Qin5451d532017-11-16 17:16:34 +08001184void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1185{
1186 UNIMPLEMENTED();
1187}
1188
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001189void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001190{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001191 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001192 TransformFeedback *transformFeedback =
1193 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001194 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001195 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001196}
1197
Yunchao Hea336b902017-08-02 16:05:21 +08001198void Context::bindProgramPipeline(GLuint pipelineHandle)
1199{
1200 ProgramPipeline *pipeline =
1201 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1202 mGLState.setProgramPipelineBinding(this, pipeline);
1203}
1204
Corentin Wallezad3ae902018-03-09 13:40:42 -05001205void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001206{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001207 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001208 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001209
Geoff Lang5aad9672014-09-08 11:10:42 -04001210 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001211 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001212
1213 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001214 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001215 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001216}
1217
Corentin Wallezad3ae902018-03-09 13:40:42 -05001218void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001219{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001220 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001221 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001222
Jamie Madill5188a272018-07-25 10:53:56 -04001223 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001224
Geoff Lang5aad9672014-09-08 11:10:42 -04001225 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001226 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001227 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001228}
1229
Corentin Wallezad3ae902018-03-09 13:40:42 -05001230void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001231{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001232 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001233
1234 Query *queryObject = getQuery(id, true, target);
1235 ASSERT(queryObject);
1236
Jamie Madill5188a272018-07-25 10:53:56 -04001237 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001238}
1239
Corentin Wallezad3ae902018-03-09 13:40:42 -05001240void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001241{
1242 switch (pname)
1243 {
1244 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001245 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001246 break;
1247 case GL_QUERY_COUNTER_BITS_EXT:
1248 switch (target)
1249 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001250 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001251 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1252 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001253 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001254 params[0] = getExtensions().queryCounterBitsTimestamp;
1255 break;
1256 default:
1257 UNREACHABLE();
1258 params[0] = 0;
1259 break;
1260 }
1261 break;
1262 default:
1263 UNREACHABLE();
1264 return;
1265 }
1266}
1267
Corentin Wallezad3ae902018-03-09 13:40:42 -05001268void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001269 GLenum pname,
1270 GLsizei bufSize,
1271 GLsizei *length,
1272 GLint *params)
1273{
1274 getQueryiv(target, pname, params);
1275}
1276
Geoff Lang2186c382016-10-14 10:54:54 -04001277void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001278{
Jamie Madill5188a272018-07-25 10:53:56 -04001279 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001280}
1281
Brandon Jones59770802018-04-02 13:18:42 -07001282void Context::getQueryObjectivRobust(GLuint id,
1283 GLenum pname,
1284 GLsizei bufSize,
1285 GLsizei *length,
1286 GLint *params)
1287{
1288 getQueryObjectiv(id, pname, params);
1289}
1290
Geoff Lang2186c382016-10-14 10:54:54 -04001291void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001292{
Jamie Madill5188a272018-07-25 10:53:56 -04001293 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001294}
1295
Brandon Jones59770802018-04-02 13:18:42 -07001296void Context::getQueryObjectuivRobust(GLuint id,
1297 GLenum pname,
1298 GLsizei bufSize,
1299 GLsizei *length,
1300 GLuint *params)
1301{
1302 getQueryObjectuiv(id, pname, params);
1303}
1304
Geoff Lang2186c382016-10-14 10:54:54 -04001305void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001306{
Jamie Madill5188a272018-07-25 10:53:56 -04001307 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001308}
1309
Brandon Jones59770802018-04-02 13:18:42 -07001310void Context::getQueryObjecti64vRobust(GLuint id,
1311 GLenum pname,
1312 GLsizei bufSize,
1313 GLsizei *length,
1314 GLint64 *params)
1315{
1316 getQueryObjecti64v(id, pname, params);
1317}
1318
Geoff Lang2186c382016-10-14 10:54:54 -04001319void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001320{
Jamie Madill5188a272018-07-25 10:53:56 -04001321 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001322}
1323
Brandon Jones59770802018-04-02 13:18:42 -07001324void Context::getQueryObjectui64vRobust(GLuint id,
1325 GLenum pname,
1326 GLsizei bufSize,
1327 GLsizei *length,
1328 GLuint64 *params)
1329{
1330 getQueryObjectui64v(id, pname, params);
1331}
1332
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001333Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001334{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001335 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001336}
1337
Jamie Madill2f348d22017-06-05 10:50:59 -04001338FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001339{
Jamie Madill96a483b2017-06-27 16:49:21 -04001340 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001341}
1342
Corentin Wallezad3ae902018-03-09 13:40:42 -05001343Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001344{
Jamie Madill96a483b2017-06-27 16:49:21 -04001345 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001346 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001347 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001348 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001349
1350 Query *query = mQueryMap.query(handle);
1351 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001352 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001353 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001354 query = new Query(mImplementation->createQuery(type), handle);
1355 query->addRef();
1356 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001357 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001358 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001359}
1360
Geoff Lang70d0f492015-12-10 17:45:46 -05001361Query *Context::getQuery(GLuint handle) const
1362{
Jamie Madill96a483b2017-06-27 16:49:21 -04001363 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001364}
1365
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001366Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001367{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001368 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1369 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001370}
1371
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001372Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001373{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001374 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001375}
1376
Geoff Lang492a7e42014-11-05 13:27:06 -05001377Compiler *Context::getCompiler() const
1378{
Jamie Madill2f348d22017-06-05 10:50:59 -04001379 if (mCompiler.get() == nullptr)
1380 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001381 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001382 }
1383 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001384}
1385
Jamie Madillc1d770e2017-04-13 17:31:24 -04001386void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001387{
1388 switch (pname)
1389 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001390 case GL_SHADER_COMPILER:
1391 *params = GL_TRUE;
1392 break;
1393 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1394 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1395 break;
1396 default:
1397 mGLState.getBooleanv(pname, params);
1398 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001399 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001400}
1401
Jamie Madillc1d770e2017-04-13 17:31:24 -04001402void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001403{
Shannon Woods53a94a82014-06-24 15:20:36 -04001404 // Queries about context capabilities and maximums are answered by Context.
1405 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001406 switch (pname)
1407 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001408 case GL_ALIASED_LINE_WIDTH_RANGE:
1409 params[0] = mCaps.minAliasedLineWidth;
1410 params[1] = mCaps.maxAliasedLineWidth;
1411 break;
1412 case GL_ALIASED_POINT_SIZE_RANGE:
1413 params[0] = mCaps.minAliasedPointSize;
1414 params[1] = mCaps.maxAliasedPointSize;
1415 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001416 case GL_SMOOTH_POINT_SIZE_RANGE:
1417 params[0] = mCaps.minSmoothPointSize;
1418 params[1] = mCaps.maxSmoothPointSize;
1419 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001420 case GL_SMOOTH_LINE_WIDTH_RANGE:
1421 params[0] = mCaps.minSmoothLineWidth;
1422 params[1] = mCaps.maxSmoothLineWidth;
1423 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001424 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1425 ASSERT(mExtensions.textureFilterAnisotropic);
1426 *params = mExtensions.maxTextureAnisotropy;
1427 break;
1428 case GL_MAX_TEXTURE_LOD_BIAS:
1429 *params = mCaps.maxLODBias;
1430 break;
1431
1432 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1433 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1434 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001435 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1436 // GLES1 constants for modelview/projection matrix.
1437 if (getClientVersion() < Version(2, 0))
1438 {
1439 mGLState.getFloatv(pname, params);
1440 }
1441 else
1442 {
1443 ASSERT(mExtensions.pathRendering);
1444 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1445 memcpy(params, m, 16 * sizeof(GLfloat));
1446 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001447 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001448 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001449
Jamie Madill231c7f52017-04-26 13:45:37 -04001450 default:
1451 mGLState.getFloatv(pname, params);
1452 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001453 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001454}
1455
Jamie Madillc1d770e2017-04-13 17:31:24 -04001456void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001457{
Shannon Woods53a94a82014-06-24 15:20:36 -04001458 // Queries about context capabilities and maximums are answered by Context.
1459 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001460
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001461 switch (pname)
1462 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001463 case GL_MAX_VERTEX_ATTRIBS:
1464 *params = mCaps.maxVertexAttributes;
1465 break;
1466 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1467 *params = mCaps.maxVertexUniformVectors;
1468 break;
1469 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001470 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001471 break;
1472 case GL_MAX_VARYING_VECTORS:
1473 *params = mCaps.maxVaryingVectors;
1474 break;
1475 case GL_MAX_VARYING_COMPONENTS:
1476 *params = mCaps.maxVertexOutputComponents;
1477 break;
1478 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1479 *params = mCaps.maxCombinedTextureImageUnits;
1480 break;
1481 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001482 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001483 break;
1484 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001485 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001486 break;
1487 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1488 *params = mCaps.maxFragmentUniformVectors;
1489 break;
1490 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001491 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001492 break;
1493 case GL_MAX_RENDERBUFFER_SIZE:
1494 *params = mCaps.maxRenderbufferSize;
1495 break;
1496 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1497 *params = mCaps.maxColorAttachments;
1498 break;
1499 case GL_MAX_DRAW_BUFFERS_EXT:
1500 *params = mCaps.maxDrawBuffers;
1501 break;
1502 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1503 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1504 case GL_SUBPIXEL_BITS:
1505 *params = 4;
1506 break;
1507 case GL_MAX_TEXTURE_SIZE:
1508 *params = mCaps.max2DTextureSize;
1509 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001510 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1511 *params = mCaps.maxRectangleTextureSize;
1512 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001513 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1514 *params = mCaps.maxCubeMapTextureSize;
1515 break;
1516 case GL_MAX_3D_TEXTURE_SIZE:
1517 *params = mCaps.max3DTextureSize;
1518 break;
1519 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1520 *params = mCaps.maxArrayTextureLayers;
1521 break;
1522 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1523 *params = mCaps.uniformBufferOffsetAlignment;
1524 break;
1525 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1526 *params = mCaps.maxUniformBufferBindings;
1527 break;
1528 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001529 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001530 break;
1531 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001532 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001533 break;
1534 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1535 *params = mCaps.maxCombinedTextureImageUnits;
1536 break;
1537 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1538 *params = mCaps.maxVertexOutputComponents;
1539 break;
1540 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1541 *params = mCaps.maxFragmentInputComponents;
1542 break;
1543 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1544 *params = mCaps.minProgramTexelOffset;
1545 break;
1546 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1547 *params = mCaps.maxProgramTexelOffset;
1548 break;
1549 case GL_MAJOR_VERSION:
1550 *params = getClientVersion().major;
1551 break;
1552 case GL_MINOR_VERSION:
1553 *params = getClientVersion().minor;
1554 break;
1555 case GL_MAX_ELEMENTS_INDICES:
1556 *params = mCaps.maxElementsIndices;
1557 break;
1558 case GL_MAX_ELEMENTS_VERTICES:
1559 *params = mCaps.maxElementsVertices;
1560 break;
1561 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1562 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1563 break;
1564 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1565 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1566 break;
1567 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1568 *params = mCaps.maxTransformFeedbackSeparateComponents;
1569 break;
1570 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1571 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1572 break;
1573 case GL_MAX_SAMPLES_ANGLE:
1574 *params = mCaps.maxSamples;
1575 break;
1576 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001577 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001578 params[0] = mCaps.maxViewportWidth;
1579 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001580 }
1581 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001582 case GL_COMPRESSED_TEXTURE_FORMATS:
1583 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1584 params);
1585 break;
1586 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1587 *params = mResetStrategy;
1588 break;
1589 case GL_NUM_SHADER_BINARY_FORMATS:
1590 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1591 break;
1592 case GL_SHADER_BINARY_FORMATS:
1593 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1594 break;
1595 case GL_NUM_PROGRAM_BINARY_FORMATS:
1596 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1597 break;
1598 case GL_PROGRAM_BINARY_FORMATS:
1599 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1600 break;
1601 case GL_NUM_EXTENSIONS:
1602 *params = static_cast<GLint>(mExtensionStrings.size());
1603 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001604
Geoff Lang38f24ee2018-10-01 13:04:59 -04001605 // GL_ANGLE_request_extension
1606 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1607 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1608 break;
1609
Jamie Madill231c7f52017-04-26 13:45:37 -04001610 // GL_KHR_debug
1611 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1612 *params = mExtensions.maxDebugMessageLength;
1613 break;
1614 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1615 *params = mExtensions.maxDebugLoggedMessages;
1616 break;
1617 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1618 *params = mExtensions.maxDebugGroupStackDepth;
1619 break;
1620 case GL_MAX_LABEL_LENGTH:
1621 *params = mExtensions.maxLabelLength;
1622 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001623
Martin Radeve5285d22017-07-14 16:23:53 +03001624 // GL_ANGLE_multiview
1625 case GL_MAX_VIEWS_ANGLE:
1626 *params = mExtensions.maxViews;
1627 break;
1628
Jamie Madill231c7f52017-04-26 13:45:37 -04001629 // GL_EXT_disjoint_timer_query
1630 case GL_GPU_DISJOINT_EXT:
1631 *params = mImplementation->getGPUDisjoint();
1632 break;
1633 case GL_MAX_FRAMEBUFFER_WIDTH:
1634 *params = mCaps.maxFramebufferWidth;
1635 break;
1636 case GL_MAX_FRAMEBUFFER_HEIGHT:
1637 *params = mCaps.maxFramebufferHeight;
1638 break;
1639 case GL_MAX_FRAMEBUFFER_SAMPLES:
1640 *params = mCaps.maxFramebufferSamples;
1641 break;
1642 case GL_MAX_SAMPLE_MASK_WORDS:
1643 *params = mCaps.maxSampleMaskWords;
1644 break;
1645 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1646 *params = mCaps.maxColorTextureSamples;
1647 break;
1648 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1649 *params = mCaps.maxDepthTextureSamples;
1650 break;
1651 case GL_MAX_INTEGER_SAMPLES:
1652 *params = mCaps.maxIntegerSamples;
1653 break;
1654 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1655 *params = mCaps.maxVertexAttribRelativeOffset;
1656 break;
1657 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1658 *params = mCaps.maxVertexAttribBindings;
1659 break;
1660 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1661 *params = mCaps.maxVertexAttribStride;
1662 break;
1663 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001664 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001665 break;
1666 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001667 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001668 break;
1669 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001670 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001671 break;
1672 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001673 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001674 break;
1675 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001676 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001677 break;
1678 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001679 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001680 break;
1681 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001682 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001683 break;
1684 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001685 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001686 break;
1687 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1688 *params = mCaps.minProgramTextureGatherOffset;
1689 break;
1690 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1691 *params = mCaps.maxProgramTextureGatherOffset;
1692 break;
1693 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1694 *params = mCaps.maxComputeWorkGroupInvocations;
1695 break;
1696 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001697 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001698 break;
1699 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001700 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001701 break;
1702 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1703 *params = mCaps.maxComputeSharedMemorySize;
1704 break;
1705 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001706 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001707 break;
1708 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001709 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001710 break;
1711 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001712 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001713 break;
1714 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001715 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001716 break;
1717 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001718 *params =
1719 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001720 break;
1721 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001722 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001723 break;
1724 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1725 *params = mCaps.maxCombinedShaderOutputResources;
1726 break;
1727 case GL_MAX_UNIFORM_LOCATIONS:
1728 *params = mCaps.maxUniformLocations;
1729 break;
1730 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1731 *params = mCaps.maxAtomicCounterBufferBindings;
1732 break;
1733 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1734 *params = mCaps.maxAtomicCounterBufferSize;
1735 break;
1736 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1737 *params = mCaps.maxCombinedAtomicCounterBuffers;
1738 break;
1739 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1740 *params = mCaps.maxCombinedAtomicCounters;
1741 break;
1742 case GL_MAX_IMAGE_UNITS:
1743 *params = mCaps.maxImageUnits;
1744 break;
1745 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1746 *params = mCaps.maxCombinedImageUniforms;
1747 break;
1748 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1749 *params = mCaps.maxShaderStorageBufferBindings;
1750 break;
1751 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1752 *params = mCaps.maxCombinedShaderStorageBlocks;
1753 break;
1754 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1755 *params = mCaps.shaderStorageBufferOffsetAlignment;
1756 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001757
1758 // GL_EXT_geometry_shader
1759 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1760 *params = mCaps.maxFramebufferLayers;
1761 break;
1762 case GL_LAYER_PROVOKING_VERTEX_EXT:
1763 *params = mCaps.layerProvokingVertex;
1764 break;
1765 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001766 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001767 break;
1768 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001769 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001770 break;
1771 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001772 *params =
1773 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001774 break;
1775 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1776 *params = mCaps.maxGeometryInputComponents;
1777 break;
1778 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1779 *params = mCaps.maxGeometryOutputComponents;
1780 break;
1781 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1782 *params = mCaps.maxGeometryOutputVertices;
1783 break;
1784 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1785 *params = mCaps.maxGeometryTotalOutputComponents;
1786 break;
1787 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1788 *params = mCaps.maxGeometryShaderInvocations;
1789 break;
1790 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001791 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001792 break;
1793 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001794 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001795 break;
1796 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001797 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001798 break;
1799 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001800 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001801 break;
1802 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001803 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001804 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001805 // GLES1 emulation: Caps queries
1806 case GL_MAX_TEXTURE_UNITS:
1807 *params = mCaps.maxMultitextureUnits;
1808 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001809 case GL_MAX_MODELVIEW_STACK_DEPTH:
1810 *params = mCaps.maxModelviewMatrixStackDepth;
1811 break;
1812 case GL_MAX_PROJECTION_STACK_DEPTH:
1813 *params = mCaps.maxProjectionMatrixStackDepth;
1814 break;
1815 case GL_MAX_TEXTURE_STACK_DEPTH:
1816 *params = mCaps.maxTextureMatrixStackDepth;
1817 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001818 case GL_MAX_LIGHTS:
1819 *params = mCaps.maxLights;
1820 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001821 case GL_MAX_CLIP_PLANES:
1822 *params = mCaps.maxClipPlanes;
1823 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001824 // GLES1 emulation: Vertex attribute queries
1825 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1826 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1827 case GL_COLOR_ARRAY_BUFFER_BINDING:
1828 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1829 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1830 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1831 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1832 break;
1833 case GL_VERTEX_ARRAY_STRIDE:
1834 case GL_NORMAL_ARRAY_STRIDE:
1835 case GL_COLOR_ARRAY_STRIDE:
1836 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1837 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1838 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1839 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1840 break;
1841 case GL_VERTEX_ARRAY_SIZE:
1842 case GL_COLOR_ARRAY_SIZE:
1843 case GL_TEXTURE_COORD_ARRAY_SIZE:
1844 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1845 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1846 break;
1847 case GL_VERTEX_ARRAY_TYPE:
1848 case GL_COLOR_ARRAY_TYPE:
1849 case GL_NORMAL_ARRAY_TYPE:
1850 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1851 case GL_TEXTURE_COORD_ARRAY_TYPE:
1852 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1853 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1854 break;
1855
jchen1082af6202018-06-22 10:59:52 +08001856 // GL_KHR_parallel_shader_compile
1857 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1858 *params = mGLState.getMaxShaderCompilerThreads();
1859 break;
1860
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001861 // GL_EXT_blend_func_extended
1862 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1863 *params = mExtensions.maxDualSourceDrawBuffers;
1864 break;
1865
Jamie Madill231c7f52017-04-26 13:45:37 -04001866 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001867 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001868 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001869 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001870}
1871
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001872void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001873{
Shannon Woods53a94a82014-06-24 15:20:36 -04001874 // Queries about context capabilities and maximums are answered by Context.
1875 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001876 switch (pname)
1877 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001878 case GL_MAX_ELEMENT_INDEX:
1879 *params = mCaps.maxElementIndex;
1880 break;
1881 case GL_MAX_UNIFORM_BLOCK_SIZE:
1882 *params = mCaps.maxUniformBlockSize;
1883 break;
1884 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001885 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001886 break;
1887 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001888 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001889 break;
1890 case GL_MAX_SERVER_WAIT_TIMEOUT:
1891 *params = mCaps.maxServerWaitTimeout;
1892 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001893
Jamie Madill231c7f52017-04-26 13:45:37 -04001894 // GL_EXT_disjoint_timer_query
1895 case GL_TIMESTAMP_EXT:
1896 *params = mImplementation->getTimestamp();
1897 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001898
Jamie Madill231c7f52017-04-26 13:45:37 -04001899 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1900 *params = mCaps.maxShaderStorageBlockSize;
1901 break;
1902 default:
1903 UNREACHABLE();
1904 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001905 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001906}
1907
Geoff Lang70d0f492015-12-10 17:45:46 -05001908void Context::getPointerv(GLenum pname, void **params) const
1909{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001910 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001911}
1912
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001913void Context::getPointervRobustANGLERobust(GLenum pname,
1914 GLsizei bufSize,
1915 GLsizei *length,
1916 void **params)
1917{
1918 UNIMPLEMENTED();
1919}
1920
Martin Radev66fb8202016-07-28 11:45:20 +03001921void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001922{
Shannon Woods53a94a82014-06-24 15:20:36 -04001923 // Queries about context capabilities and maximums are answered by Context.
1924 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001925
1926 GLenum nativeType;
1927 unsigned int numParams;
1928 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1929 ASSERT(queryStatus);
1930
1931 if (nativeType == GL_INT)
1932 {
1933 switch (target)
1934 {
1935 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1936 ASSERT(index < 3u);
1937 *data = mCaps.maxComputeWorkGroupCount[index];
1938 break;
1939 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1940 ASSERT(index < 3u);
1941 *data = mCaps.maxComputeWorkGroupSize[index];
1942 break;
1943 default:
1944 mGLState.getIntegeri_v(target, index, data);
1945 }
1946 }
1947 else
1948 {
1949 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1950 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001951}
1952
Brandon Jones59770802018-04-02 13:18:42 -07001953void Context::getIntegeri_vRobust(GLenum target,
1954 GLuint index,
1955 GLsizei bufSize,
1956 GLsizei *length,
1957 GLint *data)
1958{
1959 getIntegeri_v(target, index, data);
1960}
1961
Martin Radev66fb8202016-07-28 11:45:20 +03001962void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001963{
Shannon Woods53a94a82014-06-24 15:20:36 -04001964 // Queries about context capabilities and maximums are answered by Context.
1965 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001966
1967 GLenum nativeType;
1968 unsigned int numParams;
1969 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1970 ASSERT(queryStatus);
1971
1972 if (nativeType == GL_INT_64_ANGLEX)
1973 {
1974 mGLState.getInteger64i_v(target, index, data);
1975 }
1976 else
1977 {
1978 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1979 }
1980}
1981
Brandon Jones59770802018-04-02 13:18:42 -07001982void Context::getInteger64i_vRobust(GLenum target,
1983 GLuint index,
1984 GLsizei bufSize,
1985 GLsizei *length,
1986 GLint64 *data)
1987{
1988 getInteger64i_v(target, index, data);
1989}
1990
Martin Radev66fb8202016-07-28 11:45:20 +03001991void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1992{
1993 // Queries about context capabilities and maximums are answered by Context.
1994 // Queries about current GL state values are answered by State.
1995
1996 GLenum nativeType;
1997 unsigned int numParams;
1998 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1999 ASSERT(queryStatus);
2000
2001 if (nativeType == GL_BOOL)
2002 {
2003 mGLState.getBooleani_v(target, index, data);
2004 }
2005 else
2006 {
2007 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2008 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002009}
2010
Brandon Jones59770802018-04-02 13:18:42 -07002011void Context::getBooleani_vRobust(GLenum target,
2012 GLuint index,
2013 GLsizei bufSize,
2014 GLsizei *length,
2015 GLboolean *data)
2016{
2017 getBooleani_v(target, index, data);
2018}
2019
Corentin Wallez336129f2017-10-17 15:55:40 -04002020void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002021{
2022 Buffer *buffer = mGLState.getTargetBuffer(target);
2023 QueryBufferParameteriv(buffer, pname, params);
2024}
2025
Brandon Jones59770802018-04-02 13:18:42 -07002026void Context::getBufferParameterivRobust(BufferBinding target,
2027 GLenum pname,
2028 GLsizei bufSize,
2029 GLsizei *length,
2030 GLint *params)
2031{
2032 getBufferParameteriv(target, pname, params);
2033}
2034
He Yunchao010e4db2017-03-03 14:22:06 +08002035void Context::getFramebufferAttachmentParameteriv(GLenum target,
2036 GLenum attachment,
2037 GLenum pname,
2038 GLint *params)
2039{
2040 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002041 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002042}
2043
Brandon Jones59770802018-04-02 13:18:42 -07002044void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2045 GLenum attachment,
2046 GLenum pname,
2047 GLsizei bufSize,
2048 GLsizei *length,
2049 GLint *params)
2050{
2051 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2052}
2053
He Yunchao010e4db2017-03-03 14:22:06 +08002054void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2055{
2056 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2057 QueryRenderbufferiv(this, renderbuffer, pname, params);
2058}
2059
Brandon Jones59770802018-04-02 13:18:42 -07002060void Context::getRenderbufferParameterivRobust(GLenum target,
2061 GLenum pname,
2062 GLsizei bufSize,
2063 GLsizei *length,
2064 GLint *params)
2065{
2066 getRenderbufferParameteriv(target, pname, params);
2067}
2068
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002069void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002070{
Till Rathmannb8543632018-10-02 19:46:14 +02002071 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002072 QueryTexParameterfv(texture, pname, params);
2073}
2074
Brandon Jones59770802018-04-02 13:18:42 -07002075void Context::getTexParameterfvRobust(TextureType target,
2076 GLenum pname,
2077 GLsizei bufSize,
2078 GLsizei *length,
2079 GLfloat *params)
2080{
2081 getTexParameterfv(target, pname, params);
2082}
2083
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002084void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002085{
Till Rathmannb8543632018-10-02 19:46:14 +02002086 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002087 QueryTexParameteriv(texture, pname, params);
2088}
Jiajia Qin5451d532017-11-16 17:16:34 +08002089
Till Rathmannb8543632018-10-02 19:46:14 +02002090void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2091{
2092 const Texture *const texture = getTargetTexture(target);
2093 QueryTexParameterIiv(texture, pname, params);
2094}
2095
2096void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2097{
2098 const Texture *const texture = getTargetTexture(target);
2099 QueryTexParameterIuiv(texture, pname, params);
2100}
2101
Brandon Jones59770802018-04-02 13:18:42 -07002102void Context::getTexParameterivRobust(TextureType target,
2103 GLenum pname,
2104 GLsizei bufSize,
2105 GLsizei *length,
2106 GLint *params)
2107{
2108 getTexParameteriv(target, pname, params);
2109}
2110
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002111void Context::getTexParameterIivRobust(TextureType target,
2112 GLenum pname,
2113 GLsizei bufSize,
2114 GLsizei *length,
2115 GLint *params)
2116{
2117 UNIMPLEMENTED();
2118}
2119
2120void Context::getTexParameterIuivRobust(TextureType target,
2121 GLenum pname,
2122 GLsizei bufSize,
2123 GLsizei *length,
2124 GLuint *params)
2125{
2126 UNIMPLEMENTED();
2127}
2128
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002129void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002130{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002131 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002132 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002133}
2134
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002135void Context::getTexLevelParameterivRobust(TextureTarget target,
2136 GLint level,
2137 GLenum pname,
2138 GLsizei bufSize,
2139 GLsizei *length,
2140 GLint *params)
2141{
2142 UNIMPLEMENTED();
2143}
2144
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002145void Context::getTexLevelParameterfv(TextureTarget target,
2146 GLint level,
2147 GLenum pname,
2148 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002149{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002150 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002151 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002152}
2153
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002154void Context::getTexLevelParameterfvRobust(TextureTarget target,
2155 GLint level,
2156 GLenum pname,
2157 GLsizei bufSize,
2158 GLsizei *length,
2159 GLfloat *params)
2160{
2161 UNIMPLEMENTED();
2162}
2163
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002164void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002165{
Till Rathmannb8543632018-10-02 19:46:14 +02002166 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002167 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002168 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002169}
2170
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002171void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002172{
Till Rathmannb8543632018-10-02 19:46:14 +02002173 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002174 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002175 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002176}
2177
Brandon Jones59770802018-04-02 13:18:42 -07002178void Context::texParameterfvRobust(TextureType target,
2179 GLenum pname,
2180 GLsizei bufSize,
2181 const GLfloat *params)
2182{
2183 texParameterfv(target, pname, params);
2184}
2185
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002186void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002187{
Till Rathmannb8543632018-10-02 19:46:14 +02002188 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002189 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002190 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002191}
2192
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002193void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002194{
Till Rathmannb8543632018-10-02 19:46:14 +02002195 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002196 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002197 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002198}
2199
Till Rathmannb8543632018-10-02 19:46:14 +02002200void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2201{
2202 Texture *const texture = getTargetTexture(target);
2203 SetTexParameterIiv(this, texture, pname, params);
2204 onTextureChange(texture);
2205}
2206
2207void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2208{
2209 Texture *const texture = getTargetTexture(target);
2210 SetTexParameterIuiv(this, texture, pname, params);
2211 onTextureChange(texture);
2212}
2213
Brandon Jones59770802018-04-02 13:18:42 -07002214void Context::texParameterivRobust(TextureType target,
2215 GLenum pname,
2216 GLsizei bufSize,
2217 const GLint *params)
2218{
2219 texParameteriv(target, pname, params);
2220}
2221
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002222void Context::texParameterIivRobust(TextureType target,
2223 GLenum pname,
2224 GLsizei bufSize,
2225 const GLint *params)
2226{
2227 UNIMPLEMENTED();
2228}
2229
2230void Context::texParameterIuivRobust(TextureType target,
2231 GLenum pname,
2232 GLsizei bufSize,
2233 const GLuint *params)
2234{
2235 UNIMPLEMENTED();
2236}
2237
Jamie Madill493f9572018-05-24 19:52:15 -04002238void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002239{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002240 // No-op if count draws no primitives for given mode
2241 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002242 {
2243 return;
2244 }
2245
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002246 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002247 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002248 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002249}
2250
Jamie Madill493f9572018-05-24 19:52:15 -04002251void Context::drawArraysInstanced(PrimitiveMode mode,
2252 GLint first,
2253 GLsizei count,
2254 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002255{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002256 // No-op if count draws no primitives for given mode
2257 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002258 {
2259 return;
2260 }
2261
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002262 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002263 ANGLE_CONTEXT_TRY(
2264 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002265 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2266 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002267}
2268
Jamie Madill493f9572018-05-24 19:52:15 -04002269void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002270{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002271 // No-op if count draws no primitives for given mode
2272 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002273 {
2274 return;
2275 }
2276
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002277 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002278 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002279}
2280
Jamie Madill493f9572018-05-24 19:52:15 -04002281void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002282 GLsizei count,
2283 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002284 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002285 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002286{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002287 // No-op if count draws no primitives for given mode
2288 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002289 {
2290 return;
2291 }
2292
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002293 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002294 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002295 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002296}
2297
Jamie Madill493f9572018-05-24 19:52:15 -04002298void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002299 GLuint start,
2300 GLuint end,
2301 GLsizei count,
2302 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002303 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002304{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002305 // No-op if count draws no primitives for given mode
2306 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002307 {
2308 return;
2309 }
2310
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002311 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002312 ANGLE_CONTEXT_TRY(
2313 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002314}
2315
Jamie Madill493f9572018-05-24 19:52:15 -04002316void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002317{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002318 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002319 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002320}
2321
Jamie Madill493f9572018-05-24 19:52:15 -04002322void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002323{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002324 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002325 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002326}
2327
Jamie Madill675fe712016-12-19 13:07:54 -05002328void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002329{
Jamie Madillafa02a22017-11-23 12:57:38 -05002330 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002331}
2332
Jamie Madill675fe712016-12-19 13:07:54 -05002333void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002334{
Jamie Madillafa02a22017-11-23 12:57:38 -05002335 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002336}
2337
Austin Kinross6ee1e782015-05-29 17:05:37 -07002338void Context::insertEventMarker(GLsizei length, const char *marker)
2339{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002340 ASSERT(mImplementation);
2341 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002342}
2343
2344void Context::pushGroupMarker(GLsizei length, const char *marker)
2345{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002346 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002347
2348 if (marker == nullptr)
2349 {
2350 // From the EXT_debug_marker spec,
2351 // "If <marker> is null then an empty string is pushed on the stack."
2352 mImplementation->pushGroupMarker(length, "");
2353 }
2354 else
2355 {
2356 mImplementation->pushGroupMarker(length, marker);
2357 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002358}
2359
2360void Context::popGroupMarker()
2361{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002362 ASSERT(mImplementation);
2363 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002364}
2365
Geoff Langd8605522016-04-13 10:19:12 -04002366void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2367{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002368 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002369 ASSERT(programObject);
2370
2371 programObject->bindUniformLocation(location, name);
2372}
2373
Brandon Jones59770802018-04-02 13:18:42 -07002374void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002375{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002376 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002377}
2378
Brandon Jones59770802018-04-02 13:18:42 -07002379void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002380{
2381 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2382}
2383
Brandon Jones59770802018-04-02 13:18:42 -07002384void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002385{
2386 GLfloat I[16];
2387 angle::Matrix<GLfloat>::setToIdentity(I);
2388
2389 mGLState.loadPathRenderingMatrix(matrixMode, I);
2390}
2391
2392void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2393{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002394 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002395 if (!pathObj)
2396 return;
2397
Geoff Lang9bf86f02018-07-26 11:46:34 -04002398 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002399
2400 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2401}
2402
2403void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2404{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002405 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002406 if (!pathObj)
2407 return;
2408
Geoff Lang9bf86f02018-07-26 11:46:34 -04002409 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002410
2411 mImplementation->stencilStrokePath(pathObj, reference, mask);
2412}
2413
2414void Context::coverFillPath(GLuint path, GLenum coverMode)
2415{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002416 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002417 if (!pathObj)
2418 return;
2419
Geoff Lang9bf86f02018-07-26 11:46:34 -04002420 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002421
2422 mImplementation->coverFillPath(pathObj, coverMode);
2423}
2424
2425void Context::coverStrokePath(GLuint path, GLenum coverMode)
2426{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002427 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002428 if (!pathObj)
2429 return;
2430
Geoff Lang9bf86f02018-07-26 11:46:34 -04002431 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002432
2433 mImplementation->coverStrokePath(pathObj, coverMode);
2434}
2435
2436void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2437{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002438 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002439 if (!pathObj)
2440 return;
2441
Geoff Lang9bf86f02018-07-26 11:46:34 -04002442 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002443
2444 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2445}
2446
2447void Context::stencilThenCoverStrokePath(GLuint path,
2448 GLint reference,
2449 GLuint mask,
2450 GLenum coverMode)
2451{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002452 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002453 if (!pathObj)
2454 return;
2455
Geoff Lang9bf86f02018-07-26 11:46:34 -04002456 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002457
2458 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2459}
2460
Sami Väisänend59ca052016-06-21 16:10:00 +03002461void Context::coverFillPathInstanced(GLsizei numPaths,
2462 GLenum pathNameType,
2463 const void *paths,
2464 GLuint pathBase,
2465 GLenum coverMode,
2466 GLenum transformType,
2467 const GLfloat *transformValues)
2468{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002469 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002470
Geoff Lang9bf86f02018-07-26 11:46:34 -04002471 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002472
2473 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2474}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002475
Sami Väisänend59ca052016-06-21 16:10:00 +03002476void Context::coverStrokePathInstanced(GLsizei numPaths,
2477 GLenum pathNameType,
2478 const void *paths,
2479 GLuint pathBase,
2480 GLenum coverMode,
2481 GLenum transformType,
2482 const GLfloat *transformValues)
2483{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002484 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002485
2486 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002487 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002488
2489 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2490 transformValues);
2491}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002492
Sami Väisänend59ca052016-06-21 16:10:00 +03002493void Context::stencilFillPathInstanced(GLsizei numPaths,
2494 GLenum pathNameType,
2495 const void *paths,
2496 GLuint pathBase,
2497 GLenum fillMode,
2498 GLuint mask,
2499 GLenum transformType,
2500 const GLfloat *transformValues)
2501{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002502 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002503
2504 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002505 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002506
2507 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2508 transformValues);
2509}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002510
Sami Väisänend59ca052016-06-21 16:10:00 +03002511void Context::stencilStrokePathInstanced(GLsizei numPaths,
2512 GLenum pathNameType,
2513 const void *paths,
2514 GLuint pathBase,
2515 GLint reference,
2516 GLuint mask,
2517 GLenum transformType,
2518 const GLfloat *transformValues)
2519{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002520 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002521
Geoff Lang9bf86f02018-07-26 11:46:34 -04002522 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002523
2524 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2525 transformValues);
2526}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002527
Sami Väisänend59ca052016-06-21 16:10:00 +03002528void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2529 GLenum pathNameType,
2530 const void *paths,
2531 GLuint pathBase,
2532 GLenum fillMode,
2533 GLuint mask,
2534 GLenum coverMode,
2535 GLenum transformType,
2536 const GLfloat *transformValues)
2537{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002538 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002539
Geoff Lang9bf86f02018-07-26 11:46:34 -04002540 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002541
2542 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2543 transformType, transformValues);
2544}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002545
Sami Väisänend59ca052016-06-21 16:10:00 +03002546void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2547 GLenum pathNameType,
2548 const void *paths,
2549 GLuint pathBase,
2550 GLint reference,
2551 GLuint mask,
2552 GLenum coverMode,
2553 GLenum transformType,
2554 const GLfloat *transformValues)
2555{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002556 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002557
Geoff Lang9bf86f02018-07-26 11:46:34 -04002558 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002559
2560 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2561 transformType, transformValues);
2562}
2563
Sami Väisänen46eaa942016-06-29 10:26:37 +03002564void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2565{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002566 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002567
2568 programObject->bindFragmentInputLocation(location, name);
2569}
2570
2571void Context::programPathFragmentInputGen(GLuint program,
2572 GLint location,
2573 GLenum genMode,
2574 GLint components,
2575 const GLfloat *coeffs)
2576{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002577 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002578
jchen103fd614d2018-08-13 12:21:58 +08002579 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002580}
2581
jchen1015015f72017-03-16 13:54:21 +08002582GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2583{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002584 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002585 return QueryProgramResourceIndex(programObject, programInterface, name);
2586}
2587
jchen10fd7c3b52017-03-21 15:36:03 +08002588void Context::getProgramResourceName(GLuint program,
2589 GLenum programInterface,
2590 GLuint index,
2591 GLsizei bufSize,
2592 GLsizei *length,
2593 GLchar *name)
2594{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002595 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002596 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2597}
2598
jchen10191381f2017-04-11 13:59:04 +08002599GLint Context::getProgramResourceLocation(GLuint program,
2600 GLenum programInterface,
2601 const GLchar *name)
2602{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002603 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002604 return QueryProgramResourceLocation(programObject, programInterface, name);
2605}
2606
jchen10880683b2017-04-12 16:21:55 +08002607void Context::getProgramResourceiv(GLuint program,
2608 GLenum programInterface,
2609 GLuint index,
2610 GLsizei propCount,
2611 const GLenum *props,
2612 GLsizei bufSize,
2613 GLsizei *length,
2614 GLint *params)
2615{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002616 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002617 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2618 length, params);
2619}
2620
jchen10d9cd7b72017-08-30 15:04:25 +08002621void Context::getProgramInterfaceiv(GLuint program,
2622 GLenum programInterface,
2623 GLenum pname,
2624 GLint *params)
2625{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002626 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002627 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2628}
2629
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002630void Context::getProgramInterfaceivRobust(GLuint program,
2631 GLenum programInterface,
2632 GLenum pname,
2633 GLsizei bufSize,
2634 GLsizei *length,
2635 GLint *params)
2636{
2637 UNIMPLEMENTED();
2638}
2639
Jamie Madill306b6c12018-07-27 08:12:49 -04002640void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002641{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002642 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002643}
2644
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002645void Context::handleError(GLenum errorCode,
2646 const char *message,
2647 const char *file,
2648 const char *function,
2649 unsigned int line)
2650{
2651 mErrors.handleError(errorCode, message, file, function, line);
2652}
2653
Jamie Madilla139f012018-10-10 16:13:03 -04002654void Context::validationError(GLenum errorCode, const char *message)
2655{
2656 mErrors.validationError(errorCode, message);
2657}
2658
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002659// Get one of the recorded errors and clear its flag, if any.
2660// [OpenGL ES 2.0.24] section 2.5 page 13.
2661GLenum Context::getError()
2662{
Geoff Langda5777c2014-07-11 09:52:58 -04002663 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002664 {
Geoff Langda5777c2014-07-11 09:52:58 -04002665 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002666 }
Geoff Langda5777c2014-07-11 09:52:58 -04002667 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002668 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002669 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002670 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002671}
2672
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002673// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002674void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002675{
2676 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002677 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002678 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002679 mContextLostForced = true;
2680 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002681 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002682}
2683
Jamie Madillfa920eb2018-01-04 11:45:50 -05002684GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002685{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002686 // Even if the application doesn't want to know about resets, we want to know
2687 // as it will allow us to skip all the calls.
2688 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002689 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002690 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002691 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002692 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002693 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002694
2695 // EXT_robustness, section 2.6: If the reset notification behavior is
2696 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2697 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2698 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002699 }
2700
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002701 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2702 // status should be returned at least once, and GL_NO_ERROR should be returned
2703 // once the device has finished resetting.
2704 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002705 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002706 ASSERT(mResetStatus == GL_NO_ERROR);
2707 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002708
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002709 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002710 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002711 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002712 }
2713 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002714 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002715 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002716 // If markContextLost was used to mark the context lost then
2717 // assume that is not recoverable, and continue to report the
2718 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002719 mResetStatus = mImplementation->getResetStatus();
2720 }
Jamie Madill893ab082014-05-16 16:56:10 -04002721
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002722 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002723}
2724
2725bool Context::isResetNotificationEnabled()
2726{
2727 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2728}
2729
Corentin Walleze3b10e82015-05-20 11:06:25 -04002730const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002731{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002732 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002733}
2734
2735EGLenum Context::getClientType() const
2736{
2737 return mClientType;
2738}
2739
2740EGLenum Context::getRenderBuffer() const
2741{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002742 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2743 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002744 {
2745 return EGL_NONE;
2746 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002747
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002748 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002749 ASSERT(backAttachment != nullptr);
2750 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002751}
2752
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002753VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002754{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002755 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002756 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2757 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002758 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002759 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2760 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002761
Jamie Madill96a483b2017-06-27 16:49:21 -04002762 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002763 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002764
2765 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002766}
2767
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002768TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002769{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002770 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002771 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2772 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002773 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002774 transformFeedback =
2775 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002776 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002777 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002778 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002779
2780 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002781}
2782
2783bool Context::isVertexArrayGenerated(GLuint vertexArray)
2784{
Jamie Madill96a483b2017-06-27 16:49:21 -04002785 ASSERT(mVertexArrayMap.contains(0));
2786 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002787}
2788
2789bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2790{
Jamie Madill96a483b2017-06-27 16:49:21 -04002791 ASSERT(mTransformFeedbackMap.contains(0));
2792 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002793}
2794
Shannon Woods53a94a82014-06-24 15:20:36 -04002795void Context::detachTexture(GLuint texture)
2796{
2797 // Simple pass-through to State's detachTexture method, as textures do not require
2798 // allocation map management either here or in the resource manager at detach time.
2799 // Zero textures are held by the Context, and we don't attempt to request them from
2800 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002801 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002802}
2803
James Darpinian4d9d4832018-03-13 12:43:28 -07002804void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002805{
Yuly Novikov5807a532015-12-03 13:01:22 -05002806 // Simple pass-through to State's detachBuffer method, since
2807 // only buffer attachments to container objects that are bound to the current context
2808 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002809
Yuly Novikov5807a532015-12-03 13:01:22 -05002810 // [OpenGL ES 3.2] section 5.1.2 page 45:
2811 // Attachments to unbound container objects, such as
2812 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2813 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002814 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002815}
2816
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002817void Context::detachFramebuffer(GLuint framebuffer)
2818{
Shannon Woods53a94a82014-06-24 15:20:36 -04002819 // Framebuffer detachment is handled by Context, because 0 is a valid
2820 // Framebuffer object, and a pointer to it must be passed from Context
2821 // to State at binding time.
2822
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002823 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002824 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2825 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2826 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002827
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002828 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002829 {
2830 bindReadFramebuffer(0);
2831 }
2832
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002833 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002834 {
2835 bindDrawFramebuffer(0);
2836 }
2837}
2838
2839void Context::detachRenderbuffer(GLuint renderbuffer)
2840{
Jamie Madilla02315b2017-02-23 14:14:47 -05002841 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002842}
2843
Jamie Madill57a89722013-07-02 11:57:03 -04002844void Context::detachVertexArray(GLuint vertexArray)
2845{
Jamie Madill77a72f62015-04-14 11:18:32 -04002846 // Vertex array detachment is handled by Context, because 0 is a valid
2847 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002848 // binding time.
2849
Jamie Madill57a89722013-07-02 11:57:03 -04002850 // [OpenGL ES 3.0.2] section 2.10 page 43:
2851 // If a vertex array object that is currently bound is deleted, the binding
2852 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002853 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002854 {
2855 bindVertexArray(0);
2856 }
2857}
2858
Geoff Langc8058452014-02-03 12:04:11 -05002859void Context::detachTransformFeedback(GLuint transformFeedback)
2860{
Corentin Walleza2257da2016-04-19 16:43:12 -04002861 // Transform feedback detachment is handled by Context, because 0 is a valid
2862 // transform feedback, and a pointer to it must be passed from Context to State at
2863 // binding time.
2864
2865 // The OpenGL specification doesn't mention what should happen when the currently bound
2866 // transform feedback object is deleted. Since it is a container object, we treat it like
2867 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002868 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002869 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002870 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002871 }
Geoff Langc8058452014-02-03 12:04:11 -05002872}
2873
Jamie Madilldc356042013-07-19 16:36:57 -04002874void Context::detachSampler(GLuint sampler)
2875{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002876 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002877}
2878
Yunchao Hea336b902017-08-02 16:05:21 +08002879void Context::detachProgramPipeline(GLuint pipeline)
2880{
2881 mGLState.detachProgramPipeline(this, pipeline);
2882}
2883
Jamie Madill3ef140a2017-08-26 23:11:21 -04002884void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002885{
Shaodde78e82017-05-22 14:13:27 +08002886 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002887 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002888}
2889
Jamie Madille29d1672013-07-19 16:36:57 -04002890void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2891{
Till Rathmannb8543632018-10-02 19:46:14 +02002892 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002893 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002894 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002895}
Jamie Madille29d1672013-07-19 16:36:57 -04002896
Geoff Langc1984ed2016-10-07 12:41:00 -04002897void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2898{
Till Rathmannb8543632018-10-02 19:46:14 +02002899 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002900 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002901 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002902}
2903
Till Rathmannb8543632018-10-02 19:46:14 +02002904void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2905{
2906 Sampler *const samplerObject =
2907 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2908 SetSamplerParameterIiv(this, samplerObject, pname, param);
2909}
2910
2911void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2912{
2913 Sampler *const samplerObject =
2914 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2915 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2916}
2917
Brandon Jones59770802018-04-02 13:18:42 -07002918void Context::samplerParameterivRobust(GLuint sampler,
2919 GLenum pname,
2920 GLsizei bufSize,
2921 const GLint *param)
2922{
2923 samplerParameteriv(sampler, pname, param);
2924}
2925
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002926void Context::samplerParameterIivRobust(GLuint sampler,
2927 GLenum pname,
2928 GLsizei bufSize,
2929 const GLint *param)
2930{
2931 UNIMPLEMENTED();
2932}
2933
2934void Context::samplerParameterIuivRobust(GLuint sampler,
2935 GLenum pname,
2936 GLsizei bufSize,
2937 const GLuint *param)
2938{
2939 UNIMPLEMENTED();
2940}
2941
Jamie Madille29d1672013-07-19 16:36:57 -04002942void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2943{
Till Rathmannb8543632018-10-02 19:46:14 +02002944 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002945 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002946 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002947}
2948
Geoff Langc1984ed2016-10-07 12:41:00 -04002949void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002950{
Till Rathmannb8543632018-10-02 19:46:14 +02002951 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002952 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002953 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002954}
2955
Brandon Jones59770802018-04-02 13:18:42 -07002956void Context::samplerParameterfvRobust(GLuint sampler,
2957 GLenum pname,
2958 GLsizei bufSize,
2959 const GLfloat *param)
2960{
2961 samplerParameterfv(sampler, pname, param);
2962}
2963
Geoff Langc1984ed2016-10-07 12:41:00 -04002964void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002965{
Till Rathmannb8543632018-10-02 19:46:14 +02002966 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002967 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002968 QuerySamplerParameteriv(samplerObject, pname, params);
2969}
Jamie Madill9675b802013-07-19 16:36:59 -04002970
Till Rathmannb8543632018-10-02 19:46:14 +02002971void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2972{
2973 const Sampler *const samplerObject =
2974 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2975 QuerySamplerParameterIiv(samplerObject, pname, params);
2976}
2977
2978void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2979{
2980 const Sampler *const samplerObject =
2981 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2982 QuerySamplerParameterIuiv(samplerObject, pname, params);
2983}
2984
Brandon Jones59770802018-04-02 13:18:42 -07002985void Context::getSamplerParameterivRobust(GLuint sampler,
2986 GLenum pname,
2987 GLsizei bufSize,
2988 GLsizei *length,
2989 GLint *params)
2990{
2991 getSamplerParameteriv(sampler, pname, params);
2992}
2993
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002994void Context::getSamplerParameterIivRobust(GLuint sampler,
2995 GLenum pname,
2996 GLsizei bufSize,
2997 GLsizei *length,
2998 GLint *params)
2999{
3000 UNIMPLEMENTED();
3001}
3002
3003void Context::getSamplerParameterIuivRobust(GLuint sampler,
3004 GLenum pname,
3005 GLsizei bufSize,
3006 GLsizei *length,
3007 GLuint *params)
3008{
3009 UNIMPLEMENTED();
3010}
3011
Geoff Langc1984ed2016-10-07 12:41:00 -04003012void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
3013{
Till Rathmannb8543632018-10-02 19:46:14 +02003014 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05003015 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04003016 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04003017}
3018
Brandon Jones59770802018-04-02 13:18:42 -07003019void Context::getSamplerParameterfvRobust(GLuint sampler,
3020 GLenum pname,
3021 GLsizei bufSize,
3022 GLsizei *length,
3023 GLfloat *params)
3024{
3025 getSamplerParameterfv(sampler, pname, params);
3026}
3027
Olli Etuahof0fee072016-03-30 15:11:58 +03003028void Context::programParameteri(GLuint program, GLenum pname, GLint value)
3029{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04003030 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08003031 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03003032}
3033
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003034void Context::initRendererString()
3035{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003036 std::ostringstream rendererString;
3037 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003038 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003039 rendererString << ")";
3040
Geoff Langcec35902014-04-16 10:52:36 -04003041 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003042}
3043
Geoff Langc339c4e2016-11-29 10:37:36 -05003044void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003045{
Geoff Langc339c4e2016-11-29 10:37:36 -05003046 const Version &clientVersion = getClientVersion();
3047
3048 std::ostringstream versionString;
3049 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3050 << ANGLE_VERSION_STRING << ")";
3051 mVersionString = MakeStaticString(versionString.str());
3052
3053 std::ostringstream shadingLanguageVersionString;
3054 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3055 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3056 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3057 << ")";
3058 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003059}
3060
Geoff Langcec35902014-04-16 10:52:36 -04003061void Context::initExtensionStrings()
3062{
Geoff Langc339c4e2016-11-29 10:37:36 -05003063 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3064 std::ostringstream combinedStringStream;
3065 std::copy(strings.begin(), strings.end(),
3066 std::ostream_iterator<const char *>(combinedStringStream, " "));
3067 return MakeStaticString(combinedStringStream.str());
3068 };
3069
3070 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003071 for (const auto &extensionString : mExtensions.getStrings())
3072 {
3073 mExtensionStrings.push_back(MakeStaticString(extensionString));
3074 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003075 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003076
Geoff Langc339c4e2016-11-29 10:37:36 -05003077 mRequestableExtensionStrings.clear();
3078 for (const auto &extensionInfo : GetExtensionInfoMap())
3079 {
3080 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003081 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003082 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003083 {
3084 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3085 }
3086 }
3087 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003088}
3089
Geoff Langc339c4e2016-11-29 10:37:36 -05003090const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003091{
Geoff Langc339c4e2016-11-29 10:37:36 -05003092 switch (name)
3093 {
3094 case GL_VENDOR:
3095 return reinterpret_cast<const GLubyte *>("Google Inc.");
3096
3097 case GL_RENDERER:
3098 return reinterpret_cast<const GLubyte *>(mRendererString);
3099
3100 case GL_VERSION:
3101 return reinterpret_cast<const GLubyte *>(mVersionString);
3102
3103 case GL_SHADING_LANGUAGE_VERSION:
3104 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3105
3106 case GL_EXTENSIONS:
3107 return reinterpret_cast<const GLubyte *>(mExtensionString);
3108
3109 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3110 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3111
3112 default:
3113 UNREACHABLE();
3114 return nullptr;
3115 }
Geoff Langcec35902014-04-16 10:52:36 -04003116}
3117
Geoff Langc339c4e2016-11-29 10:37:36 -05003118const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003119{
Geoff Langc339c4e2016-11-29 10:37:36 -05003120 switch (name)
3121 {
3122 case GL_EXTENSIONS:
3123 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3124
3125 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3126 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3127
3128 default:
3129 UNREACHABLE();
3130 return nullptr;
3131 }
Geoff Langcec35902014-04-16 10:52:36 -04003132}
3133
3134size_t Context::getExtensionStringCount() const
3135{
3136 return mExtensionStrings.size();
3137}
3138
Geoff Lang111a99e2017-10-17 10:58:41 -04003139bool Context::isExtensionRequestable(const char *name)
3140{
3141 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3142 auto extension = extensionInfos.find(name);
3143
Geoff Lang111a99e2017-10-17 10:58:41 -04003144 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003145 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003146}
3147
Geoff Langc339c4e2016-11-29 10:37:36 -05003148void Context::requestExtension(const char *name)
3149{
3150 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3151 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3152 const auto &extension = extensionInfos.at(name);
3153 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003154 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003155
3156 if (mExtensions.*(extension.ExtensionsMember))
3157 {
3158 // Extension already enabled
3159 return;
3160 }
3161
3162 mExtensions.*(extension.ExtensionsMember) = true;
3163 updateCaps();
3164 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003165
Jamie Madill2f348d22017-06-05 10:50:59 -04003166 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3167 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003168
Jamie Madill81c2e252017-09-09 23:32:46 -04003169 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3170 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003171 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003172 for (auto &zeroTexture : mZeroTextures)
3173 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003174 if (zeroTexture.get() != nullptr)
3175 {
3176 zeroTexture->signalDirty(this, InitState::Initialized);
3177 }
Geoff Lang9aded172017-04-05 11:07:56 -04003178 }
3179
Jamie Madillb983a4b2018-08-01 11:34:51 -04003180 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003181}
3182
3183size_t Context::getRequestableExtensionStringCount() const
3184{
3185 return mRequestableExtensionStrings.size();
3186}
3187
Jamie Madill493f9572018-05-24 19:52:15 -04003188void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003189{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003190 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003191 ASSERT(transformFeedback != nullptr);
3192 ASSERT(!transformFeedback->isPaused());
3193
Jamie Madill6c1f6712017-02-14 19:08:04 -05003194 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003195 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003196}
3197
3198bool Context::hasActiveTransformFeedback(GLuint program) const
3199{
3200 for (auto pair : mTransformFeedbackMap)
3201 {
3202 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3203 {
3204 return true;
3205 }
3206 }
3207 return false;
3208}
3209
Geoff Lang33f11fb2018-05-07 13:42:47 -04003210Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003211{
3212 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3213
jchen1082af6202018-06-22 10:59:52 +08003214 // Explicitly enable GL_KHR_parallel_shader_compile
3215 supportedExtensions.parallelShaderCompile = true;
3216
Geoff Langb0f917f2017-12-05 13:41:54 -05003217 if (getClientVersion() < ES_2_0)
3218 {
3219 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003220 supportedExtensions.pointSizeArray = true;
3221 supportedExtensions.textureCubeMap = true;
3222 supportedExtensions.pointSprite = true;
3223 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003224 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003225 }
3226
3227 if (getClientVersion() < ES_3_0)
3228 {
3229 // Disable ES3+ extensions
3230 supportedExtensions.colorBufferFloat = false;
3231 supportedExtensions.eglImageExternalEssl3 = false;
3232 supportedExtensions.textureNorm16 = false;
3233 supportedExtensions.multiview = false;
3234 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003235 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003236 supportedExtensions.textureMultisample = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003237 }
3238
3239 if (getClientVersion() < ES_3_1)
3240 {
3241 // Disable ES3.1+ extensions
3242 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003243
3244 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3245 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003246 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003247 }
3248
3249 if (getClientVersion() > ES_2_0)
3250 {
3251 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3252 // supportedExtensions.sRGB = false;
3253 }
3254
3255 // Some extensions are always available because they are implemented in the GL layer.
3256 supportedExtensions.bindUniformLocation = true;
3257 supportedExtensions.vertexArrayObject = true;
3258 supportedExtensions.bindGeneratesResource = true;
3259 supportedExtensions.clientArrays = true;
3260 supportedExtensions.requestExtension = true;
Austin Eng7cf9cd22018-10-09 15:27:32 -07003261 supportedExtensions.multiDraw = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003262
3263 // Enable the no error extension if the context was created with the flag.
3264 supportedExtensions.noError = mSkipValidation;
3265
3266 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003267 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003268
3269 // Explicitly enable GL_KHR_debug
3270 supportedExtensions.debug = true;
3271 supportedExtensions.maxDebugMessageLength = 1024;
3272 supportedExtensions.maxDebugLoggedMessages = 1024;
3273 supportedExtensions.maxDebugGroupStackDepth = 1024;
3274 supportedExtensions.maxLabelLength = 1024;
3275
3276 // Explicitly enable GL_ANGLE_robust_client_memory
3277 supportedExtensions.robustClientMemory = true;
3278
3279 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003280 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003281
3282 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3283 // supports it.
3284 supportedExtensions.robustBufferAccessBehavior =
3285 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3286
3287 // Enable the cache control query unconditionally.
3288 supportedExtensions.programCacheControl = true;
3289
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003290 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003291 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003292 {
3293 // GL_ANGLE_explicit_context_gles1
3294 supportedExtensions.explicitContextGles1 = true;
3295 // GL_ANGLE_explicit_context
3296 supportedExtensions.explicitContext = true;
3297 }
3298
Geoff Lang79b91402018-10-04 15:11:30 -04003299 supportedExtensions.memorySize = true;
3300
Geoff Langb0f917f2017-12-05 13:41:54 -05003301 return supportedExtensions;
3302}
3303
Geoff Lang33f11fb2018-05-07 13:42:47 -04003304void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003305{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003306 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003307
Geoff Lang33f11fb2018-05-07 13:42:47 -04003308 mSupportedExtensions = generateSupportedExtensions();
3309 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003310
3311 mLimitations = mImplementation->getNativeLimitations();
3312
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003313 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3314 if (getClientVersion() < Version(2, 0))
3315 {
3316 mCaps.maxMultitextureUnits = 4;
3317 mCaps.maxClipPlanes = 6;
3318 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003319 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3320 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3321 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003322 mCaps.minSmoothPointSize = 1.0f;
3323 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003324 mCaps.minSmoothLineWidth = 1.0f;
3325 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003326 }
3327
Luc Ferronad2ae932018-06-11 15:31:17 -04003328 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003329 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003330
Luc Ferronad2ae932018-06-11 15:31:17 -04003331 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3332
Jamie Madill0f80ed82017-09-19 00:24:56 -04003333 if (getClientVersion() < ES_3_1)
3334 {
3335 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3336 }
3337 else
3338 {
3339 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3340 }
Geoff Lang301d1612014-07-09 10:34:37 -04003341
Jiawei Shao54aafe52018-04-27 14:54:57 +08003342 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3343 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003344 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3345
Jamie Madill0f80ed82017-09-19 00:24:56 -04003346 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3347 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3348
3349 // Limit textures as well, so we can use fast bitsets with texture bindings.
3350 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003351 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3352 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3353 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3354 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003355
Jiawei Shaodb342272017-09-27 10:21:45 +08003356 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3357
Geoff Langc287ea62016-09-16 14:46:51 -04003358 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003359 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003360 for (const auto &extensionInfo : GetExtensionInfoMap())
3361 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003362 // If the user has requested that extensions start disabled and they are requestable,
3363 // disable them.
3364 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003365 {
3366 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3367 }
3368 }
3369
3370 // Generate texture caps
3371 updateCaps();
3372}
3373
3374void Context::updateCaps()
3375{
Geoff Lang900013c2014-07-07 11:32:19 -04003376 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003377 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003378
Jamie Madill7b62cf92017-11-02 15:20:49 -04003379 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003380 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003381 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003382 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003383
Geoff Lang0d8b7242015-09-09 14:56:53 -04003384 // Update the format caps based on the client version and extensions.
3385 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3386 // ES3.
3387 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003388 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003389 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003390 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003391 formatCaps.textureAttachment =
3392 formatCaps.textureAttachment &&
3393 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3394 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3395 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003396
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003397 // OpenGL ES does not support multisampling with non-rendererable formats
3398 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003399 if (!formatCaps.renderbuffer ||
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003400 (getClientVersion() < ES_3_1 && !mSupportedExtensions.textureMultisample &&
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003401 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003402 {
Geoff Langd87878e2014-09-19 15:42:59 -04003403 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003404 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003405 else
3406 {
3407 // We may have limited the max samples for some required renderbuffer formats due to
3408 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3409 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3410
3411 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3412 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3413 // exception of signed and unsigned integer formats."
3414 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3415 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3416 {
3417 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3418 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3419 }
3420
3421 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003422 if (getClientVersion() >= ES_3_1 || mSupportedExtensions.textureMultisample)
Olli Etuaho50c562d2017-06-06 14:43:30 +03003423 {
3424 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3425 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3426 // the exception that the signed and unsigned integer formats are required only to
3427 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3428 // multisamples, which must be at least one."
3429 if (formatInfo.componentType == GL_INT ||
3430 formatInfo.componentType == GL_UNSIGNED_INT)
3431 {
3432 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3433 }
3434
3435 // GLES 3.1 section 19.3.1.
3436 if (formatCaps.texturable)
3437 {
3438 if (formatInfo.depthBits > 0)
3439 {
3440 mCaps.maxDepthTextureSamples =
3441 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3442 }
3443 else if (formatInfo.redBits > 0)
3444 {
3445 mCaps.maxColorTextureSamples =
3446 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3447 }
3448 }
3449 }
3450 }
Geoff Langd87878e2014-09-19 15:42:59 -04003451
3452 if (formatCaps.texturable && formatInfo.compressed)
3453 {
Geoff Langca271392017-04-05 12:30:00 -04003454 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003455 }
3456
Geoff Langca271392017-04-05 12:30:00 -04003457 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003458 }
Jamie Madill32447362017-06-28 14:53:52 -04003459
3460 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003461 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003462 {
3463 mMemoryProgramCache = nullptr;
3464 }
Corentin Walleze4477002017-12-01 14:39:58 -05003465
3466 // Compute which buffer types are allowed
3467 mValidBufferBindings.reset();
3468 mValidBufferBindings.set(BufferBinding::ElementArray);
3469 mValidBufferBindings.set(BufferBinding::Array);
3470
3471 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3472 {
3473 mValidBufferBindings.set(BufferBinding::PixelPack);
3474 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3475 }
3476
3477 if (getClientVersion() >= ES_3_0)
3478 {
3479 mValidBufferBindings.set(BufferBinding::CopyRead);
3480 mValidBufferBindings.set(BufferBinding::CopyWrite);
3481 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3482 mValidBufferBindings.set(BufferBinding::Uniform);
3483 }
3484
3485 if (getClientVersion() >= ES_3_1)
3486 {
3487 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3488 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3489 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3490 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3491 }
jchen107ae70d82018-07-06 13:47:01 +08003492
3493 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003494
3495 // Reinitialize state cache after extension changes.
3496 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003497}
3498
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003499void Context::initWorkarounds()
3500{
Jamie Madill761b02c2017-06-23 16:27:06 -04003501 // Apply back-end workarounds.
3502 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3503
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003504 // Lose the context upon out of memory error if the application is
3505 // expecting to watch for those events.
3506 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003507
3508 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3509 {
3510 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3511 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3512 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3513 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003514}
3515
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003516// Return true if the draw is a no-op, else return false.
3517// A no-op draw occurs if the count of vertices is less than the minimum required to
3518// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3519bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3520{
3521 return count < kMinimumPrimitiveCounts[mode];
3522}
3523
3524bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3525{
3526 return (instanceCount == 0) || noopDraw(mode, count);
3527}
3528
Jamie Madill6f755b22018-10-09 12:48:54 -04003529angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003530{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003531 if (mGLES1Renderer)
3532 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003533 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003534 }
3535
Geoff Lang9bf86f02018-07-26 11:46:34 -04003536 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003537
3538 if (isRobustResourceInitEnabled())
3539 {
3540 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3541 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3542 }
3543
Geoff Langa8cb2872018-03-09 16:09:40 -05003544 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003545 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003546}
3547
3548Error Context::prepareForClear(GLbitfield mask)
3549{
Geoff Langa8cb2872018-03-09 16:09:40 -05003550 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003551 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003552 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003553 return NoError();
3554}
3555
3556Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3557{
Geoff Langa8cb2872018-03-09 16:09:40 -05003558 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003559 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3560 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003561 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003562 return NoError();
3563}
3564
Geoff Langa8cb2872018-03-09 16:09:40 -05003565Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003566{
Geoff Langa8cb2872018-03-09 16:09:40 -05003567 ANGLE_TRY(syncDirtyObjects(objectMask));
3568 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003569 return NoError();
3570}
3571
Jamie Madill6f755b22018-10-09 12:48:54 -04003572angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003573{
3574 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003575 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003576 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003577 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003578}
3579
Jamie Madill6f755b22018-10-09 12:48:54 -04003580angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003581{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003582 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003583 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003584 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003585 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003586}
Jamie Madillc29968b2016-01-20 11:17:23 -05003587
Jamie Madill6f755b22018-10-09 12:48:54 -04003588angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003589{
3590 return mGLState.syncDirtyObjects(this, objectMask);
3591}
3592
Jamie Madillc29968b2016-01-20 11:17:23 -05003593void Context::blitFramebuffer(GLint srcX0,
3594 GLint srcY0,
3595 GLint srcX1,
3596 GLint srcY1,
3597 GLint dstX0,
3598 GLint dstY0,
3599 GLint dstX1,
3600 GLint dstY1,
3601 GLbitfield mask,
3602 GLenum filter)
3603{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003604 if (mask == 0)
3605 {
3606 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3607 // buffers are copied.
3608 return;
3609 }
3610
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003611 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003612 ASSERT(drawFramebuffer);
3613
3614 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3615 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3616
Jamie Madillbc918e72018-03-08 09:47:21 -05003617 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003618
Jamie Madillc564c072017-06-01 12:45:42 -04003619 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003620}
Jamie Madillc29968b2016-01-20 11:17:23 -05003621
3622void Context::clear(GLbitfield mask)
3623{
Geoff Langd4fff502017-09-22 11:28:28 -04003624 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3625 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003626}
3627
3628void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3629{
Olli Etuaho78df3362018-10-05 16:43:27 +03003630 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3631 const FramebufferAttachment *attachment = nullptr;
3632 if (buffer == GL_DEPTH)
3633 {
3634 attachment = framebufferObject->getDepthbuffer();
3635 }
3636 if (buffer == GL_COLOR &&
3637 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3638 {
3639 attachment = framebufferObject->getColorbuffer(drawbuffer);
3640 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003641 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3642 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003643 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003644 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003645 return;
3646 }
Geoff Langd4fff502017-09-22 11:28:28 -04003647 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003648 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003649}
3650
3651void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3652{
Olli Etuaho78df3362018-10-05 16:43:27 +03003653 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3654 const FramebufferAttachment *attachment = nullptr;
3655 if (buffer == GL_COLOR &&
3656 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3657 {
3658 attachment = framebufferObject->getColorbuffer(drawbuffer);
3659 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003660 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3661 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003662 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003663 {
3664 return;
3665 }
Geoff Langd4fff502017-09-22 11:28:28 -04003666 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003667 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003668}
3669
3670void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3671{
Olli Etuaho78df3362018-10-05 16:43:27 +03003672 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3673 const FramebufferAttachment *attachment = nullptr;
3674 if (buffer == GL_STENCIL)
3675 {
3676 attachment = framebufferObject->getStencilbuffer();
3677 }
3678 if (buffer == GL_COLOR &&
3679 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3680 {
3681 attachment = framebufferObject->getColorbuffer(drawbuffer);
3682 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003683 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3684 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003685 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003686 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003687 return;
3688 }
Geoff Langd4fff502017-09-22 11:28:28 -04003689 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003690 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003691}
3692
3693void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3694{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003695 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003696 ASSERT(framebufferObject);
3697
3698 // If a buffer is not present, the clear has no effect
3699 if (framebufferObject->getDepthbuffer() == nullptr &&
3700 framebufferObject->getStencilbuffer() == nullptr)
3701 {
3702 return;
3703 }
3704
Geoff Langd4fff502017-09-22 11:28:28 -04003705 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3706 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003707}
3708
3709void Context::readPixels(GLint x,
3710 GLint y,
3711 GLsizei width,
3712 GLsizei height,
3713 GLenum format,
3714 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003715 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003716{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003717 if (width == 0 || height == 0)
3718 {
3719 return;
3720 }
3721
Jamie Madillbc918e72018-03-08 09:47:21 -05003722 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003723
Jamie Madillb6664922017-07-25 12:55:04 -04003724 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3725 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003726
3727 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003728 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003729}
3730
Brandon Jones59770802018-04-02 13:18:42 -07003731void Context::readPixelsRobust(GLint x,
3732 GLint y,
3733 GLsizei width,
3734 GLsizei height,
3735 GLenum format,
3736 GLenum type,
3737 GLsizei bufSize,
3738 GLsizei *length,
3739 GLsizei *columns,
3740 GLsizei *rows,
3741 void *pixels)
3742{
3743 readPixels(x, y, width, height, format, type, pixels);
3744}
3745
3746void Context::readnPixelsRobust(GLint x,
3747 GLint y,
3748 GLsizei width,
3749 GLsizei height,
3750 GLenum format,
3751 GLenum type,
3752 GLsizei bufSize,
3753 GLsizei *length,
3754 GLsizei *columns,
3755 GLsizei *rows,
3756 void *data)
3757{
3758 readPixels(x, y, width, height, format, type, data);
3759}
3760
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003761void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003762 GLint level,
3763 GLenum internalformat,
3764 GLint x,
3765 GLint y,
3766 GLsizei width,
3767 GLsizei height,
3768 GLint border)
3769{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003770 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003771 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003772
Jamie Madillc29968b2016-01-20 11:17:23 -05003773 Rectangle sourceArea(x, y, width, height);
3774
Jamie Madill05b35b22017-10-03 09:01:44 -04003775 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003776 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003777 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003778}
3779
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003780void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003781 GLint level,
3782 GLint xoffset,
3783 GLint yoffset,
3784 GLint x,
3785 GLint y,
3786 GLsizei width,
3787 GLsizei height)
3788{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003789 if (width == 0 || height == 0)
3790 {
3791 return;
3792 }
3793
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003794 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003795 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003796
Jamie Madillc29968b2016-01-20 11:17:23 -05003797 Offset destOffset(xoffset, yoffset, 0);
3798 Rectangle sourceArea(x, y, width, height);
3799
Jamie Madill05b35b22017-10-03 09:01:44 -04003800 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003801 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003802 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003803}
3804
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003805void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003806 GLint level,
3807 GLint xoffset,
3808 GLint yoffset,
3809 GLint zoffset,
3810 GLint x,
3811 GLint y,
3812 GLsizei width,
3813 GLsizei height)
3814{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003815 if (width == 0 || height == 0)
3816 {
3817 return;
3818 }
3819
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003820 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003821 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003822
Jamie Madillc29968b2016-01-20 11:17:23 -05003823 Offset destOffset(xoffset, yoffset, zoffset);
3824 Rectangle sourceArea(x, y, width, height);
3825
Jamie Madill05b35b22017-10-03 09:01:44 -04003826 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3827 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003828 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3829 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003830}
3831
3832void Context::framebufferTexture2D(GLenum target,
3833 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003834 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003835 GLuint texture,
3836 GLint level)
3837{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003838 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003839 ASSERT(framebuffer);
3840
3841 if (texture != 0)
3842 {
3843 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003844 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003845 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003846 }
3847 else
3848 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003849 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003850 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003851
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003852 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003853}
3854
3855void Context::framebufferRenderbuffer(GLenum target,
3856 GLenum attachment,
3857 GLenum renderbuffertarget,
3858 GLuint renderbuffer)
3859{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003860 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003861 ASSERT(framebuffer);
3862
3863 if (renderbuffer != 0)
3864 {
3865 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003866
Jamie Madillcc129372018-04-12 09:13:18 -04003867 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003868 renderbufferObject);
3869 }
3870 else
3871 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003872 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003873 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003874
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003875 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003876}
3877
3878void Context::framebufferTextureLayer(GLenum target,
3879 GLenum attachment,
3880 GLuint texture,
3881 GLint level,
3882 GLint layer)
3883{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003884 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003885 ASSERT(framebuffer);
3886
3887 if (texture != 0)
3888 {
3889 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003890 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003891 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003892 }
3893 else
3894 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003895 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003896 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003897
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003898 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003899}
3900
Brandon Jones59770802018-04-02 13:18:42 -07003901void Context::framebufferTextureMultiviewLayered(GLenum target,
3902 GLenum attachment,
3903 GLuint texture,
3904 GLint level,
3905 GLint baseViewIndex,
3906 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003907{
Martin Radev82ef7742017-08-08 17:44:58 +03003908 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3909 ASSERT(framebuffer);
3910
3911 if (texture != 0)
3912 {
3913 Texture *textureObj = getTexture(texture);
3914
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003915 ImageIndex index;
3916 if (textureObj->getType() == TextureType::_2DArray)
3917 {
3918 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3919 }
3920 else
3921 {
3922 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3923 ASSERT(level == 0);
3924 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3925 }
Martin Radev82ef7742017-08-08 17:44:58 +03003926 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3927 numViews, baseViewIndex);
3928 }
3929 else
3930 {
3931 framebuffer->resetAttachment(this, attachment);
3932 }
3933
3934 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003935}
3936
Brandon Jones59770802018-04-02 13:18:42 -07003937void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3938 GLenum attachment,
3939 GLuint texture,
3940 GLint level,
3941 GLsizei numViews,
3942 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003943{
Martin Radev5dae57b2017-07-14 16:15:55 +03003944 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3945 ASSERT(framebuffer);
3946
3947 if (texture != 0)
3948 {
3949 Texture *textureObj = getTexture(texture);
3950
3951 ImageIndex index = ImageIndex::Make2D(level);
3952 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3953 textureObj, numViews, viewportOffsets);
3954 }
3955 else
3956 {
3957 framebuffer->resetAttachment(this, attachment);
3958 }
3959
3960 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003961}
3962
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003963void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3964{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003965 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3966 ASSERT(framebuffer);
3967
3968 if (texture != 0)
3969 {
3970 Texture *textureObj = getTexture(texture);
3971
3972 ImageIndex index = ImageIndex::MakeFromType(
3973 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3974 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3975 }
3976 else
3977 {
3978 framebuffer->resetAttachment(this, attachment);
3979 }
3980
3981 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003982}
3983
Jamie Madillc29968b2016-01-20 11:17:23 -05003984void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3985{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003986 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003987 ASSERT(framebuffer);
3988 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003989 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003990 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003991}
3992
3993void Context::readBuffer(GLenum mode)
3994{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003995 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003996 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003997 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003998}
3999
4000void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
4001{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004002 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004003 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004004
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004005 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004006 ASSERT(framebuffer);
4007
4008 // The specification isn't clear what should be done when the framebuffer isn't complete.
4009 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04004010 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004011}
4012
4013void Context::invalidateFramebuffer(GLenum target,
4014 GLsizei numAttachments,
4015 const GLenum *attachments)
4016{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004017 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004018 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004019
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004020 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004021 ASSERT(framebuffer);
4022
Jamie Madill427064d2018-04-13 16:20:34 -04004023 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004024 {
Jamie Madill437fa652016-05-03 15:13:24 -04004025 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004026 }
Jamie Madill437fa652016-05-03 15:13:24 -04004027
Jamie Madill4928b7c2017-06-20 12:57:39 -04004028 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004029}
4030
4031void Context::invalidateSubFramebuffer(GLenum target,
4032 GLsizei numAttachments,
4033 const GLenum *attachments,
4034 GLint x,
4035 GLint y,
4036 GLsizei width,
4037 GLsizei height)
4038{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004039 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004040 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004041
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004042 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004043 ASSERT(framebuffer);
4044
Jamie Madill427064d2018-04-13 16:20:34 -04004045 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004046 {
Jamie Madill437fa652016-05-03 15:13:24 -04004047 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004048 }
Jamie Madill437fa652016-05-03 15:13:24 -04004049
4050 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004051 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05004052}
4053
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004054void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004055 GLint level,
4056 GLint internalformat,
4057 GLsizei width,
4058 GLsizei height,
4059 GLint border,
4060 GLenum format,
4061 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004062 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004063{
Jamie Madillbc918e72018-03-08 09:47:21 -05004064 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004065
4066 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004067 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004068 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004069 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004070}
4071
Brandon Jones59770802018-04-02 13:18:42 -07004072void Context::texImage2DRobust(TextureTarget target,
4073 GLint level,
4074 GLint internalformat,
4075 GLsizei width,
4076 GLsizei height,
4077 GLint border,
4078 GLenum format,
4079 GLenum type,
4080 GLsizei bufSize,
4081 const void *pixels)
4082{
4083 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4084}
4085
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004086void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004087 GLint level,
4088 GLint internalformat,
4089 GLsizei width,
4090 GLsizei height,
4091 GLsizei depth,
4092 GLint border,
4093 GLenum format,
4094 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004095 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004096{
Jamie Madillbc918e72018-03-08 09:47:21 -05004097 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004098
4099 Extents size(width, height, depth);
4100 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004101 handleError(texture->setImage(this, mGLState.getUnpackState(),
4102 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004103 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004104}
4105
Brandon Jones59770802018-04-02 13:18:42 -07004106void Context::texImage3DRobust(TextureType target,
4107 GLint level,
4108 GLint internalformat,
4109 GLsizei width,
4110 GLsizei height,
4111 GLsizei depth,
4112 GLint border,
4113 GLenum format,
4114 GLenum type,
4115 GLsizei bufSize,
4116 const void *pixels)
4117{
4118 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4119}
4120
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004121void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004122 GLint level,
4123 GLint xoffset,
4124 GLint yoffset,
4125 GLsizei width,
4126 GLsizei height,
4127 GLenum format,
4128 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004129 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004130{
4131 // Zero sized uploads are valid but no-ops
4132 if (width == 0 || height == 0)
4133 {
4134 return;
4135 }
4136
Jamie Madillbc918e72018-03-08 09:47:21 -05004137 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004138
4139 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004140 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004141
4142 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4143
4144 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4145 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004146}
4147
Brandon Jones59770802018-04-02 13:18:42 -07004148void Context::texSubImage2DRobust(TextureTarget target,
4149 GLint level,
4150 GLint xoffset,
4151 GLint yoffset,
4152 GLsizei width,
4153 GLsizei height,
4154 GLenum format,
4155 GLenum type,
4156 GLsizei bufSize,
4157 const void *pixels)
4158{
4159 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4160}
4161
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004162void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004163 GLint level,
4164 GLint xoffset,
4165 GLint yoffset,
4166 GLint zoffset,
4167 GLsizei width,
4168 GLsizei height,
4169 GLsizei depth,
4170 GLenum format,
4171 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004172 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004173{
4174 // Zero sized uploads are valid but no-ops
4175 if (width == 0 || height == 0 || depth == 0)
4176 {
4177 return;
4178 }
4179
Jamie Madillbc918e72018-03-08 09:47:21 -05004180 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004181
4182 Box area(xoffset, yoffset, zoffset, width, height, depth);
4183 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004184
4185 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4186
4187 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004188 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004189 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004190}
4191
Brandon Jones59770802018-04-02 13:18:42 -07004192void Context::texSubImage3DRobust(TextureType target,
4193 GLint level,
4194 GLint xoffset,
4195 GLint yoffset,
4196 GLint zoffset,
4197 GLsizei width,
4198 GLsizei height,
4199 GLsizei depth,
4200 GLenum format,
4201 GLenum type,
4202 GLsizei bufSize,
4203 const void *pixels)
4204{
4205 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4206 pixels);
4207}
4208
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004209void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004210 GLint level,
4211 GLenum internalformat,
4212 GLsizei width,
4213 GLsizei height,
4214 GLint border,
4215 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004216 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004217{
Jamie Madillbc918e72018-03-08 09:47:21 -05004218 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004219
4220 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004221 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004222 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4223 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004224 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004225}
4226
Brandon Jones59770802018-04-02 13:18:42 -07004227void Context::compressedTexImage2DRobust(TextureTarget target,
4228 GLint level,
4229 GLenum internalformat,
4230 GLsizei width,
4231 GLsizei height,
4232 GLint border,
4233 GLsizei imageSize,
4234 GLsizei dataSize,
4235 const GLvoid *data)
4236{
4237 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4238}
4239
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004240void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004241 GLint level,
4242 GLenum internalformat,
4243 GLsizei width,
4244 GLsizei height,
4245 GLsizei depth,
4246 GLint border,
4247 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004248 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004249{
Jamie Madillbc918e72018-03-08 09:47:21 -05004250 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004251
4252 Extents size(width, height, depth);
4253 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004254 handleError(texture->setCompressedImage(
4255 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004256 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004257}
4258
Brandon Jones59770802018-04-02 13:18:42 -07004259void Context::compressedTexImage3DRobust(TextureType target,
4260 GLint level,
4261 GLenum internalformat,
4262 GLsizei width,
4263 GLsizei height,
4264 GLsizei depth,
4265 GLint border,
4266 GLsizei imageSize,
4267 GLsizei dataSize,
4268 const GLvoid *data)
4269{
4270 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4271 data);
4272}
4273
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004274void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004275 GLint level,
4276 GLint xoffset,
4277 GLint yoffset,
4278 GLsizei width,
4279 GLsizei height,
4280 GLenum format,
4281 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004282 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004283{
Jamie Madillbc918e72018-03-08 09:47:21 -05004284 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004285
4286 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004287 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004288 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4289 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004290 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004291}
4292
Brandon Jones59770802018-04-02 13:18:42 -07004293void Context::compressedTexSubImage2DRobust(TextureTarget target,
4294 GLint level,
4295 GLint xoffset,
4296 GLint yoffset,
4297 GLsizei width,
4298 GLsizei height,
4299 GLenum format,
4300 GLsizei imageSize,
4301 GLsizei dataSize,
4302 const GLvoid *data)
4303{
4304 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4305 data);
4306}
4307
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004308void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004309 GLint level,
4310 GLint xoffset,
4311 GLint yoffset,
4312 GLint zoffset,
4313 GLsizei width,
4314 GLsizei height,
4315 GLsizei depth,
4316 GLenum format,
4317 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004318 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004319{
4320 // Zero sized uploads are valid but no-ops
4321 if (width == 0 || height == 0)
4322 {
4323 return;
4324 }
4325
Jamie Madillbc918e72018-03-08 09:47:21 -05004326 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004327
4328 Box area(xoffset, yoffset, zoffset, width, height, depth);
4329 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004330 handleError(texture->setCompressedSubImage(
4331 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004332 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004333}
4334
Brandon Jones59770802018-04-02 13:18:42 -07004335void Context::compressedTexSubImage3DRobust(TextureType target,
4336 GLint level,
4337 GLint xoffset,
4338 GLint yoffset,
4339 GLint zoffset,
4340 GLsizei width,
4341 GLsizei height,
4342 GLsizei depth,
4343 GLenum format,
4344 GLsizei imageSize,
4345 GLsizei dataSize,
4346 const GLvoid *data)
4347{
4348 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4349 imageSize, data);
4350}
4351
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004352void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004353{
4354 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004355 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004356}
4357
Jamie Madill007530e2017-12-28 14:27:04 -05004358void Context::copyTexture(GLuint sourceId,
4359 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004360 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004361 GLuint destId,
4362 GLint destLevel,
4363 GLint internalFormat,
4364 GLenum destType,
4365 GLboolean unpackFlipY,
4366 GLboolean unpackPremultiplyAlpha,
4367 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004368{
Jamie Madillbc918e72018-03-08 09:47:21 -05004369 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004370
4371 gl::Texture *sourceTexture = getTexture(sourceId);
4372 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004373 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4374 sourceLevel, ConvertToBool(unpackFlipY),
4375 ConvertToBool(unpackPremultiplyAlpha),
4376 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004377}
4378
Jamie Madill007530e2017-12-28 14:27:04 -05004379void Context::copySubTexture(GLuint sourceId,
4380 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004381 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004382 GLuint destId,
4383 GLint destLevel,
4384 GLint xoffset,
4385 GLint yoffset,
4386 GLint x,
4387 GLint y,
4388 GLsizei width,
4389 GLsizei height,
4390 GLboolean unpackFlipY,
4391 GLboolean unpackPremultiplyAlpha,
4392 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004393{
4394 // Zero sized copies are valid but no-ops
4395 if (width == 0 || height == 0)
4396 {
4397 return;
4398 }
4399
Jamie Madillbc918e72018-03-08 09:47:21 -05004400 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004401
4402 gl::Texture *sourceTexture = getTexture(sourceId);
4403 gl::Texture *destTexture = getTexture(destId);
4404 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004405 Box box(x, y, 0, width, height, 1);
4406 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4407 ConvertToBool(unpackFlipY),
4408 ConvertToBool(unpackPremultiplyAlpha),
4409 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4410}
4411
4412void Context::copyTexture3D(GLuint sourceId,
4413 GLint sourceLevel,
4414 TextureTarget destTarget,
4415 GLuint destId,
4416 GLint destLevel,
4417 GLint internalFormat,
4418 GLenum destType,
4419 GLboolean unpackFlipY,
4420 GLboolean unpackPremultiplyAlpha,
4421 GLboolean unpackUnmultiplyAlpha)
4422{
4423 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4424
4425 Texture *sourceTexture = getTexture(sourceId);
4426 Texture *destTexture = getTexture(destId);
4427 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4428 sourceLevel, ConvertToBool(unpackFlipY),
4429 ConvertToBool(unpackPremultiplyAlpha),
4430 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4431}
4432
4433void Context::copySubTexture3D(GLuint sourceId,
4434 GLint sourceLevel,
4435 TextureTarget destTarget,
4436 GLuint destId,
4437 GLint destLevel,
4438 GLint xoffset,
4439 GLint yoffset,
4440 GLint zoffset,
4441 GLint x,
4442 GLint y,
4443 GLint z,
4444 GLsizei width,
4445 GLsizei height,
4446 GLsizei depth,
4447 GLboolean unpackFlipY,
4448 GLboolean unpackPremultiplyAlpha,
4449 GLboolean unpackUnmultiplyAlpha)
4450{
4451 // Zero sized copies are valid but no-ops
4452 if (width == 0 || height == 0 || depth == 0)
4453 {
4454 return;
4455 }
4456
4457 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4458
4459 Texture *sourceTexture = getTexture(sourceId);
4460 Texture *destTexture = getTexture(destId);
4461 Offset offset(xoffset, yoffset, zoffset);
4462 Box box(x, y, z, width, height, depth);
4463 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004464 ConvertToBool(unpackFlipY),
4465 ConvertToBool(unpackPremultiplyAlpha),
4466 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004467}
4468
Jamie Madill007530e2017-12-28 14:27:04 -05004469void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004470{
Jamie Madillbc918e72018-03-08 09:47:21 -05004471 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004472
4473 gl::Texture *sourceTexture = getTexture(sourceId);
4474 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004475 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004476}
4477
Corentin Wallez336129f2017-10-17 15:55:40 -04004478void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004479{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004480 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004481 ASSERT(buffer);
4482
Geoff Lang496c02d2016-10-20 11:38:11 -07004483 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004484}
4485
Brandon Jones59770802018-04-02 13:18:42 -07004486void Context::getBufferPointervRobust(BufferBinding target,
4487 GLenum pname,
4488 GLsizei bufSize,
4489 GLsizei *length,
4490 void **params)
4491{
4492 getBufferPointerv(target, pname, params);
4493}
4494
Corentin Wallez336129f2017-10-17 15:55:40 -04004495void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004496{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004497 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004498 ASSERT(buffer);
4499
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004500 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004501 if (error.isError())
4502 {
Jamie Madill437fa652016-05-03 15:13:24 -04004503 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004504 return nullptr;
4505 }
4506
4507 return buffer->getMapPointer();
4508}
4509
Corentin Wallez336129f2017-10-17 15:55:40 -04004510GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004511{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004512 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004513 ASSERT(buffer);
4514
4515 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004516 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004517 if (error.isError())
4518 {
Jamie Madill437fa652016-05-03 15:13:24 -04004519 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004520 return GL_FALSE;
4521 }
4522
4523 return result;
4524}
4525
Corentin Wallez336129f2017-10-17 15:55:40 -04004526void *Context::mapBufferRange(BufferBinding target,
4527 GLintptr offset,
4528 GLsizeiptr length,
4529 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004530{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004531 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004532 ASSERT(buffer);
4533
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004534 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004535 if (error.isError())
4536 {
Jamie Madill437fa652016-05-03 15:13:24 -04004537 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004538 return nullptr;
4539 }
4540
4541 return buffer->getMapPointer();
4542}
4543
Corentin Wallez336129f2017-10-17 15:55:40 -04004544void Context::flushMappedBufferRange(BufferBinding /*target*/,
4545 GLintptr /*offset*/,
4546 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004547{
4548 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4549}
4550
Jamie Madillbc918e72018-03-08 09:47:21 -05004551Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004552{
Geoff Langa8cb2872018-03-09 16:09:40 -05004553 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004554}
4555
Jamie Madillbc918e72018-03-08 09:47:21 -05004556Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004557{
Geoff Langa8cb2872018-03-09 16:09:40 -05004558 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004559}
4560
Jamie Madillbc918e72018-03-08 09:47:21 -05004561Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004562{
Geoff Langa8cb2872018-03-09 16:09:40 -05004563 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004564}
4565
Geoff Lang9bf86f02018-07-26 11:46:34 -04004566Error Context::syncStateForPathOperation()
4567{
4568 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4569
4570 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4571 ANGLE_TRY(syncDirtyBits());
4572
4573 return NoError();
4574}
4575
Jiajia Qin5451d532017-11-16 17:16:34 +08004576void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4577{
4578 UNIMPLEMENTED();
4579}
4580
Jamie Madillc20ab272016-06-09 07:20:46 -07004581void Context::activeTexture(GLenum texture)
4582{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004583 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004584}
4585
Jamie Madill876429b2017-04-20 15:46:24 -04004586void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004587{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004588 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004589}
4590
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004591void Context::blendEquation(GLenum mode)
4592{
4593 mGLState.setBlendEquation(mode, mode);
4594}
4595
Jamie Madillc20ab272016-06-09 07:20:46 -07004596void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4597{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004598 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004599}
4600
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004601void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4602{
4603 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4604}
4605
Jamie Madillc20ab272016-06-09 07:20:46 -07004606void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4607{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004608 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004609}
4610
Jamie Madill876429b2017-04-20 15:46:24 -04004611void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004612{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004613 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004614}
4615
Jamie Madill876429b2017-04-20 15:46:24 -04004616void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004617{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004618 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004619}
4620
4621void Context::clearStencil(GLint s)
4622{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004623 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004624}
4625
4626void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4627{
Geoff Lang92019432017-11-20 13:09:34 -05004628 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4629 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004630}
4631
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004632void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004633{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004634 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004635}
4636
4637void Context::depthFunc(GLenum func)
4638{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004639 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004640}
4641
4642void Context::depthMask(GLboolean flag)
4643{
Geoff Lang92019432017-11-20 13:09:34 -05004644 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004645}
4646
Jamie Madill876429b2017-04-20 15:46:24 -04004647void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004648{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004649 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004650}
4651
4652void Context::disable(GLenum cap)
4653{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004654 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004655 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004656}
4657
4658void Context::disableVertexAttribArray(GLuint index)
4659{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004660 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004661 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004662}
4663
4664void Context::enable(GLenum cap)
4665{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004666 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004667 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004668}
4669
4670void Context::enableVertexAttribArray(GLuint index)
4671{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004672 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004673 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004674}
4675
4676void Context::frontFace(GLenum mode)
4677{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004678 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004679}
4680
4681void Context::hint(GLenum target, GLenum mode)
4682{
4683 switch (target)
4684 {
4685 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004686 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004687 break;
4688
4689 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004690 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004691 break;
4692
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004693 case GL_PERSPECTIVE_CORRECTION_HINT:
4694 case GL_POINT_SMOOTH_HINT:
4695 case GL_LINE_SMOOTH_HINT:
4696 case GL_FOG_HINT:
4697 mGLState.gles1().setHint(target, mode);
4698 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004699 default:
4700 UNREACHABLE();
4701 return;
4702 }
4703}
4704
4705void Context::lineWidth(GLfloat width)
4706{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004707 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004708}
4709
4710void Context::pixelStorei(GLenum pname, GLint param)
4711{
4712 switch (pname)
4713 {
4714 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004715 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004716 break;
4717
4718 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004719 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004720 break;
4721
4722 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004723 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004724 break;
4725
4726 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004727 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004728 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004729 break;
4730
4731 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004732 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004733 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004734 break;
4735
4736 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004737 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004738 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004739 break;
4740
4741 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004742 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004743 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004744 break;
4745
4746 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004747 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004748 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004749 break;
4750
4751 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004752 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004753 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004754 break;
4755
4756 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004757 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004758 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004759 break;
4760
4761 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004762 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004763 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004764 break;
4765
4766 default:
4767 UNREACHABLE();
4768 return;
4769 }
4770}
4771
4772void Context::polygonOffset(GLfloat factor, GLfloat units)
4773{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004774 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004775}
4776
Jamie Madill876429b2017-04-20 15:46:24 -04004777void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004778{
Geoff Lang92019432017-11-20 13:09:34 -05004779 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004780}
4781
Jiawei Shaodb342272017-09-27 10:21:45 +08004782void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4783{
4784 mGLState.setSampleMaskParams(maskNumber, mask);
4785}
4786
Jamie Madillc20ab272016-06-09 07:20:46 -07004787void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4788{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004789 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004790}
4791
4792void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4793{
4794 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4795 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004796 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004797 }
4798
4799 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4800 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004801 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004802 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004803
4804 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004805}
4806
4807void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4808{
4809 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4810 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004811 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004812 }
4813
4814 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4815 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004816 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004817 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004818
4819 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004820}
4821
4822void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4823{
4824 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4825 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004826 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004827 }
4828
4829 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4830 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004831 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004832 }
4833}
4834
4835void Context::vertexAttrib1f(GLuint index, GLfloat x)
4836{
4837 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004838 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004839 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004840}
4841
4842void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4843{
4844 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004845 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004846 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004847}
4848
4849void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4850{
4851 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004852 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004853 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004854}
4855
4856void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4857{
4858 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004859 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004860 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004861}
4862
4863void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4864{
4865 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004866 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004867 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004868}
4869
4870void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4871{
4872 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004873 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004874 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004875}
4876
4877void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4878{
4879 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004880 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004881 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004882}
4883
4884void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4885{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004886 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004887 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004888}
4889
4890void Context::vertexAttribPointer(GLuint index,
4891 GLint size,
4892 GLenum type,
4893 GLboolean normalized,
4894 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004895 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004896{
Corentin Wallez336129f2017-10-17 15:55:40 -04004897 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004898 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004899 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004900}
4901
Shao80957d92017-02-20 21:25:59 +08004902void Context::vertexAttribFormat(GLuint attribIndex,
4903 GLint size,
4904 GLenum type,
4905 GLboolean normalized,
4906 GLuint relativeOffset)
4907{
Geoff Lang92019432017-11-20 13:09:34 -05004908 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004909 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004910 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004911}
4912
4913void Context::vertexAttribIFormat(GLuint attribIndex,
4914 GLint size,
4915 GLenum type,
4916 GLuint relativeOffset)
4917{
4918 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004919 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004920}
4921
4922void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4923{
Shaodde78e82017-05-22 14:13:27 +08004924 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004925 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004926}
4927
Jiajia Qin5451d532017-11-16 17:16:34 +08004928void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004929{
4930 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004931 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004932}
4933
Jamie Madillc20ab272016-06-09 07:20:46 -07004934void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4935{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004936 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004937}
4938
4939void Context::vertexAttribIPointer(GLuint index,
4940 GLint size,
4941 GLenum type,
4942 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004943 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004944{
Corentin Wallez336129f2017-10-17 15:55:40 -04004945 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4946 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004947 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004948}
4949
4950void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4951{
4952 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004953 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004954 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004955}
4956
4957void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4958{
4959 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004960 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004961 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004962}
4963
4964void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4965{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004966 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004967 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004968}
4969
4970void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4971{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004972 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004973 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004974}
4975
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004976void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4977{
4978 const VertexAttribCurrentValueData &currentValues =
4979 getGLState().getVertexAttribCurrentValue(index);
4980 const VertexArray *vao = getGLState().getVertexArray();
4981 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4982 currentValues, pname, params);
4983}
4984
Brandon Jones59770802018-04-02 13:18:42 -07004985void Context::getVertexAttribivRobust(GLuint index,
4986 GLenum pname,
4987 GLsizei bufSize,
4988 GLsizei *length,
4989 GLint *params)
4990{
4991 getVertexAttribiv(index, pname, params);
4992}
4993
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004994void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4995{
4996 const VertexAttribCurrentValueData &currentValues =
4997 getGLState().getVertexAttribCurrentValue(index);
4998 const VertexArray *vao = getGLState().getVertexArray();
4999 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5000 currentValues, pname, params);
5001}
5002
Brandon Jones59770802018-04-02 13:18:42 -07005003void Context::getVertexAttribfvRobust(GLuint index,
5004 GLenum pname,
5005 GLsizei bufSize,
5006 GLsizei *length,
5007 GLfloat *params)
5008{
5009 getVertexAttribfv(index, pname, params);
5010}
5011
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005012void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
5013{
5014 const VertexAttribCurrentValueData &currentValues =
5015 getGLState().getVertexAttribCurrentValue(index);
5016 const VertexArray *vao = getGLState().getVertexArray();
5017 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5018 currentValues, pname, params);
5019}
5020
Brandon Jones59770802018-04-02 13:18:42 -07005021void Context::getVertexAttribIivRobust(GLuint index,
5022 GLenum pname,
5023 GLsizei bufSize,
5024 GLsizei *length,
5025 GLint *params)
5026{
5027 getVertexAttribIiv(index, pname, params);
5028}
5029
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005030void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
5031{
5032 const VertexAttribCurrentValueData &currentValues =
5033 getGLState().getVertexAttribCurrentValue(index);
5034 const VertexArray *vao = getGLState().getVertexArray();
5035 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5036 currentValues, pname, params);
5037}
5038
Brandon Jones59770802018-04-02 13:18:42 -07005039void Context::getVertexAttribIuivRobust(GLuint index,
5040 GLenum pname,
5041 GLsizei bufSize,
5042 GLsizei *length,
5043 GLuint *params)
5044{
5045 getVertexAttribIuiv(index, pname, params);
5046}
5047
Jamie Madill876429b2017-04-20 15:46:24 -04005048void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005049{
5050 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
5051 QueryVertexAttribPointerv(attrib, pname, pointer);
5052}
5053
Brandon Jones59770802018-04-02 13:18:42 -07005054void Context::getVertexAttribPointervRobust(GLuint index,
5055 GLenum pname,
5056 GLsizei bufSize,
5057 GLsizei *length,
5058 void **pointer)
5059{
5060 getVertexAttribPointerv(index, pname, pointer);
5061}
5062
Jamie Madillc20ab272016-06-09 07:20:46 -07005063void Context::debugMessageControl(GLenum source,
5064 GLenum type,
5065 GLenum severity,
5066 GLsizei count,
5067 const GLuint *ids,
5068 GLboolean enabled)
5069{
5070 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005071 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005072 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005073}
5074
5075void Context::debugMessageInsert(GLenum source,
5076 GLenum type,
5077 GLuint id,
5078 GLenum severity,
5079 GLsizei length,
5080 const GLchar *buf)
5081{
5082 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005083 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005084}
5085
5086void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5087{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005088 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005089}
5090
5091GLuint Context::getDebugMessageLog(GLuint count,
5092 GLsizei bufSize,
5093 GLenum *sources,
5094 GLenum *types,
5095 GLuint *ids,
5096 GLenum *severities,
5097 GLsizei *lengths,
5098 GLchar *messageLog)
5099{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005100 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5101 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005102}
5103
5104void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5105{
5106 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005107 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005108 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005109}
5110
5111void Context::popDebugGroup()
5112{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005113 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005114 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005115}
5116
Corentin Wallez336129f2017-10-17 15:55:40 -04005117void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005118{
5119 Buffer *buffer = mGLState.getTargetBuffer(target);
5120 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005121 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005122}
5123
Corentin Wallez336129f2017-10-17 15:55:40 -04005124void Context::bufferSubData(BufferBinding target,
5125 GLintptr offset,
5126 GLsizeiptr size,
5127 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005128{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005129 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005130 {
5131 return;
5132 }
5133
5134 Buffer *buffer = mGLState.getTargetBuffer(target);
5135 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005136 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005137}
5138
Jamie Madillef300b12016-10-07 15:12:09 -04005139void Context::attachShader(GLuint program, GLuint shader)
5140{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005141 Program *programObject = mState.mShaderPrograms->getProgram(program);
5142 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005143 ASSERT(programObject && shaderObject);
5144 programObject->attachShader(shaderObject);
5145}
5146
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005147const Workarounds &Context::getWorkarounds() const
5148{
5149 return mWorkarounds;
5150}
5151
Corentin Wallez336129f2017-10-17 15:55:40 -04005152void Context::copyBufferSubData(BufferBinding readTarget,
5153 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005154 GLintptr readOffset,
5155 GLintptr writeOffset,
5156 GLsizeiptr size)
5157{
5158 // if size is zero, the copy is a successful no-op
5159 if (size == 0)
5160 {
5161 return;
5162 }
5163
5164 // TODO(jmadill): cache these.
5165 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5166 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5167
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005168 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005169}
5170
Jamie Madill01a80ee2016-11-07 12:06:18 -05005171void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5172{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005173 // Ideally we could share the program query with the validation layer if possible.
5174 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005175 ASSERT(programObject);
5176 programObject->bindAttributeLocation(index, name);
5177}
5178
Corentin Wallez336129f2017-10-17 15:55:40 -04005179void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005180{
Corentin Wallez336129f2017-10-17 15:55:40 -04005181 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5182 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005183 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005184}
5185
Corentin Wallez336129f2017-10-17 15:55:40 -04005186void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005187{
5188 bindBufferRange(target, index, buffer, 0, 0);
5189}
5190
Corentin Wallez336129f2017-10-17 15:55:40 -04005191void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005192 GLuint index,
5193 GLuint buffer,
5194 GLintptr offset,
5195 GLsizeiptr size)
5196{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005197 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5198 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5199 if (target == BufferBinding::Uniform)
5200 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005201 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005202 mStateCache.onUniformBufferStateChange(this);
5203 }
5204 else
5205 {
5206 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005207 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005208}
5209
Jamie Madill01a80ee2016-11-07 12:06:18 -05005210void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5211{
5212 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5213 {
5214 bindReadFramebuffer(framebuffer);
5215 }
5216
5217 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5218 {
5219 bindDrawFramebuffer(framebuffer);
5220 }
5221}
5222
5223void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5224{
5225 ASSERT(target == GL_RENDERBUFFER);
5226 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005227 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005228 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005229}
5230
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005231void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005232 GLsizei samples,
5233 GLenum internalformat,
5234 GLsizei width,
5235 GLsizei height,
5236 GLboolean fixedsamplelocations)
5237{
5238 Extents size(width, height, 1);
5239 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005240 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5241 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005242}
5243
Olli Etuaho89664842018-08-24 14:45:36 +03005244void Context::texStorage3DMultisample(TextureType target,
5245 GLsizei samples,
5246 GLenum internalformat,
5247 GLsizei width,
5248 GLsizei height,
5249 GLsizei depth,
5250 GLboolean fixedsamplelocations)
5251{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005252 Extents size(width, height, depth);
5253 Texture *texture = getTargetTexture(target);
5254 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5255 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005256}
5257
JiangYizhoubddc46b2016-12-09 09:50:51 +08005258void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5259{
JiangYizhou5b03f472017-01-09 10:22:53 +08005260 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5261 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005262 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005263 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005264
5265 switch (pname)
5266 {
5267 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005268 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005269 break;
5270 default:
5271 UNREACHABLE();
5272 }
5273}
5274
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005275void Context::getMultisamplefvRobust(GLenum pname,
5276 GLuint index,
5277 GLsizei bufSize,
5278 GLsizei *length,
5279 GLfloat *val)
5280{
5281 UNIMPLEMENTED();
5282}
5283
Jamie Madille8fb6402017-02-14 17:56:40 -05005284void Context::renderbufferStorage(GLenum target,
5285 GLenum internalformat,
5286 GLsizei width,
5287 GLsizei height)
5288{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005289 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5290 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5291
Jamie Madille8fb6402017-02-14 17:56:40 -05005292 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005293 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005294}
5295
5296void Context::renderbufferStorageMultisample(GLenum target,
5297 GLsizei samples,
5298 GLenum internalformat,
5299 GLsizei width,
5300 GLsizei height)
5301{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005302 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5303 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005304
5305 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005306 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005307 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005308}
5309
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005310void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5311{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005312 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005313 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005314}
5315
JiangYizhoue18e6392017-02-20 10:32:23 +08005316void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5317{
5318 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5319 QueryFramebufferParameteriv(framebuffer, pname, params);
5320}
5321
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005322void Context::getFramebufferParameterivRobust(GLenum target,
5323 GLenum pname,
5324 GLsizei bufSize,
5325 GLsizei *length,
5326 GLint *params)
5327{
5328 UNIMPLEMENTED();
5329}
5330
Jiajia Qin5451d532017-11-16 17:16:34 +08005331void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005332{
5333 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005334 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005335}
5336
Jamie Madilldec86232018-07-11 09:01:18 -04005337bool Context::getScratchBuffer(size_t requstedSizeBytes,
5338 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005339{
Jamie Madilldec86232018-07-11 09:01:18 -04005340 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005341}
5342
Jamie Madilldec86232018-07-11 09:01:18 -04005343bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5344 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005345{
Jamie Madilldec86232018-07-11 09:01:18 -04005346 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005347}
5348
Xinghua Cao10a4d432017-11-28 14:46:26 +08005349Error Context::prepareForDispatch()
5350{
Jamie Madill0cc11c62018-10-12 18:07:18 -04005351 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005352
5353 if (isRobustResourceInitEnabled())
5354 {
5355 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5356 }
5357
Jamie Madill0cc11c62018-10-12 18:07:18 -04005358 return syncDirtyBits(mComputeDirtyBits);
Xinghua Cao10a4d432017-11-28 14:46:26 +08005359}
5360
Xinghua Cao2b396592017-03-29 15:36:04 +08005361void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5362{
5363 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5364 {
5365 return;
5366 }
5367
Xinghua Cao10a4d432017-11-28 14:46:26 +08005368 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005369 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005370}
5371
Jiajia Qin5451d532017-11-16 17:16:34 +08005372void Context::dispatchComputeIndirect(GLintptr indirect)
5373{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005374 ANGLE_CONTEXT_TRY(prepareForDispatch());
5375 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005376}
5377
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005378void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005379 GLsizei levels,
5380 GLenum internalFormat,
5381 GLsizei width,
5382 GLsizei height)
5383{
5384 Extents size(width, height, 1);
5385 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005386 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005387}
5388
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005389void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005390 GLsizei levels,
5391 GLenum internalFormat,
5392 GLsizei width,
5393 GLsizei height,
5394 GLsizei depth)
5395{
5396 Extents size(width, height, depth);
5397 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005398 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005399}
5400
Jiajia Qin5451d532017-11-16 17:16:34 +08005401void Context::memoryBarrier(GLbitfield barriers)
5402{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005403 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005404}
5405
5406void Context::memoryBarrierByRegion(GLbitfield barriers)
5407{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005408 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005409}
5410
Austin Eng1bf18ce2018-10-19 15:34:02 -07005411void Context::multiDrawArrays(PrimitiveMode mode,
5412 const GLint *firsts,
5413 const GLsizei *counts,
5414 GLsizei drawcount)
5415{
5416 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5417 Program *programObject = mGLState.getLinkedProgram(this);
5418 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5419 if (hasDrawID)
5420 {
5421 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5422 {
5423 if (noopDraw(mode, counts[drawID]))
5424 {
5425 continue;
5426 }
5427 programObject->setDrawIDUniform(drawID);
5428 ANGLE_CONTEXT_TRY(
5429 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5430 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5431 counts[drawID], 1);
5432 }
5433 }
5434 else
5435 {
5436 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5437 {
5438 if (noopDraw(mode, counts[drawID]))
5439 {
5440 continue;
5441 }
5442 ANGLE_CONTEXT_TRY(
5443 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5444 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5445 counts[drawID], 1);
5446 }
5447 }
5448}
5449
5450void Context::multiDrawArraysInstanced(PrimitiveMode mode,
5451 const GLint *firsts,
5452 const GLsizei *counts,
5453 const GLsizei *instanceCounts,
5454 GLsizei drawcount)
5455{
5456 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5457 Program *programObject = mGLState.getLinkedProgram(this);
5458 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5459 if (hasDrawID)
5460 {
5461 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5462 {
5463 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5464 {
5465 continue;
5466 }
5467 programObject->setDrawIDUniform(drawID);
5468 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5469 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5470 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5471 counts[drawID], instanceCounts[drawID]);
5472 }
5473 }
5474 else
5475 {
5476 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5477 {
5478 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5479 {
5480 continue;
5481 }
5482 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5483 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5484 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5485 counts[drawID], instanceCounts[drawID]);
5486 }
5487 }
5488}
5489
5490void Context::multiDrawElements(PrimitiveMode mode,
5491 const GLsizei *counts,
5492 GLenum type,
5493 const GLsizei *offsets,
5494 GLsizei drawcount)
5495{
5496 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5497 Program *programObject = mGLState.getLinkedProgram(this);
5498 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5499 if (hasDrawID)
5500 {
5501 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5502 {
5503 if (noopDraw(mode, counts[drawID]))
5504 {
5505 continue;
5506 }
5507 programObject->setDrawIDUniform(drawID);
5508 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5509 ANGLE_CONTEXT_TRY(
5510 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5511 }
5512 }
5513 else
5514 {
5515 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5516 {
5517 if (noopDraw(mode, counts[drawID]))
5518 {
5519 continue;
5520 }
5521 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5522 ANGLE_CONTEXT_TRY(
5523 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5524 }
5525 }
5526}
5527
5528void Context::multiDrawElementsInstanced(PrimitiveMode mode,
5529 const GLsizei *counts,
5530 GLenum type,
5531 const GLsizei *offsets,
5532 const GLsizei *instanceCounts,
5533 GLsizei drawcount)
5534{
5535 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5536 Program *programObject = mGLState.getLinkedProgram(this);
5537 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5538 if (hasDrawID)
5539 {
5540 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5541 {
5542 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5543 {
5544 continue;
5545 }
5546 programObject->setDrawIDUniform(drawID);
5547 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5548 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5549 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5550 }
5551 }
5552 else
5553 {
5554 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5555 {
5556 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5557 {
5558 continue;
5559 }
5560 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5561 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5562 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5563 }
5564 }
5565}
5566
Jamie Madillc1d770e2017-04-13 17:31:24 -04005567GLenum Context::checkFramebufferStatus(GLenum target)
5568{
5569 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5570 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005571 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005572}
5573
5574void Context::compileShader(GLuint shader)
5575{
5576 Shader *shaderObject = GetValidShader(this, shader);
5577 if (!shaderObject)
5578 {
5579 return;
5580 }
5581 shaderObject->compile(this);
5582}
5583
5584void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5585{
5586 for (int i = 0; i < n; i++)
5587 {
5588 deleteBuffer(buffers[i]);
5589 }
5590}
5591
5592void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5593{
5594 for (int i = 0; i < n; i++)
5595 {
5596 if (framebuffers[i] != 0)
5597 {
5598 deleteFramebuffer(framebuffers[i]);
5599 }
5600 }
5601}
5602
5603void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5604{
5605 for (int i = 0; i < n; i++)
5606 {
5607 deleteRenderbuffer(renderbuffers[i]);
5608 }
5609}
5610
5611void Context::deleteTextures(GLsizei n, const GLuint *textures)
5612{
5613 for (int i = 0; i < n; i++)
5614 {
5615 if (textures[i] != 0)
5616 {
5617 deleteTexture(textures[i]);
5618 }
5619 }
5620}
5621
5622void Context::detachShader(GLuint program, GLuint shader)
5623{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005624 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005625 ASSERT(programObject);
5626
5627 Shader *shaderObject = getShader(shader);
5628 ASSERT(shaderObject);
5629
5630 programObject->detachShader(this, shaderObject);
5631}
5632
5633void Context::genBuffers(GLsizei n, GLuint *buffers)
5634{
5635 for (int i = 0; i < n; i++)
5636 {
5637 buffers[i] = createBuffer();
5638 }
5639}
5640
5641void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5642{
5643 for (int i = 0; i < n; i++)
5644 {
5645 framebuffers[i] = createFramebuffer();
5646 }
5647}
5648
5649void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5650{
5651 for (int i = 0; i < n; i++)
5652 {
5653 renderbuffers[i] = createRenderbuffer();
5654 }
5655}
5656
5657void Context::genTextures(GLsizei n, GLuint *textures)
5658{
5659 for (int i = 0; i < n; i++)
5660 {
5661 textures[i] = createTexture();
5662 }
5663}
5664
5665void Context::getActiveAttrib(GLuint program,
5666 GLuint index,
5667 GLsizei bufsize,
5668 GLsizei *length,
5669 GLint *size,
5670 GLenum *type,
5671 GLchar *name)
5672{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005673 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005674 ASSERT(programObject);
5675 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5676}
5677
5678void Context::getActiveUniform(GLuint program,
5679 GLuint index,
5680 GLsizei bufsize,
5681 GLsizei *length,
5682 GLint *size,
5683 GLenum *type,
5684 GLchar *name)
5685{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005686 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005687 ASSERT(programObject);
5688 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5689}
5690
5691void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5692{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005693 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005694 ASSERT(programObject);
5695 programObject->getAttachedShaders(maxcount, count, shaders);
5696}
5697
5698GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5699{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005700 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005701 ASSERT(programObject);
5702 return programObject->getAttributeLocation(name);
5703}
5704
5705void Context::getBooleanv(GLenum pname, GLboolean *params)
5706{
5707 GLenum nativeType;
5708 unsigned int numParams = 0;
5709 getQueryParameterInfo(pname, &nativeType, &numParams);
5710
5711 if (nativeType == GL_BOOL)
5712 {
5713 getBooleanvImpl(pname, params);
5714 }
5715 else
5716 {
5717 CastStateValues(this, nativeType, pname, numParams, params);
5718 }
5719}
5720
Brandon Jones59770802018-04-02 13:18:42 -07005721void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5722{
5723 getBooleanv(pname, params);
5724}
5725
Jamie Madillc1d770e2017-04-13 17:31:24 -04005726void Context::getFloatv(GLenum pname, GLfloat *params)
5727{
5728 GLenum nativeType;
5729 unsigned int numParams = 0;
5730 getQueryParameterInfo(pname, &nativeType, &numParams);
5731
5732 if (nativeType == GL_FLOAT)
5733 {
5734 getFloatvImpl(pname, params);
5735 }
5736 else
5737 {
5738 CastStateValues(this, nativeType, pname, numParams, params);
5739 }
5740}
5741
Brandon Jones59770802018-04-02 13:18:42 -07005742void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5743{
5744 getFloatv(pname, params);
5745}
5746
Jamie Madillc1d770e2017-04-13 17:31:24 -04005747void Context::getIntegerv(GLenum pname, GLint *params)
5748{
5749 GLenum nativeType;
5750 unsigned int numParams = 0;
5751 getQueryParameterInfo(pname, &nativeType, &numParams);
5752
5753 if (nativeType == GL_INT)
5754 {
5755 getIntegervImpl(pname, params);
5756 }
5757 else
5758 {
5759 CastStateValues(this, nativeType, pname, numParams, params);
5760 }
5761}
5762
Brandon Jones59770802018-04-02 13:18:42 -07005763void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5764{
5765 getIntegerv(pname, data);
5766}
5767
Jamie Madillc1d770e2017-04-13 17:31:24 -04005768void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5769{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005770 // Don't resolve link if checking the link completion status.
5771 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5772 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005773 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005774 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005775}
5776
Brandon Jones59770802018-04-02 13:18:42 -07005777void Context::getProgramivRobust(GLuint program,
5778 GLenum pname,
5779 GLsizei bufSize,
5780 GLsizei *length,
5781 GLint *params)
5782{
5783 getProgramiv(program, pname, params);
5784}
5785
Jiajia Qin5451d532017-11-16 17:16:34 +08005786void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5787{
5788 UNIMPLEMENTED();
5789}
5790
Jamie Madillbe849e42017-05-02 15:49:00 -04005791void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005792{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005793 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005794 ASSERT(programObject);
5795 programObject->getInfoLog(bufsize, length, infolog);
5796}
5797
Jiajia Qin5451d532017-11-16 17:16:34 +08005798void Context::getProgramPipelineInfoLog(GLuint pipeline,
5799 GLsizei bufSize,
5800 GLsizei *length,
5801 GLchar *infoLog)
5802{
5803 UNIMPLEMENTED();
5804}
5805
Jamie Madillc1d770e2017-04-13 17:31:24 -04005806void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5807{
5808 Shader *shaderObject = getShader(shader);
5809 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005810 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005811}
5812
Brandon Jones59770802018-04-02 13:18:42 -07005813void Context::getShaderivRobust(GLuint shader,
5814 GLenum pname,
5815 GLsizei bufSize,
5816 GLsizei *length,
5817 GLint *params)
5818{
5819 getShaderiv(shader, pname, params);
5820}
5821
Jamie Madillc1d770e2017-04-13 17:31:24 -04005822void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5823{
5824 Shader *shaderObject = getShader(shader);
5825 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005826 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005827}
5828
5829void Context::getShaderPrecisionFormat(GLenum shadertype,
5830 GLenum precisiontype,
5831 GLint *range,
5832 GLint *precision)
5833{
5834 // TODO(jmadill): Compute shaders.
5835
5836 switch (shadertype)
5837 {
5838 case GL_VERTEX_SHADER:
5839 switch (precisiontype)
5840 {
5841 case GL_LOW_FLOAT:
5842 mCaps.vertexLowpFloat.get(range, precision);
5843 break;
5844 case GL_MEDIUM_FLOAT:
5845 mCaps.vertexMediumpFloat.get(range, precision);
5846 break;
5847 case GL_HIGH_FLOAT:
5848 mCaps.vertexHighpFloat.get(range, precision);
5849 break;
5850
5851 case GL_LOW_INT:
5852 mCaps.vertexLowpInt.get(range, precision);
5853 break;
5854 case GL_MEDIUM_INT:
5855 mCaps.vertexMediumpInt.get(range, precision);
5856 break;
5857 case GL_HIGH_INT:
5858 mCaps.vertexHighpInt.get(range, precision);
5859 break;
5860
5861 default:
5862 UNREACHABLE();
5863 return;
5864 }
5865 break;
5866
5867 case GL_FRAGMENT_SHADER:
5868 switch (precisiontype)
5869 {
5870 case GL_LOW_FLOAT:
5871 mCaps.fragmentLowpFloat.get(range, precision);
5872 break;
5873 case GL_MEDIUM_FLOAT:
5874 mCaps.fragmentMediumpFloat.get(range, precision);
5875 break;
5876 case GL_HIGH_FLOAT:
5877 mCaps.fragmentHighpFloat.get(range, precision);
5878 break;
5879
5880 case GL_LOW_INT:
5881 mCaps.fragmentLowpInt.get(range, precision);
5882 break;
5883 case GL_MEDIUM_INT:
5884 mCaps.fragmentMediumpInt.get(range, precision);
5885 break;
5886 case GL_HIGH_INT:
5887 mCaps.fragmentHighpInt.get(range, precision);
5888 break;
5889
5890 default:
5891 UNREACHABLE();
5892 return;
5893 }
5894 break;
5895
5896 default:
5897 UNREACHABLE();
5898 return;
5899 }
5900}
5901
5902void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5903{
5904 Shader *shaderObject = getShader(shader);
5905 ASSERT(shaderObject);
5906 shaderObject->getSource(bufsize, length, source);
5907}
5908
5909void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5910{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005911 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005912 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005913 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005914}
5915
Brandon Jones59770802018-04-02 13:18:42 -07005916void Context::getUniformfvRobust(GLuint program,
5917 GLint location,
5918 GLsizei bufSize,
5919 GLsizei *length,
5920 GLfloat *params)
5921{
5922 getUniformfv(program, location, params);
5923}
5924
Jamie Madillc1d770e2017-04-13 17:31:24 -04005925void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5926{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005927 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005928 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005929 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005930}
5931
Brandon Jones59770802018-04-02 13:18:42 -07005932void Context::getUniformivRobust(GLuint program,
5933 GLint location,
5934 GLsizei bufSize,
5935 GLsizei *length,
5936 GLint *params)
5937{
5938 getUniformiv(program, location, params);
5939}
5940
Jamie Madillc1d770e2017-04-13 17:31:24 -04005941GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5942{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005943 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005944 ASSERT(programObject);
5945 return programObject->getUniformLocation(name);
5946}
5947
5948GLboolean Context::isBuffer(GLuint buffer)
5949{
5950 if (buffer == 0)
5951 {
5952 return GL_FALSE;
5953 }
5954
5955 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5956}
5957
5958GLboolean Context::isEnabled(GLenum cap)
5959{
5960 return mGLState.getEnableFeature(cap);
5961}
5962
5963GLboolean Context::isFramebuffer(GLuint framebuffer)
5964{
5965 if (framebuffer == 0)
5966 {
5967 return GL_FALSE;
5968 }
5969
5970 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5971}
5972
5973GLboolean Context::isProgram(GLuint program)
5974{
5975 if (program == 0)
5976 {
5977 return GL_FALSE;
5978 }
5979
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005980 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005981}
5982
5983GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5984{
5985 if (renderbuffer == 0)
5986 {
5987 return GL_FALSE;
5988 }
5989
5990 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5991}
5992
5993GLboolean Context::isShader(GLuint shader)
5994{
5995 if (shader == 0)
5996 {
5997 return GL_FALSE;
5998 }
5999
6000 return (getShader(shader) ? GL_TRUE : GL_FALSE);
6001}
6002
6003GLboolean Context::isTexture(GLuint texture)
6004{
6005 if (texture == 0)
6006 {
6007 return GL_FALSE;
6008 }
6009
6010 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
6011}
6012
6013void Context::linkProgram(GLuint program)
6014{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006015 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006016 ASSERT(programObject);
6017 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08006018
6019 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
6020 // don't need to worry that:
6021 // 1. Draw calls after link use the new executable code or the old one depending on the link
6022 // result.
6023 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
6024 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
6025 // ProgramD3D.
6026 if (programObject->isInUse())
6027 {
Jamie Madill785e8a02018-10-04 17:42:00 -04006028 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04006029 if (programObject->isLinked())
6030 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006031 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006032 }
jchen107ae70d82018-07-06 13:47:01 +08006033 mStateCache.onProgramExecutableChange(this);
6034 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006035}
6036
6037void Context::releaseShaderCompiler()
6038{
Jamie Madill4928b7c2017-06-20 12:57:39 -04006039 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006040}
6041
6042void Context::shaderBinary(GLsizei n,
6043 const GLuint *shaders,
6044 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04006045 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04006046 GLsizei length)
6047{
6048 // No binary shader formats are supported.
6049 UNIMPLEMENTED();
6050}
6051
Olli Etuaho0ca09752018-09-24 11:00:50 +03006052void Context::bindFragDataLocationIndexed(GLuint program,
6053 GLuint colorNumber,
6054 GLuint index,
6055 const char *name)
6056{
6057 Program *programObject = getProgramNoResolveLink(program);
6058 programObject->bindFragmentOutputLocation(colorNumber, name);
6059 programObject->bindFragmentOutputIndex(index, name);
6060}
6061
6062void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
6063{
6064 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
6065}
6066
6067int Context::getFragDataIndex(GLuint program, const char *name)
6068{
6069 Program *programObject = getProgramResolveLink(program);
6070 return programObject->getFragDataIndex(name);
6071}
6072
6073int Context::getProgramResourceLocationIndex(GLuint program,
6074 GLenum programInterface,
6075 const char *name)
6076{
6077 Program *programObject = getProgramResolveLink(program);
6078 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
6079 return programObject->getFragDataIndex(name);
6080}
6081
Jamie Madillc1d770e2017-04-13 17:31:24 -04006082void Context::shaderSource(GLuint shader,
6083 GLsizei count,
6084 const GLchar *const *string,
6085 const GLint *length)
6086{
6087 Shader *shaderObject = getShader(shader);
6088 ASSERT(shaderObject);
6089 shaderObject->setSource(count, string, length);
6090}
6091
6092void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
6093{
6094 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
6095}
6096
6097void Context::stencilMask(GLuint mask)
6098{
6099 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
6100}
6101
6102void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
6103{
6104 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
6105}
6106
6107void Context::uniform1f(GLint location, GLfloat x)
6108{
6109 Program *program = mGLState.getProgram();
6110 program->setUniform1fv(location, 1, &x);
6111}
6112
6113void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
6114{
6115 Program *program = mGLState.getProgram();
6116 program->setUniform1fv(location, count, v);
6117}
6118
Jamie Madill7e4eff12018-08-08 15:49:26 -04006119void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006120{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006121 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04006122 {
6123 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006124 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04006125 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006126}
6127
Jamie Madill7e4eff12018-08-08 15:49:26 -04006128void Context::uniform1i(GLint location, GLint x)
6129{
6130 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
6131}
6132
Jamie Madillc1d770e2017-04-13 17:31:24 -04006133void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
6134{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006135 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006136}
6137
6138void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
6139{
6140 GLfloat xy[2] = {x, y};
6141 Program *program = mGLState.getProgram();
6142 program->setUniform2fv(location, 1, xy);
6143}
6144
6145void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
6146{
6147 Program *program = mGLState.getProgram();
6148 program->setUniform2fv(location, count, v);
6149}
6150
6151void Context::uniform2i(GLint location, GLint x, GLint y)
6152{
6153 GLint xy[2] = {x, y};
6154 Program *program = mGLState.getProgram();
6155 program->setUniform2iv(location, 1, xy);
6156}
6157
6158void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6159{
6160 Program *program = mGLState.getProgram();
6161 program->setUniform2iv(location, count, v);
6162}
6163
6164void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6165{
6166 GLfloat xyz[3] = {x, y, z};
6167 Program *program = mGLState.getProgram();
6168 program->setUniform3fv(location, 1, xyz);
6169}
6170
6171void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6172{
6173 Program *program = mGLState.getProgram();
6174 program->setUniform3fv(location, count, v);
6175}
6176
6177void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6178{
6179 GLint xyz[3] = {x, y, z};
6180 Program *program = mGLState.getProgram();
6181 program->setUniform3iv(location, 1, xyz);
6182}
6183
6184void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6185{
6186 Program *program = mGLState.getProgram();
6187 program->setUniform3iv(location, count, v);
6188}
6189
6190void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6191{
6192 GLfloat xyzw[4] = {x, y, z, w};
6193 Program *program = mGLState.getProgram();
6194 program->setUniform4fv(location, 1, xyzw);
6195}
6196
6197void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6198{
6199 Program *program = mGLState.getProgram();
6200 program->setUniform4fv(location, count, v);
6201}
6202
6203void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6204{
6205 GLint xyzw[4] = {x, y, z, w};
6206 Program *program = mGLState.getProgram();
6207 program->setUniform4iv(location, 1, xyzw);
6208}
6209
6210void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6211{
6212 Program *program = mGLState.getProgram();
6213 program->setUniform4iv(location, count, v);
6214}
6215
6216void Context::uniformMatrix2fv(GLint location,
6217 GLsizei count,
6218 GLboolean transpose,
6219 const GLfloat *value)
6220{
6221 Program *program = mGLState.getProgram();
6222 program->setUniformMatrix2fv(location, count, transpose, value);
6223}
6224
6225void Context::uniformMatrix3fv(GLint location,
6226 GLsizei count,
6227 GLboolean transpose,
6228 const GLfloat *value)
6229{
6230 Program *program = mGLState.getProgram();
6231 program->setUniformMatrix3fv(location, count, transpose, value);
6232}
6233
6234void Context::uniformMatrix4fv(GLint location,
6235 GLsizei count,
6236 GLboolean transpose,
6237 const GLfloat *value)
6238{
6239 Program *program = mGLState.getProgram();
6240 program->setUniformMatrix4fv(location, count, transpose, value);
6241}
6242
6243void Context::validateProgram(GLuint program)
6244{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006245 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006246 ASSERT(programObject);
6247 programObject->validate(mCaps);
6248}
6249
Jiajia Qin5451d532017-11-16 17:16:34 +08006250void Context::validateProgramPipeline(GLuint pipeline)
6251{
6252 UNIMPLEMENTED();
6253}
6254
Jamie Madilld04908b2017-06-09 14:15:35 -04006255void Context::getProgramBinary(GLuint program,
6256 GLsizei bufSize,
6257 GLsizei *length,
6258 GLenum *binaryFormat,
6259 void *binary)
6260{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006261 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006262 ASSERT(programObject != nullptr);
6263
6264 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6265}
6266
6267void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6268{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006269 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006270 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006271
Jamie Madilld04908b2017-06-09 14:15:35 -04006272 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006273 if (programObject->isInUse())
6274 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006275 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006276 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006277 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006278}
6279
Jamie Madillff325f12017-08-26 15:06:05 -04006280void Context::uniform1ui(GLint location, GLuint v0)
6281{
6282 Program *program = mGLState.getProgram();
6283 program->setUniform1uiv(location, 1, &v0);
6284}
6285
6286void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6287{
6288 Program *program = mGLState.getProgram();
6289 const GLuint xy[] = {v0, v1};
6290 program->setUniform2uiv(location, 1, xy);
6291}
6292
6293void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6294{
6295 Program *program = mGLState.getProgram();
6296 const GLuint xyz[] = {v0, v1, v2};
6297 program->setUniform3uiv(location, 1, xyz);
6298}
6299
6300void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6301{
6302 Program *program = mGLState.getProgram();
6303 const GLuint xyzw[] = {v0, v1, v2, v3};
6304 program->setUniform4uiv(location, 1, xyzw);
6305}
6306
6307void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6308{
6309 Program *program = mGLState.getProgram();
6310 program->setUniform1uiv(location, count, value);
6311}
6312void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6313{
6314 Program *program = mGLState.getProgram();
6315 program->setUniform2uiv(location, count, value);
6316}
6317
6318void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6319{
6320 Program *program = mGLState.getProgram();
6321 program->setUniform3uiv(location, count, value);
6322}
6323
6324void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6325{
6326 Program *program = mGLState.getProgram();
6327 program->setUniform4uiv(location, count, value);
6328}
6329
Jamie Madillf0e04492017-08-26 15:28:42 -04006330void Context::genQueries(GLsizei n, GLuint *ids)
6331{
6332 for (GLsizei i = 0; i < n; i++)
6333 {
6334 GLuint handle = mQueryHandleAllocator.allocate();
6335 mQueryMap.assign(handle, nullptr);
6336 ids[i] = handle;
6337 }
6338}
6339
6340void Context::deleteQueries(GLsizei n, const GLuint *ids)
6341{
6342 for (int i = 0; i < n; i++)
6343 {
6344 GLuint query = ids[i];
6345
6346 Query *queryObject = nullptr;
6347 if (mQueryMap.erase(query, &queryObject))
6348 {
6349 mQueryHandleAllocator.release(query);
6350 if (queryObject)
6351 {
6352 queryObject->release(this);
6353 }
6354 }
6355 }
6356}
6357
6358GLboolean Context::isQuery(GLuint id)
6359{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006360 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006361}
6362
Jamie Madillc8c95812017-08-26 18:40:09 -04006363void Context::uniformMatrix2x3fv(GLint location,
6364 GLsizei count,
6365 GLboolean transpose,
6366 const GLfloat *value)
6367{
6368 Program *program = mGLState.getProgram();
6369 program->setUniformMatrix2x3fv(location, count, transpose, value);
6370}
6371
6372void Context::uniformMatrix3x2fv(GLint location,
6373 GLsizei count,
6374 GLboolean transpose,
6375 const GLfloat *value)
6376{
6377 Program *program = mGLState.getProgram();
6378 program->setUniformMatrix3x2fv(location, count, transpose, value);
6379}
6380
6381void Context::uniformMatrix2x4fv(GLint location,
6382 GLsizei count,
6383 GLboolean transpose,
6384 const GLfloat *value)
6385{
6386 Program *program = mGLState.getProgram();
6387 program->setUniformMatrix2x4fv(location, count, transpose, value);
6388}
6389
6390void Context::uniformMatrix4x2fv(GLint location,
6391 GLsizei count,
6392 GLboolean transpose,
6393 const GLfloat *value)
6394{
6395 Program *program = mGLState.getProgram();
6396 program->setUniformMatrix4x2fv(location, count, transpose, value);
6397}
6398
6399void Context::uniformMatrix3x4fv(GLint location,
6400 GLsizei count,
6401 GLboolean transpose,
6402 const GLfloat *value)
6403{
6404 Program *program = mGLState.getProgram();
6405 program->setUniformMatrix3x4fv(location, count, transpose, value);
6406}
6407
6408void Context::uniformMatrix4x3fv(GLint location,
6409 GLsizei count,
6410 GLboolean transpose,
6411 const GLfloat *value)
6412{
6413 Program *program = mGLState.getProgram();
6414 program->setUniformMatrix4x3fv(location, count, transpose, value);
6415}
6416
Jamie Madilld7576732017-08-26 18:49:50 -04006417void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6418{
6419 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6420 {
6421 GLuint vertexArray = arrays[arrayIndex];
6422
6423 if (arrays[arrayIndex] != 0)
6424 {
6425 VertexArray *vertexArrayObject = nullptr;
6426 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6427 {
6428 if (vertexArrayObject != nullptr)
6429 {
6430 detachVertexArray(vertexArray);
6431 vertexArrayObject->onDestroy(this);
6432 }
6433
6434 mVertexArrayHandleAllocator.release(vertexArray);
6435 }
6436 }
6437 }
6438}
6439
6440void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6441{
6442 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6443 {
6444 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6445 mVertexArrayMap.assign(vertexArray, nullptr);
6446 arrays[arrayIndex] = vertexArray;
6447 }
6448}
6449
6450bool Context::isVertexArray(GLuint array)
6451{
6452 if (array == 0)
6453 {
6454 return GL_FALSE;
6455 }
6456
6457 VertexArray *vao = getVertexArray(array);
6458 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6459}
6460
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006461void Context::endTransformFeedback()
6462{
6463 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6464 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006465 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006466}
6467
6468void Context::transformFeedbackVaryings(GLuint program,
6469 GLsizei count,
6470 const GLchar *const *varyings,
6471 GLenum bufferMode)
6472{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006473 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006474 ASSERT(programObject);
6475 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6476}
6477
6478void Context::getTransformFeedbackVarying(GLuint program,
6479 GLuint index,
6480 GLsizei bufSize,
6481 GLsizei *length,
6482 GLsizei *size,
6483 GLenum *type,
6484 GLchar *name)
6485{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006486 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006487 ASSERT(programObject);
6488 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6489}
6490
6491void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6492{
6493 for (int i = 0; i < n; i++)
6494 {
6495 GLuint transformFeedback = ids[i];
6496 if (transformFeedback == 0)
6497 {
6498 continue;
6499 }
6500
6501 TransformFeedback *transformFeedbackObject = nullptr;
6502 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6503 {
6504 if (transformFeedbackObject != nullptr)
6505 {
6506 detachTransformFeedback(transformFeedback);
6507 transformFeedbackObject->release(this);
6508 }
6509
6510 mTransformFeedbackHandleAllocator.release(transformFeedback);
6511 }
6512 }
6513}
6514
6515void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6516{
6517 for (int i = 0; i < n; i++)
6518 {
6519 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6520 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6521 ids[i] = transformFeedback;
6522 }
6523}
6524
6525bool Context::isTransformFeedback(GLuint id)
6526{
6527 if (id == 0)
6528 {
6529 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6530 // returns FALSE
6531 return GL_FALSE;
6532 }
6533
6534 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6535 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6536}
6537
6538void Context::pauseTransformFeedback()
6539{
6540 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6541 transformFeedback->pause();
6542}
6543
6544void Context::resumeTransformFeedback()
6545{
6546 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6547 transformFeedback->resume();
6548}
6549
Jamie Madill12e957f2017-08-26 21:42:26 -04006550void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6551{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006552 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006553 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006554}
6555
Brandon Jones59770802018-04-02 13:18:42 -07006556void Context::getUniformuivRobust(GLuint program,
6557 GLint location,
6558 GLsizei bufSize,
6559 GLsizei *length,
6560 GLuint *params)
6561{
6562 getUniformuiv(program, location, params);
6563}
6564
Jamie Madill12e957f2017-08-26 21:42:26 -04006565GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6566{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006567 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006568 return programObject->getFragDataLocation(name);
6569}
6570
6571void Context::getUniformIndices(GLuint program,
6572 GLsizei uniformCount,
6573 const GLchar *const *uniformNames,
6574 GLuint *uniformIndices)
6575{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006576 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006577 if (!programObject->isLinked())
6578 {
6579 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6580 {
6581 uniformIndices[uniformId] = GL_INVALID_INDEX;
6582 }
6583 }
6584 else
6585 {
6586 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6587 {
6588 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6589 }
6590 }
6591}
6592
6593void Context::getActiveUniformsiv(GLuint program,
6594 GLsizei uniformCount,
6595 const GLuint *uniformIndices,
6596 GLenum pname,
6597 GLint *params)
6598{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006599 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006600 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6601 {
6602 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006603 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006604 }
6605}
6606
6607GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6608{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006609 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006610 return programObject->getUniformBlockIndex(uniformBlockName);
6611}
6612
6613void Context::getActiveUniformBlockiv(GLuint program,
6614 GLuint uniformBlockIndex,
6615 GLenum pname,
6616 GLint *params)
6617{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006618 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006619 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6620}
6621
Brandon Jones59770802018-04-02 13:18:42 -07006622void Context::getActiveUniformBlockivRobust(GLuint program,
6623 GLuint uniformBlockIndex,
6624 GLenum pname,
6625 GLsizei bufSize,
6626 GLsizei *length,
6627 GLint *params)
6628{
6629 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6630}
6631
Jamie Madill12e957f2017-08-26 21:42:26 -04006632void Context::getActiveUniformBlockName(GLuint program,
6633 GLuint uniformBlockIndex,
6634 GLsizei bufSize,
6635 GLsizei *length,
6636 GLchar *uniformBlockName)
6637{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006638 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006639 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6640}
6641
6642void Context::uniformBlockBinding(GLuint program,
6643 GLuint uniformBlockIndex,
6644 GLuint uniformBlockBinding)
6645{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006646 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006647 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006648
Jamie Madill956ab4d2018-10-10 16:13:03 -04006649 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006650 if (programObject->isInUse())
6651 {
6652 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006653 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006654 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006655}
6656
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006657GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6658{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006659 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6660 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006661
Jamie Madill70b5bb02017-08-28 13:32:37 -04006662 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006663 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006664 if (error.isError())
6665 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006666 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006667 handleError(error);
6668 return nullptr;
6669 }
6670
Jamie Madill70b5bb02017-08-28 13:32:37 -04006671 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006672}
6673
6674GLboolean Context::isSync(GLsync sync)
6675{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006676 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006677}
6678
6679GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6680{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006681 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006682
6683 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006684 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006685 return result;
6686}
6687
6688void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6689{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006690 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006691 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006692}
6693
6694void Context::getInteger64v(GLenum pname, GLint64 *params)
6695{
6696 GLenum nativeType = GL_NONE;
6697 unsigned int numParams = 0;
6698 getQueryParameterInfo(pname, &nativeType, &numParams);
6699
6700 if (nativeType == GL_INT_64_ANGLEX)
6701 {
6702 getInteger64vImpl(pname, params);
6703 }
6704 else
6705 {
6706 CastStateValues(this, nativeType, pname, numParams, params);
6707 }
6708}
6709
Brandon Jones59770802018-04-02 13:18:42 -07006710void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6711{
6712 getInteger64v(pname, data);
6713}
6714
Corentin Wallez336129f2017-10-17 15:55:40 -04006715void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006716{
6717 Buffer *buffer = mGLState.getTargetBuffer(target);
6718 QueryBufferParameteri64v(buffer, pname, params);
6719}
6720
Brandon Jones59770802018-04-02 13:18:42 -07006721void Context::getBufferParameteri64vRobust(BufferBinding target,
6722 GLenum pname,
6723 GLsizei bufSize,
6724 GLsizei *length,
6725 GLint64 *params)
6726{
6727 getBufferParameteri64v(target, pname, params);
6728}
6729
Jamie Madill3ef140a2017-08-26 23:11:21 -04006730void Context::genSamplers(GLsizei count, GLuint *samplers)
6731{
6732 for (int i = 0; i < count; i++)
6733 {
6734 samplers[i] = mState.mSamplers->createSampler();
6735 }
6736}
6737
6738void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6739{
6740 for (int i = 0; i < count; i++)
6741 {
6742 GLuint sampler = samplers[i];
6743
6744 if (mState.mSamplers->getSampler(sampler))
6745 {
6746 detachSampler(sampler);
6747 }
6748
6749 mState.mSamplers->deleteObject(this, sampler);
6750 }
6751}
6752
6753void Context::getInternalformativ(GLenum target,
6754 GLenum internalformat,
6755 GLenum pname,
6756 GLsizei bufSize,
6757 GLint *params)
6758{
6759 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6760 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6761}
6762
Brandon Jones59770802018-04-02 13:18:42 -07006763void Context::getInternalformativRobust(GLenum target,
6764 GLenum internalformat,
6765 GLenum pname,
6766 GLsizei bufSize,
6767 GLsizei *length,
6768 GLint *params)
6769{
6770 getInternalformativ(target, internalformat, pname, bufSize, params);
6771}
6772
Jiajia Qin5451d532017-11-16 17:16:34 +08006773void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6774{
6775 programUniform1iv(program, location, 1, &v0);
6776}
6777
6778void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6779{
6780 GLint xy[2] = {v0, v1};
6781 programUniform2iv(program, location, 1, xy);
6782}
6783
6784void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6785{
6786 GLint xyz[3] = {v0, v1, v2};
6787 programUniform3iv(program, location, 1, xyz);
6788}
6789
6790void Context::programUniform4i(GLuint program,
6791 GLint location,
6792 GLint v0,
6793 GLint v1,
6794 GLint v2,
6795 GLint v3)
6796{
6797 GLint xyzw[4] = {v0, v1, v2, v3};
6798 programUniform4iv(program, location, 1, xyzw);
6799}
6800
6801void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6802{
6803 programUniform1uiv(program, location, 1, &v0);
6804}
6805
6806void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6807{
6808 GLuint xy[2] = {v0, v1};
6809 programUniform2uiv(program, location, 1, xy);
6810}
6811
6812void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6813{
6814 GLuint xyz[3] = {v0, v1, v2};
6815 programUniform3uiv(program, location, 1, xyz);
6816}
6817
6818void Context::programUniform4ui(GLuint program,
6819 GLint location,
6820 GLuint v0,
6821 GLuint v1,
6822 GLuint v2,
6823 GLuint v3)
6824{
6825 GLuint xyzw[4] = {v0, v1, v2, v3};
6826 programUniform4uiv(program, location, 1, xyzw);
6827}
6828
6829void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6830{
6831 programUniform1fv(program, location, 1, &v0);
6832}
6833
6834void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6835{
6836 GLfloat xy[2] = {v0, v1};
6837 programUniform2fv(program, location, 1, xy);
6838}
6839
6840void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6841{
6842 GLfloat xyz[3] = {v0, v1, v2};
6843 programUniform3fv(program, location, 1, xyz);
6844}
6845
6846void Context::programUniform4f(GLuint program,
6847 GLint location,
6848 GLfloat v0,
6849 GLfloat v1,
6850 GLfloat v2,
6851 GLfloat v3)
6852{
6853 GLfloat xyzw[4] = {v0, v1, v2, v3};
6854 programUniform4fv(program, location, 1, xyzw);
6855}
6856
Jamie Madill81c2e252017-09-09 23:32:46 -04006857void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6858{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006859 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006860 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006861 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006862}
6863
Jiajia Qin5451d532017-11-16 17:16:34 +08006864void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6865{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006866 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006867 ASSERT(programObject);
6868 programObject->setUniform2iv(location, count, value);
6869}
6870
6871void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6872{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006873 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006874 ASSERT(programObject);
6875 programObject->setUniform3iv(location, count, value);
6876}
6877
6878void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6879{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006880 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006881 ASSERT(programObject);
6882 programObject->setUniform4iv(location, count, value);
6883}
6884
6885void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6886{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006887 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006888 ASSERT(programObject);
6889 programObject->setUniform1uiv(location, count, value);
6890}
6891
6892void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6893{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006894 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006895 ASSERT(programObject);
6896 programObject->setUniform2uiv(location, count, value);
6897}
6898
6899void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6900{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006901 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006902 ASSERT(programObject);
6903 programObject->setUniform3uiv(location, count, value);
6904}
6905
6906void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6907{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006908 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006909 ASSERT(programObject);
6910 programObject->setUniform4uiv(location, count, value);
6911}
6912
6913void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6914{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006915 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006916 ASSERT(programObject);
6917 programObject->setUniform1fv(location, count, value);
6918}
6919
6920void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6921{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006922 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006923 ASSERT(programObject);
6924 programObject->setUniform2fv(location, count, value);
6925}
6926
6927void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6928{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006929 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006930 ASSERT(programObject);
6931 programObject->setUniform3fv(location, count, value);
6932}
6933
6934void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6935{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006936 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006937 ASSERT(programObject);
6938 programObject->setUniform4fv(location, count, value);
6939}
6940
6941void Context::programUniformMatrix2fv(GLuint program,
6942 GLint location,
6943 GLsizei count,
6944 GLboolean transpose,
6945 const GLfloat *value)
6946{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006947 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006948 ASSERT(programObject);
6949 programObject->setUniformMatrix2fv(location, count, transpose, value);
6950}
6951
6952void Context::programUniformMatrix3fv(GLuint program,
6953 GLint location,
6954 GLsizei count,
6955 GLboolean transpose,
6956 const GLfloat *value)
6957{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006958 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006959 ASSERT(programObject);
6960 programObject->setUniformMatrix3fv(location, count, transpose, value);
6961}
6962
6963void Context::programUniformMatrix4fv(GLuint program,
6964 GLint location,
6965 GLsizei count,
6966 GLboolean transpose,
6967 const GLfloat *value)
6968{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006969 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006970 ASSERT(programObject);
6971 programObject->setUniformMatrix4fv(location, count, transpose, value);
6972}
6973
6974void Context::programUniformMatrix2x3fv(GLuint program,
6975 GLint location,
6976 GLsizei count,
6977 GLboolean transpose,
6978 const GLfloat *value)
6979{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006980 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006981 ASSERT(programObject);
6982 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6983}
6984
6985void Context::programUniformMatrix3x2fv(GLuint program,
6986 GLint location,
6987 GLsizei count,
6988 GLboolean transpose,
6989 const GLfloat *value)
6990{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006991 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006992 ASSERT(programObject);
6993 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6994}
6995
6996void Context::programUniformMatrix2x4fv(GLuint program,
6997 GLint location,
6998 GLsizei count,
6999 GLboolean transpose,
7000 const GLfloat *value)
7001{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007002 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007003 ASSERT(programObject);
7004 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
7005}
7006
7007void Context::programUniformMatrix4x2fv(GLuint program,
7008 GLint location,
7009 GLsizei count,
7010 GLboolean transpose,
7011 const GLfloat *value)
7012{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007013 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007014 ASSERT(programObject);
7015 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
7016}
7017
7018void Context::programUniformMatrix3x4fv(GLuint program,
7019 GLint location,
7020 GLsizei count,
7021 GLboolean transpose,
7022 const GLfloat *value)
7023{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007024 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007025 ASSERT(programObject);
7026 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
7027}
7028
7029void Context::programUniformMatrix4x3fv(GLuint program,
7030 GLint location,
7031 GLsizei count,
7032 GLboolean transpose,
7033 const GLfloat *value)
7034{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007035 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007036 ASSERT(programObject);
7037 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
7038}
7039
Jamie Madill81c2e252017-09-09 23:32:46 -04007040void Context::onTextureChange(const Texture *texture)
7041{
7042 // Conservatively assume all textures are dirty.
7043 // TODO(jmadill): More fine-grained update.
7044 mGLState.setObjectDirty(GL_TEXTURE);
7045}
7046
James Darpiniane8a93c62018-01-04 18:02:24 -08007047bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
7048{
7049 return mGLState.isCurrentTransformFeedback(tf);
7050}
James Darpiniane8a93c62018-01-04 18:02:24 -08007051
Yunchao Hea336b902017-08-02 16:05:21 +08007052void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
7053{
7054 for (int i = 0; i < count; i++)
7055 {
7056 pipelines[i] = createProgramPipeline();
7057 }
7058}
7059
7060void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
7061{
7062 for (int i = 0; i < count; i++)
7063 {
7064 if (pipelines[i] != 0)
7065 {
7066 deleteProgramPipeline(pipelines[i]);
7067 }
7068 }
7069}
7070
7071GLboolean Context::isProgramPipeline(GLuint pipeline)
7072{
7073 if (pipeline == 0)
7074 {
7075 return GL_FALSE;
7076 }
7077
7078 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
7079}
7080
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007081void Context::finishFenceNV(GLuint fence)
7082{
7083 FenceNV *fenceObject = getFenceNV(fence);
7084
7085 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04007086 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007087}
7088
7089void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
7090{
7091 FenceNV *fenceObject = getFenceNV(fence);
7092
7093 ASSERT(fenceObject && fenceObject->isSet());
7094
7095 switch (pname)
7096 {
7097 case GL_FENCE_STATUS_NV:
7098 {
7099 // GL_NV_fence spec:
7100 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
7101 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
7102 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
7103 GLboolean status = GL_TRUE;
7104 if (fenceObject->getStatus() != GL_TRUE)
7105 {
Jamie Madilla0691b72018-07-25 10:41:22 -04007106 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007107 }
7108 *params = status;
7109 break;
7110 }
7111
7112 case GL_FENCE_CONDITION_NV:
7113 {
7114 *params = static_cast<GLint>(fenceObject->getCondition());
7115 break;
7116 }
7117
7118 default:
7119 UNREACHABLE();
7120 }
7121}
7122
7123void Context::getTranslatedShaderSource(GLuint shader,
7124 GLsizei bufsize,
7125 GLsizei *length,
7126 GLchar *source)
7127{
7128 Shader *shaderObject = getShader(shader);
7129 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08007130 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007131}
7132
7133void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
7134{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007135 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007136 ASSERT(programObject);
7137
7138 programObject->getUniformfv(this, location, params);
7139}
7140
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007141void Context::getnUniformfvRobust(GLuint program,
7142 GLint location,
7143 GLsizei bufSize,
7144 GLsizei *length,
7145 GLfloat *params)
7146{
7147 UNIMPLEMENTED();
7148}
7149
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007150void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
7151{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007152 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007153 ASSERT(programObject);
7154
7155 programObject->getUniformiv(this, location, params);
7156}
7157
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007158void Context::getnUniformivRobust(GLuint program,
7159 GLint location,
7160 GLsizei bufSize,
7161 GLsizei *length,
7162 GLint *params)
7163{
7164 UNIMPLEMENTED();
7165}
7166
7167void Context::getnUniformuivRobust(GLuint program,
7168 GLint location,
7169 GLsizei bufSize,
7170 GLsizei *length,
7171 GLuint *params)
7172{
7173 UNIMPLEMENTED();
7174}
7175
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007176GLboolean Context::isFenceNV(GLuint fence)
7177{
7178 FenceNV *fenceObject = getFenceNV(fence);
7179
7180 if (fenceObject == nullptr)
7181 {
7182 return GL_FALSE;
7183 }
7184
7185 // GL_NV_fence spec:
7186 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7187 // existing fence.
7188 return fenceObject->isSet();
7189}
7190
7191void Context::readnPixels(GLint x,
7192 GLint y,
7193 GLsizei width,
7194 GLsizei height,
7195 GLenum format,
7196 GLenum type,
7197 GLsizei bufSize,
7198 void *data)
7199{
7200 return readPixels(x, y, width, height, format, type, data);
7201}
7202
Jamie Madill007530e2017-12-28 14:27:04 -05007203void Context::setFenceNV(GLuint fence, GLenum condition)
7204{
7205 ASSERT(condition == GL_ALL_COMPLETED_NV);
7206
7207 FenceNV *fenceObject = getFenceNV(fence);
7208 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04007209 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007210}
7211
7212GLboolean Context::testFenceNV(GLuint fence)
7213{
7214 FenceNV *fenceObject = getFenceNV(fence);
7215
7216 ASSERT(fenceObject != nullptr);
7217 ASSERT(fenceObject->isSet() == GL_TRUE);
7218
7219 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007220 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007221 if (error.isError())
7222 {
7223 handleError(error);
7224 return GL_TRUE;
7225 }
7226
7227 return result;
7228}
7229
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007230void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007231{
7232 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007233 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007234 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007235}
7236
Jamie Madillfa920eb2018-01-04 11:45:50 -05007237void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007238{
7239 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007240 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007241 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7242}
7243
Jamie Madillfa920eb2018-01-04 11:45:50 -05007244void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7245{
7246 UNIMPLEMENTED();
7247}
7248
Jamie Madill5b772312018-03-08 20:28:32 -05007249bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7250{
7251 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7252 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7253 // to the fact that it is stored internally as a float, and so would require conversion
7254 // if returned from Context::getIntegerv. Since this conversion is already implemented
7255 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7256 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7257 // application.
7258 switch (pname)
7259 {
7260 case GL_COMPRESSED_TEXTURE_FORMATS:
7261 {
7262 *type = GL_INT;
7263 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7264 return true;
7265 }
7266 case GL_SHADER_BINARY_FORMATS:
7267 {
7268 *type = GL_INT;
7269 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7270 return true;
7271 }
7272
7273 case GL_MAX_VERTEX_ATTRIBS:
7274 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7275 case GL_MAX_VARYING_VECTORS:
7276 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7277 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7278 case GL_MAX_TEXTURE_IMAGE_UNITS:
7279 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7280 case GL_MAX_RENDERBUFFER_SIZE:
7281 case GL_NUM_SHADER_BINARY_FORMATS:
7282 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7283 case GL_ARRAY_BUFFER_BINDING:
7284 case GL_FRAMEBUFFER_BINDING:
7285 case GL_RENDERBUFFER_BINDING:
7286 case GL_CURRENT_PROGRAM:
7287 case GL_PACK_ALIGNMENT:
7288 case GL_UNPACK_ALIGNMENT:
7289 case GL_GENERATE_MIPMAP_HINT:
7290 case GL_RED_BITS:
7291 case GL_GREEN_BITS:
7292 case GL_BLUE_BITS:
7293 case GL_ALPHA_BITS:
7294 case GL_DEPTH_BITS:
7295 case GL_STENCIL_BITS:
7296 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7297 case GL_CULL_FACE_MODE:
7298 case GL_FRONT_FACE:
7299 case GL_ACTIVE_TEXTURE:
7300 case GL_STENCIL_FUNC:
7301 case GL_STENCIL_VALUE_MASK:
7302 case GL_STENCIL_REF:
7303 case GL_STENCIL_FAIL:
7304 case GL_STENCIL_PASS_DEPTH_FAIL:
7305 case GL_STENCIL_PASS_DEPTH_PASS:
7306 case GL_STENCIL_BACK_FUNC:
7307 case GL_STENCIL_BACK_VALUE_MASK:
7308 case GL_STENCIL_BACK_REF:
7309 case GL_STENCIL_BACK_FAIL:
7310 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7311 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7312 case GL_DEPTH_FUNC:
7313 case GL_BLEND_SRC_RGB:
7314 case GL_BLEND_SRC_ALPHA:
7315 case GL_BLEND_DST_RGB:
7316 case GL_BLEND_DST_ALPHA:
7317 case GL_BLEND_EQUATION_RGB:
7318 case GL_BLEND_EQUATION_ALPHA:
7319 case GL_STENCIL_WRITEMASK:
7320 case GL_STENCIL_BACK_WRITEMASK:
7321 case GL_STENCIL_CLEAR_VALUE:
7322 case GL_SUBPIXEL_BITS:
7323 case GL_MAX_TEXTURE_SIZE:
7324 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7325 case GL_SAMPLE_BUFFERS:
7326 case GL_SAMPLES:
7327 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7328 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7329 case GL_TEXTURE_BINDING_2D:
7330 case GL_TEXTURE_BINDING_CUBE_MAP:
7331 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7332 {
7333 *type = GL_INT;
7334 *numParams = 1;
7335 return true;
7336 }
7337 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7338 {
7339 if (!getExtensions().packReverseRowOrder)
7340 {
7341 return false;
7342 }
7343 *type = GL_INT;
7344 *numParams = 1;
7345 return true;
7346 }
7347 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7348 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7349 {
7350 if (!getExtensions().textureRectangle)
7351 {
7352 return false;
7353 }
7354 *type = GL_INT;
7355 *numParams = 1;
7356 return true;
7357 }
7358 case GL_MAX_DRAW_BUFFERS_EXT:
7359 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7360 {
7361 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7362 {
7363 return false;
7364 }
7365 *type = GL_INT;
7366 *numParams = 1;
7367 return true;
7368 }
7369 case GL_MAX_VIEWPORT_DIMS:
7370 {
7371 *type = GL_INT;
7372 *numParams = 2;
7373 return true;
7374 }
7375 case GL_VIEWPORT:
7376 case GL_SCISSOR_BOX:
7377 {
7378 *type = GL_INT;
7379 *numParams = 4;
7380 return true;
7381 }
7382 case GL_SHADER_COMPILER:
7383 case GL_SAMPLE_COVERAGE_INVERT:
7384 case GL_DEPTH_WRITEMASK:
7385 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7386 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7387 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7388 // bool-natural
7389 case GL_SAMPLE_COVERAGE:
7390 case GL_SCISSOR_TEST:
7391 case GL_STENCIL_TEST:
7392 case GL_DEPTH_TEST:
7393 case GL_BLEND:
7394 case GL_DITHER:
7395 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7396 {
7397 *type = GL_BOOL;
7398 *numParams = 1;
7399 return true;
7400 }
7401 case GL_COLOR_WRITEMASK:
7402 {
7403 *type = GL_BOOL;
7404 *numParams = 4;
7405 return true;
7406 }
7407 case GL_POLYGON_OFFSET_FACTOR:
7408 case GL_POLYGON_OFFSET_UNITS:
7409 case GL_SAMPLE_COVERAGE_VALUE:
7410 case GL_DEPTH_CLEAR_VALUE:
7411 case GL_LINE_WIDTH:
7412 {
7413 *type = GL_FLOAT;
7414 *numParams = 1;
7415 return true;
7416 }
7417 case GL_ALIASED_LINE_WIDTH_RANGE:
7418 case GL_ALIASED_POINT_SIZE_RANGE:
7419 case GL_DEPTH_RANGE:
7420 {
7421 *type = GL_FLOAT;
7422 *numParams = 2;
7423 return true;
7424 }
7425 case GL_COLOR_CLEAR_VALUE:
7426 case GL_BLEND_COLOR:
7427 {
7428 *type = GL_FLOAT;
7429 *numParams = 4;
7430 return true;
7431 }
7432 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7433 if (!getExtensions().textureFilterAnisotropic)
7434 {
7435 return false;
7436 }
7437 *type = GL_FLOAT;
7438 *numParams = 1;
7439 return true;
7440 case GL_TIMESTAMP_EXT:
7441 if (!getExtensions().disjointTimerQuery)
7442 {
7443 return false;
7444 }
7445 *type = GL_INT_64_ANGLEX;
7446 *numParams = 1;
7447 return true;
7448 case GL_GPU_DISJOINT_EXT:
7449 if (!getExtensions().disjointTimerQuery)
7450 {
7451 return false;
7452 }
7453 *type = GL_INT;
7454 *numParams = 1;
7455 return true;
7456 case GL_COVERAGE_MODULATION_CHROMIUM:
7457 if (!getExtensions().framebufferMixedSamples)
7458 {
7459 return false;
7460 }
7461 *type = GL_INT;
7462 *numParams = 1;
7463 return true;
7464 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7465 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7466 {
7467 return false;
7468 }
7469 *type = GL_INT;
7470 *numParams = 1;
7471 return true;
7472 }
7473
7474 if (getExtensions().debug)
7475 {
7476 switch (pname)
7477 {
7478 case GL_DEBUG_LOGGED_MESSAGES:
7479 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7480 case GL_DEBUG_GROUP_STACK_DEPTH:
7481 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7482 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7483 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7484 case GL_MAX_LABEL_LENGTH:
7485 *type = GL_INT;
7486 *numParams = 1;
7487 return true;
7488
7489 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7490 case GL_DEBUG_OUTPUT:
7491 *type = GL_BOOL;
7492 *numParams = 1;
7493 return true;
7494 }
7495 }
7496
7497 if (getExtensions().multisampleCompatibility)
7498 {
7499 switch (pname)
7500 {
7501 case GL_MULTISAMPLE_EXT:
7502 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7503 *type = GL_BOOL;
7504 *numParams = 1;
7505 return true;
7506 }
7507 }
7508
7509 if (getExtensions().pathRendering)
7510 {
7511 switch (pname)
7512 {
7513 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7514 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7515 *type = GL_FLOAT;
7516 *numParams = 16;
7517 return true;
7518 }
7519 }
7520
7521 if (getExtensions().bindGeneratesResource)
7522 {
7523 switch (pname)
7524 {
7525 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7526 *type = GL_BOOL;
7527 *numParams = 1;
7528 return true;
7529 }
7530 }
7531
7532 if (getExtensions().clientArrays)
7533 {
7534 switch (pname)
7535 {
7536 case GL_CLIENT_ARRAYS_ANGLE:
7537 *type = GL_BOOL;
7538 *numParams = 1;
7539 return true;
7540 }
7541 }
7542
7543 if (getExtensions().sRGBWriteControl)
7544 {
7545 switch (pname)
7546 {
7547 case GL_FRAMEBUFFER_SRGB_EXT:
7548 *type = GL_BOOL;
7549 *numParams = 1;
7550 return true;
7551 }
7552 }
7553
7554 if (getExtensions().robustResourceInitialization &&
7555 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7556 {
7557 *type = GL_BOOL;
7558 *numParams = 1;
7559 return true;
7560 }
7561
7562 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7563 {
7564 *type = GL_BOOL;
7565 *numParams = 1;
7566 return true;
7567 }
7568
jchen1082af6202018-06-22 10:59:52 +08007569 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7570 {
7571 *type = GL_INT;
7572 *numParams = 1;
7573 return true;
7574 }
7575
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007576 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7577 {
7578 *type = GL_INT;
7579 *numParams = 1;
7580 return true;
7581 }
7582
Jamie Madill5b772312018-03-08 20:28:32 -05007583 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7584 switch (pname)
7585 {
7586 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7587 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7588 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7589 {
7590 return false;
7591 }
7592 *type = GL_INT;
7593 *numParams = 1;
7594 return true;
7595
7596 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7597 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7598 {
7599 return false;
7600 }
7601 *type = GL_INT;
7602 *numParams = 1;
7603 return true;
7604
7605 case GL_PROGRAM_BINARY_FORMATS_OES:
7606 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7607 {
7608 return false;
7609 }
7610 *type = GL_INT;
7611 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7612 return true;
7613
7614 case GL_PACK_ROW_LENGTH:
7615 case GL_PACK_SKIP_ROWS:
7616 case GL_PACK_SKIP_PIXELS:
7617 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7618 {
7619 return false;
7620 }
7621 *type = GL_INT;
7622 *numParams = 1;
7623 return true;
7624 case GL_UNPACK_ROW_LENGTH:
7625 case GL_UNPACK_SKIP_ROWS:
7626 case GL_UNPACK_SKIP_PIXELS:
7627 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7628 {
7629 return false;
7630 }
7631 *type = GL_INT;
7632 *numParams = 1;
7633 return true;
7634 case GL_VERTEX_ARRAY_BINDING:
7635 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7636 {
7637 return false;
7638 }
7639 *type = GL_INT;
7640 *numParams = 1;
7641 return true;
7642 case GL_PIXEL_PACK_BUFFER_BINDING:
7643 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7644 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7645 {
7646 return false;
7647 }
7648 *type = GL_INT;
7649 *numParams = 1;
7650 return true;
7651 case GL_MAX_SAMPLES:
7652 {
7653 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7654 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7655 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7656 {
7657 return false;
7658 }
7659 *type = GL_INT;
7660 *numParams = 1;
7661 return true;
7662
7663 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7664 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7665 {
7666 return false;
7667 }
7668 *type = GL_INT;
7669 *numParams = 1;
7670 return true;
7671 }
7672 }
7673
7674 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7675 {
7676 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7677 {
7678 return false;
7679 }
7680 *type = GL_INT;
7681 *numParams = 1;
7682 return true;
7683 }
7684
7685 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7686 {
7687 *type = GL_INT;
7688 *numParams = 1;
7689 return true;
7690 }
7691
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007692 if (getClientVersion() < Version(2, 0))
7693 {
7694 switch (pname)
7695 {
7696 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007697 case GL_CLIENT_ACTIVE_TEXTURE:
7698 case GL_MATRIX_MODE:
7699 case GL_MAX_TEXTURE_UNITS:
7700 case GL_MAX_MODELVIEW_STACK_DEPTH:
7701 case GL_MAX_PROJECTION_STACK_DEPTH:
7702 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007703 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007704 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007705 case GL_VERTEX_ARRAY_STRIDE:
7706 case GL_NORMAL_ARRAY_STRIDE:
7707 case GL_COLOR_ARRAY_STRIDE:
7708 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7709 case GL_VERTEX_ARRAY_SIZE:
7710 case GL_COLOR_ARRAY_SIZE:
7711 case GL_TEXTURE_COORD_ARRAY_SIZE:
7712 case GL_VERTEX_ARRAY_TYPE:
7713 case GL_NORMAL_ARRAY_TYPE:
7714 case GL_COLOR_ARRAY_TYPE:
7715 case GL_TEXTURE_COORD_ARRAY_TYPE:
7716 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7717 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7718 case GL_COLOR_ARRAY_BUFFER_BINDING:
7719 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7720 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7721 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7722 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007723 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007724 case GL_MODELVIEW_STACK_DEPTH:
7725 case GL_PROJECTION_STACK_DEPTH:
7726 case GL_TEXTURE_STACK_DEPTH:
7727 case GL_LOGIC_OP_MODE:
7728 case GL_BLEND_SRC:
7729 case GL_BLEND_DST:
7730 case GL_PERSPECTIVE_CORRECTION_HINT:
7731 case GL_POINT_SMOOTH_HINT:
7732 case GL_LINE_SMOOTH_HINT:
7733 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007734 *type = GL_INT;
7735 *numParams = 1;
7736 return true;
7737 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007738 case GL_FOG_DENSITY:
7739 case GL_FOG_START:
7740 case GL_FOG_END:
7741 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007742 case GL_POINT_SIZE:
7743 case GL_POINT_SIZE_MIN:
7744 case GL_POINT_SIZE_MAX:
7745 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007746 *type = GL_FLOAT;
7747 *numParams = 1;
7748 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007749 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007750 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007751 *type = GL_FLOAT;
7752 *numParams = 2;
7753 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007754 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007755 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007756 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007757 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007758 *type = GL_FLOAT;
7759 *numParams = 4;
7760 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007761 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007762 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007763 *type = GL_FLOAT;
7764 *numParams = 3;
7765 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007766 case GL_MODELVIEW_MATRIX:
7767 case GL_PROJECTION_MATRIX:
7768 case GL_TEXTURE_MATRIX:
7769 *type = GL_FLOAT;
7770 *numParams = 16;
7771 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007772 case GL_LIGHT_MODEL_TWO_SIDE:
7773 *type = GL_BOOL;
7774 *numParams = 1;
7775 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007776 }
7777 }
7778
Jamie Madill5b772312018-03-08 20:28:32 -05007779 if (getClientVersion() < Version(3, 0))
7780 {
7781 return false;
7782 }
7783
7784 // Check for ES3.0+ parameter names
7785 switch (pname)
7786 {
7787 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7788 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7789 case GL_UNIFORM_BUFFER_BINDING:
7790 case GL_TRANSFORM_FEEDBACK_BINDING:
7791 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7792 case GL_COPY_READ_BUFFER_BINDING:
7793 case GL_COPY_WRITE_BUFFER_BINDING:
7794 case GL_SAMPLER_BINDING:
7795 case GL_READ_BUFFER:
7796 case GL_TEXTURE_BINDING_3D:
7797 case GL_TEXTURE_BINDING_2D_ARRAY:
7798 case GL_MAX_3D_TEXTURE_SIZE:
7799 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7800 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7801 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7802 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7803 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7804 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7805 case GL_MAX_VARYING_COMPONENTS:
7806 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7807 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7808 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7809 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7810 case GL_NUM_EXTENSIONS:
7811 case GL_MAJOR_VERSION:
7812 case GL_MINOR_VERSION:
7813 case GL_MAX_ELEMENTS_INDICES:
7814 case GL_MAX_ELEMENTS_VERTICES:
7815 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7816 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7817 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7818 case GL_UNPACK_IMAGE_HEIGHT:
7819 case GL_UNPACK_SKIP_IMAGES:
7820 {
7821 *type = GL_INT;
7822 *numParams = 1;
7823 return true;
7824 }
7825
7826 case GL_MAX_ELEMENT_INDEX:
7827 case GL_MAX_UNIFORM_BLOCK_SIZE:
7828 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7829 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7830 case GL_MAX_SERVER_WAIT_TIMEOUT:
7831 {
7832 *type = GL_INT_64_ANGLEX;
7833 *numParams = 1;
7834 return true;
7835 }
7836
7837 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7838 case GL_TRANSFORM_FEEDBACK_PAUSED:
7839 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7840 case GL_RASTERIZER_DISCARD:
7841 {
7842 *type = GL_BOOL;
7843 *numParams = 1;
7844 return true;
7845 }
7846
7847 case GL_MAX_TEXTURE_LOD_BIAS:
7848 {
7849 *type = GL_FLOAT;
7850 *numParams = 1;
7851 return true;
7852 }
7853 }
7854
7855 if (getExtensions().requestExtension)
7856 {
7857 switch (pname)
7858 {
7859 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7860 *type = GL_INT;
7861 *numParams = 1;
7862 return true;
7863 }
7864 }
7865
Yizhou Jiang7818a852018-09-06 15:02:04 +08007866 if (getExtensions().textureMultisample)
7867 {
7868 switch (pname)
7869 {
7870 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7871 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7872 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7873 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
7874 *type = GL_INT;
7875 *numParams = 1;
7876 return true;
7877 }
7878 }
7879
Jamie Madill5b772312018-03-08 20:28:32 -05007880 if (getClientVersion() < Version(3, 1))
7881 {
7882 return false;
7883 }
7884
7885 switch (pname)
7886 {
7887 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7888 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7889 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7890 case GL_MAX_FRAMEBUFFER_WIDTH:
7891 case GL_MAX_FRAMEBUFFER_HEIGHT:
7892 case GL_MAX_FRAMEBUFFER_SAMPLES:
7893 case GL_MAX_SAMPLE_MASK_WORDS:
7894 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7895 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7896 case GL_MAX_INTEGER_SAMPLES:
7897 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7898 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7899 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7900 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7901 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7902 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7903 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7904 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7905 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7906 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7907 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7908 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7909 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7910 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7911 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7912 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7913 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7914 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7915 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7916 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7917 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7918 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7919 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7920 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7921 case GL_MAX_UNIFORM_LOCATIONS:
7922 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7923 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7924 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7925 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7926 case GL_MAX_IMAGE_UNITS:
7927 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7928 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7929 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7930 case GL_SHADER_STORAGE_BUFFER_BINDING:
7931 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7932 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007933 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007934 *type = GL_INT;
7935 *numParams = 1;
7936 return true;
7937 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7938 *type = GL_INT_64_ANGLEX;
7939 *numParams = 1;
7940 return true;
7941 case GL_SAMPLE_MASK:
7942 *type = GL_BOOL;
7943 *numParams = 1;
7944 return true;
7945 }
7946
7947 if (getExtensions().geometryShader)
7948 {
7949 switch (pname)
7950 {
7951 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7952 case GL_LAYER_PROVOKING_VERTEX_EXT:
7953 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7954 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7955 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7956 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7957 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7958 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7959 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7960 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7961 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7962 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7963 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7964 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7965 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7966 *type = GL_INT;
7967 *numParams = 1;
7968 return true;
7969 }
7970 }
7971
7972 return false;
7973}
7974
7975bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7976{
7977 if (getClientVersion() < Version(3, 0))
7978 {
7979 return false;
7980 }
7981
7982 switch (target)
7983 {
7984 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7985 case GL_UNIFORM_BUFFER_BINDING:
7986 {
7987 *type = GL_INT;
7988 *numParams = 1;
7989 return true;
7990 }
7991 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7992 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7993 case GL_UNIFORM_BUFFER_START:
7994 case GL_UNIFORM_BUFFER_SIZE:
7995 {
7996 *type = GL_INT_64_ANGLEX;
7997 *numParams = 1;
7998 return true;
7999 }
8000 }
8001
8002 if (getClientVersion() < Version(3, 1))
8003 {
8004 return false;
8005 }
8006
8007 switch (target)
8008 {
8009 case GL_IMAGE_BINDING_LAYERED:
8010 {
8011 *type = GL_BOOL;
8012 *numParams = 1;
8013 return true;
8014 }
8015 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
8016 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
8017 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
8018 case GL_SHADER_STORAGE_BUFFER_BINDING:
8019 case GL_VERTEX_BINDING_BUFFER:
8020 case GL_VERTEX_BINDING_DIVISOR:
8021 case GL_VERTEX_BINDING_OFFSET:
8022 case GL_VERTEX_BINDING_STRIDE:
8023 case GL_SAMPLE_MASK_VALUE:
8024 case GL_IMAGE_BINDING_NAME:
8025 case GL_IMAGE_BINDING_LEVEL:
8026 case GL_IMAGE_BINDING_LAYER:
8027 case GL_IMAGE_BINDING_ACCESS:
8028 case GL_IMAGE_BINDING_FORMAT:
8029 {
8030 *type = GL_INT;
8031 *numParams = 1;
8032 return true;
8033 }
8034 case GL_ATOMIC_COUNTER_BUFFER_START:
8035 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
8036 case GL_SHADER_STORAGE_BUFFER_START:
8037 case GL_SHADER_STORAGE_BUFFER_SIZE:
8038 {
8039 *type = GL_INT_64_ANGLEX;
8040 *numParams = 1;
8041 return true;
8042 }
8043 }
8044
8045 return false;
8046}
8047
Jamie Madill44a6fbf2018-10-02 13:38:56 -04008048Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05008049{
8050 return mState.mShaderPrograms->getProgram(handle);
8051}
8052
8053Shader *Context::getShader(GLuint handle) const
8054{
8055 return mState.mShaderPrograms->getShader(handle);
8056}
8057
Jamie Madill5b772312018-03-08 20:28:32 -05008058bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
8059{
8060 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
8061}
8062
8063bool Context::isFramebufferGenerated(GLuint framebuffer) const
8064{
8065 return mState.mFramebuffers->isHandleGenerated(framebuffer);
8066}
8067
8068bool Context::isProgramPipelineGenerated(GLuint pipeline) const
8069{
8070 return mState.mPipelines->isHandleGenerated(pipeline);
8071}
8072
8073bool Context::usingDisplayTextureShareGroup() const
8074{
8075 return mDisplayTextureShareGroup;
8076}
8077
8078GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
8079{
8080 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
8081 internalformat == GL_DEPTH_STENCIL
8082 ? GL_DEPTH24_STENCIL8
8083 : internalformat;
8084}
8085
jchen1082af6202018-06-22 10:59:52 +08008086void Context::maxShaderCompilerThreads(GLuint count)
8087{
jchen107ae70d82018-07-06 13:47:01 +08008088 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08008089 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08008090 // A count of zero specifies a request for no parallel compiling or linking.
8091 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
8092 {
8093 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
8094 }
8095 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08008096}
8097
Jamie Madill2eb65032018-07-30 10:25:57 -04008098bool Context::isGLES1() const
8099{
8100 return mState.getClientVersion() < Version(2, 0);
8101}
8102
Jamie Madilla11819d2018-07-30 10:26:01 -04008103void Context::onSubjectStateChange(const Context *context,
8104 angle::SubjectIndex index,
8105 angle::SubjectMessage message)
8106{
Jamie Madilla11819d2018-07-30 10:26:01 -04008107 switch (index)
8108 {
8109 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008110 switch (message)
8111 {
8112 case angle::SubjectMessage::CONTENTS_CHANGED:
8113 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
8114 mStateCache.onVertexArrayBufferContentsChange(this);
8115 break;
8116 case angle::SubjectMessage::RESOURCE_MAPPED:
8117 case angle::SubjectMessage::RESOURCE_UNMAPPED:
8118 case angle::SubjectMessage::BINDING_CHANGED:
8119 mStateCache.onVertexArrayBufferStateChange(this);
8120 break;
8121 default:
8122 break;
8123 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008124 break;
8125
8126 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008127 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8128 {
8129 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
8130 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008131 break;
8132
8133 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008134 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8135 {
8136 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
8137 }
8138 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04008139 break;
8140
8141 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04008142 if (index < kTextureMaxSubjectIndex)
8143 {
8144 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04008145 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008146 }
Jamie Madille25b8002018-09-20 13:39:49 -04008147 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04008148 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04008149 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04008150 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008151 }
Jamie Madille25b8002018-09-20 13:39:49 -04008152 else
8153 {
8154 ASSERT(index < kSamplerMaxSubjectIndex);
8155 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
8156 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008157 break;
8158 }
8159}
8160
Jamie Madill6b873dd2018-07-12 23:56:30 -04008161// ErrorSet implementation.
8162ErrorSet::ErrorSet(Context *context) : mContext(context)
8163{
8164}
8165
8166ErrorSet::~ErrorSet() = default;
8167
Jamie Madill306b6c12018-07-27 08:12:49 -04008168void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04008169{
8170 // This internal enum is used to filter internal errors that are already handled.
8171 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
8172 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
8173 {
8174 return;
8175 }
8176
8177 if (ANGLE_UNLIKELY(error.isError()))
8178 {
8179 GLenum code = error.getCode();
8180 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04008181
Jamie Madill6b873dd2018-07-12 23:56:30 -04008182 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8183 {
8184 mContext->markContextLost();
8185 }
8186
8187 ASSERT(!error.getMessage().empty());
8188 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8189 error.getID(), GL_DEBUG_SEVERITY_HIGH,
8190 error.getMessage());
8191 }
8192}
8193
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008194void ErrorSet::handleError(GLenum errorCode,
8195 const char *message,
8196 const char *file,
8197 const char *function,
8198 unsigned int line)
8199{
8200 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
8201 std::stringstream errorStream;
8202 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
8203 << function << ":" << line << ". " << message;
8204
8205 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
8206}
8207
Jamie Madilla139f012018-10-10 16:13:03 -04008208void ErrorSet::validationError(GLenum errorCode, const char *message)
8209{
8210 handleError(gl::Error(errorCode, message));
8211}
8212
Jamie Madill6b873dd2018-07-12 23:56:30 -04008213bool ErrorSet::empty() const
8214{
8215 return mErrors.empty();
8216}
8217
8218GLenum ErrorSet::popError()
8219{
8220 ASSERT(!empty());
8221 GLenum error = *mErrors.begin();
8222 mErrors.erase(mErrors.begin());
8223 return error;
8224}
Jamie Madilldc358af2018-07-31 11:22:13 -04008225
8226// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008227StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008228 : mCachedHasAnyEnabledClientAttrib(false),
8229 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008230 mCachedInstancedVertexElementLimit(0),
8231 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008232{
8233}
8234
8235StateCache::~StateCache() = default;
8236
Jamie Madillac66f982018-10-09 18:30:01 -04008237void StateCache::initialize(Context *context)
8238{
8239 updateValidDrawModes(context);
8240 updateValidBindTextureTypes(context);
8241}
8242
Jamie Madilldc358af2018-07-31 11:22:13 -04008243void StateCache::updateActiveAttribsMask(Context *context)
8244{
8245 bool isGLES1 = context->isGLES1();
8246 const State &glState = context->getGLState();
8247
8248 if (!isGLES1 && !glState.getProgram())
8249 {
8250 mCachedActiveBufferedAttribsMask = AttributesMask();
8251 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008252 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008253 return;
8254 }
8255
8256 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8257 : glState.getProgram()->getActiveAttribLocationsMask();
8258
8259 const VertexArray *vao = glState.getVertexArray();
8260 ASSERT(vao);
8261
8262 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8263 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008264 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008265
Jamie Madill0a17e482018-08-31 17:19:11 -04008266 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8267 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008268 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008269 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8270}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008271
8272void StateCache::updateVertexElementLimits(Context *context)
8273{
8274 const VertexArray *vao = context->getGLState().getVertexArray();
8275
8276 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8277 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8278
8279 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8280 // If there are no buffered attributes then we should not limit the draw call count.
8281 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8282 {
8283 return;
8284 }
8285
8286 const auto &vertexAttribs = vao->getVertexAttributes();
8287 const auto &vertexBindings = vao->getVertexBindings();
8288
8289 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8290 {
8291 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8292 ASSERT(attrib.enabled);
8293
8294 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8295 ASSERT(context->isGLES1() ||
8296 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8297
8298 GLint64 limit = attrib.getCachedElementLimit();
8299 if (binding.getDivisor() > 0)
8300 {
8301 mCachedInstancedVertexElementLimit =
8302 std::min(mCachedInstancedVertexElementLimit, limit);
8303 }
8304 else
8305 {
8306 mCachedNonInstancedVertexElementLimit =
8307 std::min(mCachedNonInstancedVertexElementLimit, limit);
8308 }
8309 }
8310}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008311
Jamie Madilld84b6732018-09-06 15:54:35 -04008312void StateCache::updateBasicDrawStatesError()
8313{
8314 mCachedBasicDrawStatesError = kInvalidPointer;
8315}
8316
8317intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8318{
8319 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8320 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8321 return mCachedBasicDrawStatesError;
8322}
8323
Jamie Madillc43cdad2018-08-08 15:49:25 -04008324void StateCache::onVertexArrayBindingChange(Context *context)
8325{
8326 updateActiveAttribsMask(context);
8327 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008328 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008329}
8330
8331void StateCache::onProgramExecutableChange(Context *context)
8332{
8333 updateActiveAttribsMask(context);
8334 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008335 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008336 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008337}
8338
Jamie Madilld84b6732018-09-06 15:54:35 -04008339void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008340{
8341 updateVertexElementLimits(context);
8342}
8343
Jamie Madilld84b6732018-09-06 15:54:35 -04008344void StateCache::onVertexArrayBufferContentsChange(Context *context)
8345{
8346 updateVertexElementLimits(context);
8347 updateBasicDrawStatesError();
8348}
8349
Jamie Madillc43cdad2018-08-08 15:49:25 -04008350void StateCache::onVertexArrayStateChange(Context *context)
8351{
8352 updateActiveAttribsMask(context);
8353 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008354 updateBasicDrawStatesError();
8355}
8356
8357void StateCache::onVertexArrayBufferStateChange(Context *context)
8358{
8359 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008360}
8361
8362void StateCache::onGLES1ClientStateChange(Context *context)
8363{
8364 updateActiveAttribsMask(context);
8365}
Jamie Madilld84b6732018-09-06 15:54:35 -04008366
8367void StateCache::onDrawFramebufferChange(Context *context)
8368{
8369 updateBasicDrawStatesError();
8370}
8371
8372void StateCache::onContextCapChange(Context *context)
8373{
8374 updateBasicDrawStatesError();
8375}
8376
8377void StateCache::onStencilStateChange(Context *context)
8378{
8379 updateBasicDrawStatesError();
8380}
8381
8382void StateCache::onDefaultVertexAttributeChange(Context *context)
8383{
8384 updateBasicDrawStatesError();
8385}
8386
8387void StateCache::onActiveTextureChange(Context *context)
8388{
8389 updateBasicDrawStatesError();
8390}
8391
8392void StateCache::onQueryChange(Context *context)
8393{
8394 updateBasicDrawStatesError();
8395}
8396
8397void StateCache::onTransformFeedbackChange(Context *context)
8398{
8399 updateBasicDrawStatesError();
8400}
8401
8402void StateCache::onUniformBufferStateChange(Context *context)
8403{
8404 updateBasicDrawStatesError();
8405}
8406
8407void StateCache::onBufferBindingChange(Context *context)
8408{
8409 updateBasicDrawStatesError();
8410}
Jamie Madill526a6f62018-09-12 11:03:05 -04008411
8412void StateCache::updateValidDrawModes(Context *context)
8413{
8414 Program *program = context->getGLState().getProgram();
8415 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8416 {
8417 mCachedValidDrawModes = {{
8418 true, /* Points */
8419 true, /* Lines */
8420 true, /* LineLoop */
8421 true, /* LineStrip */
8422 true, /* Triangles */
8423 true, /* TriangleStrip */
8424 true, /* TriangleFan */
8425 false, /* LinesAdjacency */
8426 false, /* LineStripAdjacency */
8427 false, /* TrianglesAdjacency */
8428 false, /* TriangleStripAdjacency */
8429 false, /* InvalidEnum */
8430 }};
8431 }
8432 else
8433 {
8434 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8435
8436 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8437
8438 mCachedValidDrawModes = {{
8439 gsMode == PrimitiveMode::Points, /* Points */
8440 gsMode == PrimitiveMode::Lines, /* Lines */
8441 gsMode == PrimitiveMode::Lines, /* LineLoop */
8442 gsMode == PrimitiveMode::Lines, /* LineStrip */
8443 gsMode == PrimitiveMode::Triangles, /* Triangles */
8444 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8445 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8446 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8447 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8448 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8449 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8450 false, /* InvalidEnum */
8451 }};
8452 }
8453}
Jamie Madillac66f982018-10-09 18:30:01 -04008454
8455void StateCache::updateValidBindTextureTypes(Context *context)
8456{
8457 const Extensions &exts = context->getExtensions();
8458 bool isGLES3 = context->getClientMajorVersion() >= 3;
8459 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8460
8461 mCachedValidBindTextureTypes = {{
8462 true, /* _2D */
8463 isGLES3, /* _2DArray */
Yizhou Jiang7818a852018-09-06 15:02:04 +08008464 isGLES31 || exts.textureMultisample, /* _2DMultisample */
Jamie Madillac66f982018-10-09 18:30:01 -04008465 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8466 isGLES3, /* _3D */
8467 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8468 exts.textureRectangle, /* Rectangle */
8469 true, /* CubeMap */
8470 false, /* InvalidEnum */
8471
8472 }};
8473}
Jamie Madillc29968b2016-01-20 11:17:23 -05008474} // namespace gl