blob: 8cc877424ead163e8244ddd3ae7a5806d4cfc71a [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{
Shahbaz Youssefi905ee082018-10-26 16:16:34 -0400548 // Trigger a finish() to make sure resources are not in use upon destruction. Particularly
549 // necessary for Vulkan.
550 finish();
551
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700552 if (mGLES1Renderer)
553 {
554 mGLES1Renderer->onDestroy(this, &mGLState);
555 }
556
Jamie Madille7b3fe22018-04-05 09:42:46 -0400557 ANGLE_TRY(releaseSurface(display));
558
Corentin Wallez80b24112015-08-25 16:41:57 -0400559 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000560 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400561 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000562 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400563 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000564
Corentin Wallez80b24112015-08-25 16:41:57 -0400565 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000566 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400567 if (query.second != nullptr)
568 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400569 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400570 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000571 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400572 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000573
Corentin Wallez80b24112015-08-25 16:41:57 -0400574 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400575 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400576 if (vertexArray.second)
577 {
578 vertexArray.second->onDestroy(this);
579 }
Jamie Madill57a89722013-07-02 11:57:03 -0400580 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400581 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400582
Corentin Wallez80b24112015-08-25 16:41:57 -0400583 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500584 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500585 if (transformFeedback.second != nullptr)
586 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500587 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500588 }
Geoff Langc8058452014-02-03 12:04:11 -0500589 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400590 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500591
Jamie Madill5b772312018-03-08 20:28:32 -0500592 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400593 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800594 if (zeroTexture.get() != nullptr)
595 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400596 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800597 zeroTexture.set(this, nullptr);
598 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400599 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000600
Jamie Madill2f348d22017-06-05 10:50:59 -0400601 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500602
Jamie Madill4928b7c2017-06-20 12:57:39 -0400603 mGLState.reset(this);
604
Jamie Madill6c1f6712017-02-14 19:08:04 -0500605 mState.mBuffers->release(this);
606 mState.mShaderPrograms->release(this);
607 mState.mTextures->release(this);
608 mState.mRenderbuffers->release(this);
609 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400610 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500611 mState.mPaths->release(this);
612 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800613 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400614
jchen107ae70d82018-07-06 13:47:01 +0800615 mThreadPool.reset();
616
Jamie Madill76e471e2017-10-21 09:56:01 -0400617 mImplementation->onDestroy(this);
618
Jamie Madill4928b7c2017-06-20 12:57:39 -0400619 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000620}
621
Jamie Madill70ee0f62017-02-06 16:04:20 -0500622Context::~Context()
623{
624}
625
Geoff Lang75359662018-04-11 01:42:27 -0400626void Context::setLabel(EGLLabelKHR label)
627{
628 mLabel = label;
629}
630
631EGLLabelKHR Context::getLabel() const
632{
633 return mLabel;
634}
635
Jamie Madill4928b7c2017-06-20 12:57:39 -0400636egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000637{
Jamie Madill61e16b42017-06-19 11:13:23 -0400638 mCurrentDisplay = display;
639
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000640 if (!mHasBeenCurrent)
641 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400642 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000643 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500644 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400645 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000646
Corentin Wallezc295e512017-01-27 17:47:50 -0500647 int width = 0;
648 int height = 0;
649 if (surface != nullptr)
650 {
651 width = surface->getWidth();
652 height = surface->getHeight();
653 }
654
655 mGLState.setViewportParams(0, 0, width, height);
656 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000657
658 mHasBeenCurrent = true;
659 }
660
Jamie Madill1b94d432015-08-07 13:23:23 -0400661 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700662 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400663 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400664
Jamie Madill4928b7c2017-06-20 12:57:39 -0400665 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500666
667 Framebuffer *newDefault = nullptr;
668 if (surface != nullptr)
669 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400670 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500671 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400672 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500673 }
674 else
675 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400676 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500677 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000678
Corentin Wallez37c39792015-08-20 14:19:46 -0400679 // Update default framebuffer, the binding of the previous default
680 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400681 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400682 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700683 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400684 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400685 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400686 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700687 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400688 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400689 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400690 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400691 }
Ian Ewell292f0052016-02-04 10:37:32 -0500692
Jamie Madill32643ce2018-10-19 11:38:03 -0400693 // Notify the renderer of a context switch.
694 // TODO(jmadill): Fix this error handling. http://anglebug.com/2491
695 (void)(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400696 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000697}
698
Jamie Madill4928b7c2017-06-20 12:57:39 -0400699egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400700{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400701 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400702
Geoff Langbf7b95d2018-05-01 16:48:21 -0400703 // Remove the default framebuffer
704 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500705 {
706 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400707 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500708 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400709
710 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500711 {
712 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400713 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500714 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400715
716 if (defaultFramebuffer)
717 {
718 defaultFramebuffer->onDestroy(this);
719 delete defaultFramebuffer;
720 }
721
Corentin Wallezc295e512017-01-27 17:47:50 -0500722 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
723
724 if (mCurrentSurface)
725 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400726 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500727 mCurrentSurface = nullptr;
728 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400729
730 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400731}
732
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000733GLuint Context::createBuffer()
734{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500735 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000736}
737
738GLuint Context::createProgram()
739{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500740 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000741}
742
Jiawei Shao385b3e02018-03-21 09:43:28 +0800743GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000744{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500745 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000746}
747
748GLuint Context::createTexture()
749{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500750 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000751}
752
753GLuint Context::createRenderbuffer()
754{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500755 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000756}
757
Jamie Madill13951342018-09-30 15:24:28 -0400758void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
759{
760 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
761}
762
Brandon Jones59770802018-04-02 13:18:42 -0700763GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300764{
Jamie Madill13951342018-09-30 15:24:28 -0400765 GLuint created = 0;
766 tryGenPaths(range, &created);
767 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300768}
769
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000770// Returns an unused framebuffer name
771GLuint Context::createFramebuffer()
772{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500773 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000774}
775
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500776void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000777{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500778 for (int i = 0; i < n; i++)
779 {
780 GLuint handle = mFenceNVHandleAllocator.allocate();
781 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
782 fences[i] = handle;
783 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000784}
785
Yunchao Hea336b902017-08-02 16:05:21 +0800786GLuint Context::createProgramPipeline()
787{
788 return mState.mPipelines->createProgramPipeline();
789}
790
Jiawei Shao385b3e02018-03-21 09:43:28 +0800791GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800792{
793 UNIMPLEMENTED();
794 return 0u;
795}
796
James Darpinian4d9d4832018-03-13 12:43:28 -0700797void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000798{
James Darpinian4d9d4832018-03-13 12:43:28 -0700799 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
800 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000801 {
802 detachBuffer(buffer);
803 }
Jamie Madill893ab082014-05-16 16:56:10 -0400804
James Darpinian4d9d4832018-03-13 12:43:28 -0700805 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000806}
807
808void Context::deleteShader(GLuint shader)
809{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500810 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000811}
812
813void Context::deleteProgram(GLuint program)
814{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500815 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000816}
817
818void Context::deleteTexture(GLuint texture)
819{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500820 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000821 {
822 detachTexture(texture);
823 }
824
Jamie Madill6c1f6712017-02-14 19:08:04 -0500825 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000826}
827
828void Context::deleteRenderbuffer(GLuint renderbuffer)
829{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500830 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000831 {
832 detachRenderbuffer(renderbuffer);
833 }
Jamie Madill893ab082014-05-16 16:56:10 -0400834
Jamie Madill6c1f6712017-02-14 19:08:04 -0500835 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000836}
837
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400838void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400839{
840 // The spec specifies the underlying Fence object is not deleted until all current
841 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
842 // and since our API is currently designed for being called from a single thread, we can delete
843 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400844 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400845}
846
Yunchao Hea336b902017-08-02 16:05:21 +0800847void Context::deleteProgramPipeline(GLuint pipeline)
848{
849 if (mState.mPipelines->getProgramPipeline(pipeline))
850 {
851 detachProgramPipeline(pipeline);
852 }
853
854 mState.mPipelines->deleteObject(this, pipeline);
855}
856
Sami Väisänene45e53b2016-05-25 10:36:04 +0300857void Context::deletePaths(GLuint first, GLsizei range)
858{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500859 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300860}
861
Brandon Jones59770802018-04-02 13:18:42 -0700862bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300863{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500864 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300865 if (pathObj == nullptr)
866 return false;
867
868 return pathObj->hasPathData();
869}
870
Brandon Jones59770802018-04-02 13:18:42 -0700871bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300872{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500873 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300874}
875
Brandon Jones59770802018-04-02 13:18:42 -0700876void Context::pathCommands(GLuint path,
877 GLsizei numCommands,
878 const GLubyte *commands,
879 GLsizei numCoords,
880 GLenum coordType,
881 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300882{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500883 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300884
885 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
886}
887
Jamie Madill007530e2017-12-28 14:27:04 -0500888void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300889{
Jamie Madill007530e2017-12-28 14:27:04 -0500890 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300891
892 switch (pname)
893 {
894 case GL_PATH_STROKE_WIDTH_CHROMIUM:
895 pathObj->setStrokeWidth(value);
896 break;
897 case GL_PATH_END_CAPS_CHROMIUM:
898 pathObj->setEndCaps(static_cast<GLenum>(value));
899 break;
900 case GL_PATH_JOIN_STYLE_CHROMIUM:
901 pathObj->setJoinStyle(static_cast<GLenum>(value));
902 break;
903 case GL_PATH_MITER_LIMIT_CHROMIUM:
904 pathObj->setMiterLimit(value);
905 break;
906 case GL_PATH_STROKE_BOUND_CHROMIUM:
907 pathObj->setStrokeBound(value);
908 break;
909 default:
910 UNREACHABLE();
911 break;
912 }
913}
914
Jamie Madill007530e2017-12-28 14:27:04 -0500915void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300916{
Jamie Madill007530e2017-12-28 14:27:04 -0500917 // TODO(jmadill): Should use proper clamping/casting.
918 pathParameterf(path, pname, static_cast<GLfloat>(value));
919}
920
921void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
922{
923 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300924
925 switch (pname)
926 {
927 case GL_PATH_STROKE_WIDTH_CHROMIUM:
928 *value = pathObj->getStrokeWidth();
929 break;
930 case GL_PATH_END_CAPS_CHROMIUM:
931 *value = static_cast<GLfloat>(pathObj->getEndCaps());
932 break;
933 case GL_PATH_JOIN_STYLE_CHROMIUM:
934 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
935 break;
936 case GL_PATH_MITER_LIMIT_CHROMIUM:
937 *value = pathObj->getMiterLimit();
938 break;
939 case GL_PATH_STROKE_BOUND_CHROMIUM:
940 *value = pathObj->getStrokeBound();
941 break;
942 default:
943 UNREACHABLE();
944 break;
945 }
946}
947
Jamie Madill007530e2017-12-28 14:27:04 -0500948void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
949{
950 GLfloat val = 0.0f;
951 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
952 if (value)
953 *value = static_cast<GLint>(val);
954}
955
Brandon Jones59770802018-04-02 13:18:42 -0700956void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300957{
958 mGLState.setPathStencilFunc(func, ref, mask);
959}
960
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000961void Context::deleteFramebuffer(GLuint framebuffer)
962{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500963 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000964 {
965 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000966 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500967
Jamie Madill6c1f6712017-02-14 19:08:04 -0500968 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000969}
970
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500971void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000972{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500973 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000974 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500975 GLuint fence = fences[i];
976
977 FenceNV *fenceObject = nullptr;
978 if (mFenceNVMap.erase(fence, &fenceObject))
979 {
980 mFenceNVHandleAllocator.release(fence);
981 delete fenceObject;
982 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000983 }
984}
985
Geoff Lang70d0f492015-12-10 17:45:46 -0500986Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000987{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500988 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000989}
990
Geoff Lang70d0f492015-12-10 17:45:46 -0500991Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000992{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500993 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000994}
995
Jamie Madill70b5bb02017-08-28 13:32:37 -0400996Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400997{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400998 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400999}
1000
Jamie Madill57a89722013-07-02 11:57:03 -04001001VertexArray *Context::getVertexArray(GLuint handle) const
1002{
Jamie Madill96a483b2017-06-27 16:49:21 -04001003 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -04001004}
1005
Jamie Madilldc356042013-07-19 16:36:57 -04001006Sampler *Context::getSampler(GLuint handle) const
1007{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001008 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001009}
1010
Geoff Langc8058452014-02-03 12:04:11 -05001011TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1012{
Jamie Madill96a483b2017-06-27 16:49:21 -04001013 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001014}
1015
Yunchao Hea336b902017-08-02 16:05:21 +08001016ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1017{
1018 return mState.mPipelines->getProgramPipeline(handle);
1019}
1020
Geoff Lang75359662018-04-11 01:42:27 -04001021gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001022{
1023 switch (identifier)
1024 {
1025 case GL_BUFFER:
1026 return getBuffer(name);
1027 case GL_SHADER:
1028 return getShader(name);
1029 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001030 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001031 case GL_VERTEX_ARRAY:
1032 return getVertexArray(name);
1033 case GL_QUERY:
1034 return getQuery(name);
1035 case GL_TRANSFORM_FEEDBACK:
1036 return getTransformFeedback(name);
1037 case GL_SAMPLER:
1038 return getSampler(name);
1039 case GL_TEXTURE:
1040 return getTexture(name);
1041 case GL_RENDERBUFFER:
1042 return getRenderbuffer(name);
1043 case GL_FRAMEBUFFER:
1044 return getFramebuffer(name);
1045 default:
1046 UNREACHABLE();
1047 return nullptr;
1048 }
1049}
1050
Geoff Lang75359662018-04-11 01:42:27 -04001051gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001052{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001053 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001054}
1055
Martin Radev9d901792016-07-15 15:58:58 +03001056void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1057{
Geoff Lang75359662018-04-11 01:42:27 -04001058 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001059 ASSERT(object != nullptr);
1060
1061 std::string labelName = GetObjectLabelFromPointer(length, label);
1062 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001063
1064 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1065 // specified object is active until we do this.
1066 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001067}
1068
1069void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1070{
Geoff Lang75359662018-04-11 01:42:27 -04001071 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001072 ASSERT(object != nullptr);
1073
1074 std::string labelName = GetObjectLabelFromPointer(length, label);
1075 object->setLabel(labelName);
1076}
1077
1078void Context::getObjectLabel(GLenum identifier,
1079 GLuint name,
1080 GLsizei bufSize,
1081 GLsizei *length,
1082 GLchar *label) const
1083{
Geoff Lang75359662018-04-11 01:42:27 -04001084 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001085 ASSERT(object != nullptr);
1086
1087 const std::string &objectLabel = object->getLabel();
1088 GetObjectLabelBase(objectLabel, bufSize, length, label);
1089}
1090
1091void Context::getObjectPtrLabel(const void *ptr,
1092 GLsizei bufSize,
1093 GLsizei *length,
1094 GLchar *label) const
1095{
Geoff Lang75359662018-04-11 01:42:27 -04001096 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001097 ASSERT(object != nullptr);
1098
1099 const std::string &objectLabel = object->getLabel();
1100 GetObjectLabelBase(objectLabel, bufSize, length, label);
1101}
1102
Jamie Madilldc356042013-07-19 16:36:57 -04001103bool Context::isSampler(GLuint samplerName) const
1104{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001105 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001106}
1107
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001108void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001109{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001110 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001111
Jamie Madilldedd7b92014-11-05 16:30:36 -05001112 if (handle == 0)
1113 {
1114 texture = mZeroTextures[target].get();
1115 }
1116 else
1117 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001118 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001119 }
1120
1121 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001122 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001123 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001124}
1125
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001126void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001127{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001128 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1129 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001130 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001131 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001132}
1133
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001134void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001135{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001136 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1137 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001138 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001139 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001140 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001141}
1142
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001143void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001144{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001145 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001146 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001147 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001148 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001149}
1150
Shao80957d92017-02-20 21:25:59 +08001151void Context::bindVertexBuffer(GLuint bindingIndex,
1152 GLuint bufferHandle,
1153 GLintptr offset,
1154 GLsizei stride)
1155{
1156 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001157 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001158 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001159}
1160
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001161void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001162{
Geoff Lang76b10c92014-09-05 16:28:14 -04001163 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001164 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001165 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001166 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001167 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001168}
1169
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001170void Context::bindImageTexture(GLuint unit,
1171 GLuint texture,
1172 GLint level,
1173 GLboolean layered,
1174 GLint layer,
1175 GLenum access,
1176 GLenum format)
1177{
1178 Texture *tex = mState.mTextures->getTexture(texture);
1179 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1180}
1181
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001182void Context::useProgram(GLuint program)
1183{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001184 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001185 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001186}
1187
Jiajia Qin5451d532017-11-16 17:16:34 +08001188void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1189{
1190 UNIMPLEMENTED();
1191}
1192
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001193void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001194{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001195 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001196 TransformFeedback *transformFeedback =
1197 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001198 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001199 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001200}
1201
Yunchao Hea336b902017-08-02 16:05:21 +08001202void Context::bindProgramPipeline(GLuint pipelineHandle)
1203{
1204 ProgramPipeline *pipeline =
1205 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1206 mGLState.setProgramPipelineBinding(this, pipeline);
1207}
1208
Corentin Wallezad3ae902018-03-09 13:40:42 -05001209void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001210{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001211 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001212 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001213
Geoff Lang5aad9672014-09-08 11:10:42 -04001214 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001215 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001216
1217 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001218 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001219 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001220}
1221
Corentin Wallezad3ae902018-03-09 13:40:42 -05001222void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001223{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001224 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001225 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001226
Jamie Madill5188a272018-07-25 10:53:56 -04001227 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001228
Geoff Lang5aad9672014-09-08 11:10:42 -04001229 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001230 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001231 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001232}
1233
Corentin Wallezad3ae902018-03-09 13:40:42 -05001234void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001235{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001236 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001237
1238 Query *queryObject = getQuery(id, true, target);
1239 ASSERT(queryObject);
1240
Jamie Madill5188a272018-07-25 10:53:56 -04001241 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001242}
1243
Corentin Wallezad3ae902018-03-09 13:40:42 -05001244void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001245{
1246 switch (pname)
1247 {
1248 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001249 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001250 break;
1251 case GL_QUERY_COUNTER_BITS_EXT:
1252 switch (target)
1253 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001254 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001255 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1256 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001257 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001258 params[0] = getExtensions().queryCounterBitsTimestamp;
1259 break;
1260 default:
1261 UNREACHABLE();
1262 params[0] = 0;
1263 break;
1264 }
1265 break;
1266 default:
1267 UNREACHABLE();
1268 return;
1269 }
1270}
1271
Corentin Wallezad3ae902018-03-09 13:40:42 -05001272void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001273 GLenum pname,
1274 GLsizei bufSize,
1275 GLsizei *length,
1276 GLint *params)
1277{
1278 getQueryiv(target, pname, params);
1279}
1280
Geoff Lang2186c382016-10-14 10:54:54 -04001281void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001282{
Jamie Madill5188a272018-07-25 10:53:56 -04001283 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001284}
1285
Brandon Jones59770802018-04-02 13:18:42 -07001286void Context::getQueryObjectivRobust(GLuint id,
1287 GLenum pname,
1288 GLsizei bufSize,
1289 GLsizei *length,
1290 GLint *params)
1291{
1292 getQueryObjectiv(id, pname, params);
1293}
1294
Geoff Lang2186c382016-10-14 10:54:54 -04001295void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001296{
Jamie Madill5188a272018-07-25 10:53:56 -04001297 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001298}
1299
Brandon Jones59770802018-04-02 13:18:42 -07001300void Context::getQueryObjectuivRobust(GLuint id,
1301 GLenum pname,
1302 GLsizei bufSize,
1303 GLsizei *length,
1304 GLuint *params)
1305{
1306 getQueryObjectuiv(id, pname, params);
1307}
1308
Geoff Lang2186c382016-10-14 10:54:54 -04001309void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001310{
Jamie Madill5188a272018-07-25 10:53:56 -04001311 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001312}
1313
Brandon Jones59770802018-04-02 13:18:42 -07001314void Context::getQueryObjecti64vRobust(GLuint id,
1315 GLenum pname,
1316 GLsizei bufSize,
1317 GLsizei *length,
1318 GLint64 *params)
1319{
1320 getQueryObjecti64v(id, pname, params);
1321}
1322
Geoff Lang2186c382016-10-14 10:54:54 -04001323void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001324{
Jamie Madill5188a272018-07-25 10:53:56 -04001325 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001326}
1327
Brandon Jones59770802018-04-02 13:18:42 -07001328void Context::getQueryObjectui64vRobust(GLuint id,
1329 GLenum pname,
1330 GLsizei bufSize,
1331 GLsizei *length,
1332 GLuint64 *params)
1333{
1334 getQueryObjectui64v(id, pname, params);
1335}
1336
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001337Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001338{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001339 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001340}
1341
Jamie Madill2f348d22017-06-05 10:50:59 -04001342FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001343{
Jamie Madill96a483b2017-06-27 16:49:21 -04001344 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001345}
1346
Corentin Wallezad3ae902018-03-09 13:40:42 -05001347Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001348{
Jamie Madill96a483b2017-06-27 16:49:21 -04001349 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001350 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001351 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001352 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001353
1354 Query *query = mQueryMap.query(handle);
1355 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001356 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001357 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001358 query = new Query(mImplementation->createQuery(type), handle);
1359 query->addRef();
1360 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001361 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001362 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001363}
1364
Geoff Lang70d0f492015-12-10 17:45:46 -05001365Query *Context::getQuery(GLuint handle) const
1366{
Jamie Madill96a483b2017-06-27 16:49:21 -04001367 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001368}
1369
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001370Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001371{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001372 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1373 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001374}
1375
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001376Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001377{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001378 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001379}
1380
Geoff Lang492a7e42014-11-05 13:27:06 -05001381Compiler *Context::getCompiler() const
1382{
Jamie Madill2f348d22017-06-05 10:50:59 -04001383 if (mCompiler.get() == nullptr)
1384 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001385 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001386 }
1387 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001388}
1389
Jamie Madillc1d770e2017-04-13 17:31:24 -04001390void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001391{
1392 switch (pname)
1393 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001394 case GL_SHADER_COMPILER:
1395 *params = GL_TRUE;
1396 break;
1397 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1398 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1399 break;
1400 default:
1401 mGLState.getBooleanv(pname, params);
1402 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001403 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001404}
1405
Jamie Madillc1d770e2017-04-13 17:31:24 -04001406void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001407{
Shannon Woods53a94a82014-06-24 15:20:36 -04001408 // Queries about context capabilities and maximums are answered by Context.
1409 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001410 switch (pname)
1411 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001412 case GL_ALIASED_LINE_WIDTH_RANGE:
1413 params[0] = mCaps.minAliasedLineWidth;
1414 params[1] = mCaps.maxAliasedLineWidth;
1415 break;
1416 case GL_ALIASED_POINT_SIZE_RANGE:
1417 params[0] = mCaps.minAliasedPointSize;
1418 params[1] = mCaps.maxAliasedPointSize;
1419 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001420 case GL_SMOOTH_POINT_SIZE_RANGE:
1421 params[0] = mCaps.minSmoothPointSize;
1422 params[1] = mCaps.maxSmoothPointSize;
1423 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001424 case GL_SMOOTH_LINE_WIDTH_RANGE:
1425 params[0] = mCaps.minSmoothLineWidth;
1426 params[1] = mCaps.maxSmoothLineWidth;
1427 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001428 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1429 ASSERT(mExtensions.textureFilterAnisotropic);
1430 *params = mExtensions.maxTextureAnisotropy;
1431 break;
1432 case GL_MAX_TEXTURE_LOD_BIAS:
1433 *params = mCaps.maxLODBias;
1434 break;
1435
1436 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1437 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1438 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001439 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1440 // GLES1 constants for modelview/projection matrix.
1441 if (getClientVersion() < Version(2, 0))
1442 {
1443 mGLState.getFloatv(pname, params);
1444 }
1445 else
1446 {
1447 ASSERT(mExtensions.pathRendering);
1448 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1449 memcpy(params, m, 16 * sizeof(GLfloat));
1450 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001451 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001452 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001453
Jamie Madill231c7f52017-04-26 13:45:37 -04001454 default:
1455 mGLState.getFloatv(pname, params);
1456 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001457 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001458}
1459
Jamie Madillc1d770e2017-04-13 17:31:24 -04001460void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001461{
Shannon Woods53a94a82014-06-24 15:20:36 -04001462 // Queries about context capabilities and maximums are answered by Context.
1463 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001464
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001465 switch (pname)
1466 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001467 case GL_MAX_VERTEX_ATTRIBS:
1468 *params = mCaps.maxVertexAttributes;
1469 break;
1470 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1471 *params = mCaps.maxVertexUniformVectors;
1472 break;
1473 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001474 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001475 break;
1476 case GL_MAX_VARYING_VECTORS:
1477 *params = mCaps.maxVaryingVectors;
1478 break;
1479 case GL_MAX_VARYING_COMPONENTS:
1480 *params = mCaps.maxVertexOutputComponents;
1481 break;
1482 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1483 *params = mCaps.maxCombinedTextureImageUnits;
1484 break;
1485 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001486 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001487 break;
1488 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001489 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001490 break;
1491 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1492 *params = mCaps.maxFragmentUniformVectors;
1493 break;
1494 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001495 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001496 break;
1497 case GL_MAX_RENDERBUFFER_SIZE:
1498 *params = mCaps.maxRenderbufferSize;
1499 break;
1500 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1501 *params = mCaps.maxColorAttachments;
1502 break;
1503 case GL_MAX_DRAW_BUFFERS_EXT:
1504 *params = mCaps.maxDrawBuffers;
1505 break;
1506 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1507 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1508 case GL_SUBPIXEL_BITS:
1509 *params = 4;
1510 break;
1511 case GL_MAX_TEXTURE_SIZE:
1512 *params = mCaps.max2DTextureSize;
1513 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001514 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1515 *params = mCaps.maxRectangleTextureSize;
1516 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001517 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1518 *params = mCaps.maxCubeMapTextureSize;
1519 break;
1520 case GL_MAX_3D_TEXTURE_SIZE:
1521 *params = mCaps.max3DTextureSize;
1522 break;
1523 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1524 *params = mCaps.maxArrayTextureLayers;
1525 break;
1526 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1527 *params = mCaps.uniformBufferOffsetAlignment;
1528 break;
1529 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1530 *params = mCaps.maxUniformBufferBindings;
1531 break;
1532 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001533 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001534 break;
1535 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001536 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001537 break;
1538 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1539 *params = mCaps.maxCombinedTextureImageUnits;
1540 break;
1541 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1542 *params = mCaps.maxVertexOutputComponents;
1543 break;
1544 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1545 *params = mCaps.maxFragmentInputComponents;
1546 break;
1547 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1548 *params = mCaps.minProgramTexelOffset;
1549 break;
1550 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1551 *params = mCaps.maxProgramTexelOffset;
1552 break;
1553 case GL_MAJOR_VERSION:
1554 *params = getClientVersion().major;
1555 break;
1556 case GL_MINOR_VERSION:
1557 *params = getClientVersion().minor;
1558 break;
1559 case GL_MAX_ELEMENTS_INDICES:
1560 *params = mCaps.maxElementsIndices;
1561 break;
1562 case GL_MAX_ELEMENTS_VERTICES:
1563 *params = mCaps.maxElementsVertices;
1564 break;
1565 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1566 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1567 break;
1568 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1569 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1570 break;
1571 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1572 *params = mCaps.maxTransformFeedbackSeparateComponents;
1573 break;
1574 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1575 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1576 break;
1577 case GL_MAX_SAMPLES_ANGLE:
1578 *params = mCaps.maxSamples;
1579 break;
1580 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001581 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001582 params[0] = mCaps.maxViewportWidth;
1583 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001584 }
1585 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001586 case GL_COMPRESSED_TEXTURE_FORMATS:
1587 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1588 params);
1589 break;
1590 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1591 *params = mResetStrategy;
1592 break;
1593 case GL_NUM_SHADER_BINARY_FORMATS:
1594 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1595 break;
1596 case GL_SHADER_BINARY_FORMATS:
1597 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1598 break;
1599 case GL_NUM_PROGRAM_BINARY_FORMATS:
1600 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1601 break;
1602 case GL_PROGRAM_BINARY_FORMATS:
1603 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1604 break;
1605 case GL_NUM_EXTENSIONS:
1606 *params = static_cast<GLint>(mExtensionStrings.size());
1607 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001608
Geoff Lang38f24ee2018-10-01 13:04:59 -04001609 // GL_ANGLE_request_extension
1610 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1611 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1612 break;
1613
Jamie Madill231c7f52017-04-26 13:45:37 -04001614 // GL_KHR_debug
1615 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1616 *params = mExtensions.maxDebugMessageLength;
1617 break;
1618 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1619 *params = mExtensions.maxDebugLoggedMessages;
1620 break;
1621 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1622 *params = mExtensions.maxDebugGroupStackDepth;
1623 break;
1624 case GL_MAX_LABEL_LENGTH:
1625 *params = mExtensions.maxLabelLength;
1626 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001627
Martin Radeve5285d22017-07-14 16:23:53 +03001628 // GL_ANGLE_multiview
1629 case GL_MAX_VIEWS_ANGLE:
1630 *params = mExtensions.maxViews;
1631 break;
1632
Jamie Madill231c7f52017-04-26 13:45:37 -04001633 // GL_EXT_disjoint_timer_query
1634 case GL_GPU_DISJOINT_EXT:
1635 *params = mImplementation->getGPUDisjoint();
1636 break;
1637 case GL_MAX_FRAMEBUFFER_WIDTH:
1638 *params = mCaps.maxFramebufferWidth;
1639 break;
1640 case GL_MAX_FRAMEBUFFER_HEIGHT:
1641 *params = mCaps.maxFramebufferHeight;
1642 break;
1643 case GL_MAX_FRAMEBUFFER_SAMPLES:
1644 *params = mCaps.maxFramebufferSamples;
1645 break;
1646 case GL_MAX_SAMPLE_MASK_WORDS:
1647 *params = mCaps.maxSampleMaskWords;
1648 break;
1649 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1650 *params = mCaps.maxColorTextureSamples;
1651 break;
1652 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1653 *params = mCaps.maxDepthTextureSamples;
1654 break;
1655 case GL_MAX_INTEGER_SAMPLES:
1656 *params = mCaps.maxIntegerSamples;
1657 break;
1658 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1659 *params = mCaps.maxVertexAttribRelativeOffset;
1660 break;
1661 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1662 *params = mCaps.maxVertexAttribBindings;
1663 break;
1664 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1665 *params = mCaps.maxVertexAttribStride;
1666 break;
1667 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001668 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001669 break;
1670 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001671 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001672 break;
1673 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001674 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001675 break;
1676 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001677 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001678 break;
1679 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001680 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001681 break;
1682 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001683 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001684 break;
1685 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001686 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001687 break;
1688 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001689 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001690 break;
1691 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1692 *params = mCaps.minProgramTextureGatherOffset;
1693 break;
1694 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1695 *params = mCaps.maxProgramTextureGatherOffset;
1696 break;
1697 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1698 *params = mCaps.maxComputeWorkGroupInvocations;
1699 break;
1700 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001701 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001702 break;
1703 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001704 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001705 break;
1706 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1707 *params = mCaps.maxComputeSharedMemorySize;
1708 break;
1709 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001710 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001711 break;
1712 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001713 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001714 break;
1715 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001716 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001717 break;
1718 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001719 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001720 break;
1721 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001722 *params =
1723 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001724 break;
1725 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001726 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001727 break;
1728 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1729 *params = mCaps.maxCombinedShaderOutputResources;
1730 break;
1731 case GL_MAX_UNIFORM_LOCATIONS:
1732 *params = mCaps.maxUniformLocations;
1733 break;
1734 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1735 *params = mCaps.maxAtomicCounterBufferBindings;
1736 break;
1737 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1738 *params = mCaps.maxAtomicCounterBufferSize;
1739 break;
1740 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1741 *params = mCaps.maxCombinedAtomicCounterBuffers;
1742 break;
1743 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1744 *params = mCaps.maxCombinedAtomicCounters;
1745 break;
1746 case GL_MAX_IMAGE_UNITS:
1747 *params = mCaps.maxImageUnits;
1748 break;
1749 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1750 *params = mCaps.maxCombinedImageUniforms;
1751 break;
1752 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1753 *params = mCaps.maxShaderStorageBufferBindings;
1754 break;
1755 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1756 *params = mCaps.maxCombinedShaderStorageBlocks;
1757 break;
1758 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1759 *params = mCaps.shaderStorageBufferOffsetAlignment;
1760 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001761
1762 // GL_EXT_geometry_shader
1763 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1764 *params = mCaps.maxFramebufferLayers;
1765 break;
1766 case GL_LAYER_PROVOKING_VERTEX_EXT:
1767 *params = mCaps.layerProvokingVertex;
1768 break;
1769 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001770 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001771 break;
1772 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001773 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001774 break;
1775 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001776 *params =
1777 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001778 break;
1779 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1780 *params = mCaps.maxGeometryInputComponents;
1781 break;
1782 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1783 *params = mCaps.maxGeometryOutputComponents;
1784 break;
1785 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1786 *params = mCaps.maxGeometryOutputVertices;
1787 break;
1788 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1789 *params = mCaps.maxGeometryTotalOutputComponents;
1790 break;
1791 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1792 *params = mCaps.maxGeometryShaderInvocations;
1793 break;
1794 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001795 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001796 break;
1797 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001798 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001799 break;
1800 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001801 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001802 break;
1803 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001804 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001805 break;
1806 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001807 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001808 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001809 // GLES1 emulation: Caps queries
1810 case GL_MAX_TEXTURE_UNITS:
1811 *params = mCaps.maxMultitextureUnits;
1812 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001813 case GL_MAX_MODELVIEW_STACK_DEPTH:
1814 *params = mCaps.maxModelviewMatrixStackDepth;
1815 break;
1816 case GL_MAX_PROJECTION_STACK_DEPTH:
1817 *params = mCaps.maxProjectionMatrixStackDepth;
1818 break;
1819 case GL_MAX_TEXTURE_STACK_DEPTH:
1820 *params = mCaps.maxTextureMatrixStackDepth;
1821 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001822 case GL_MAX_LIGHTS:
1823 *params = mCaps.maxLights;
1824 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001825 case GL_MAX_CLIP_PLANES:
1826 *params = mCaps.maxClipPlanes;
1827 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001828 // GLES1 emulation: Vertex attribute queries
1829 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1830 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1831 case GL_COLOR_ARRAY_BUFFER_BINDING:
1832 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1833 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1834 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1835 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1836 break;
1837 case GL_VERTEX_ARRAY_STRIDE:
1838 case GL_NORMAL_ARRAY_STRIDE:
1839 case GL_COLOR_ARRAY_STRIDE:
1840 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1841 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1842 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1843 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1844 break;
1845 case GL_VERTEX_ARRAY_SIZE:
1846 case GL_COLOR_ARRAY_SIZE:
1847 case GL_TEXTURE_COORD_ARRAY_SIZE:
1848 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1849 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1850 break;
1851 case GL_VERTEX_ARRAY_TYPE:
1852 case GL_COLOR_ARRAY_TYPE:
1853 case GL_NORMAL_ARRAY_TYPE:
1854 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1855 case GL_TEXTURE_COORD_ARRAY_TYPE:
1856 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1857 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1858 break;
1859
jchen1082af6202018-06-22 10:59:52 +08001860 // GL_KHR_parallel_shader_compile
1861 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1862 *params = mGLState.getMaxShaderCompilerThreads();
1863 break;
1864
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001865 // GL_EXT_blend_func_extended
1866 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1867 *params = mExtensions.maxDualSourceDrawBuffers;
1868 break;
1869
Jamie Madill231c7f52017-04-26 13:45:37 -04001870 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001871 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001872 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001873 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001874}
1875
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001876void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001877{
Shannon Woods53a94a82014-06-24 15:20:36 -04001878 // Queries about context capabilities and maximums are answered by Context.
1879 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001880 switch (pname)
1881 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001882 case GL_MAX_ELEMENT_INDEX:
1883 *params = mCaps.maxElementIndex;
1884 break;
1885 case GL_MAX_UNIFORM_BLOCK_SIZE:
1886 *params = mCaps.maxUniformBlockSize;
1887 break;
1888 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001889 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001890 break;
1891 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001892 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001893 break;
1894 case GL_MAX_SERVER_WAIT_TIMEOUT:
1895 *params = mCaps.maxServerWaitTimeout;
1896 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001897
Jamie Madill231c7f52017-04-26 13:45:37 -04001898 // GL_EXT_disjoint_timer_query
1899 case GL_TIMESTAMP_EXT:
1900 *params = mImplementation->getTimestamp();
1901 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001902
Jamie Madill231c7f52017-04-26 13:45:37 -04001903 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1904 *params = mCaps.maxShaderStorageBlockSize;
1905 break;
1906 default:
1907 UNREACHABLE();
1908 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001909 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001910}
1911
Geoff Lang70d0f492015-12-10 17:45:46 -05001912void Context::getPointerv(GLenum pname, void **params) const
1913{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001914 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001915}
1916
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001917void Context::getPointervRobustANGLERobust(GLenum pname,
1918 GLsizei bufSize,
1919 GLsizei *length,
1920 void **params)
1921{
1922 UNIMPLEMENTED();
1923}
1924
Martin Radev66fb8202016-07-28 11:45:20 +03001925void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001926{
Shannon Woods53a94a82014-06-24 15:20:36 -04001927 // Queries about context capabilities and maximums are answered by Context.
1928 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001929
1930 GLenum nativeType;
1931 unsigned int numParams;
1932 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1933 ASSERT(queryStatus);
1934
1935 if (nativeType == GL_INT)
1936 {
1937 switch (target)
1938 {
1939 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1940 ASSERT(index < 3u);
1941 *data = mCaps.maxComputeWorkGroupCount[index];
1942 break;
1943 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1944 ASSERT(index < 3u);
1945 *data = mCaps.maxComputeWorkGroupSize[index];
1946 break;
1947 default:
1948 mGLState.getIntegeri_v(target, index, data);
1949 }
1950 }
1951 else
1952 {
1953 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1954 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001955}
1956
Brandon Jones59770802018-04-02 13:18:42 -07001957void Context::getIntegeri_vRobust(GLenum target,
1958 GLuint index,
1959 GLsizei bufSize,
1960 GLsizei *length,
1961 GLint *data)
1962{
1963 getIntegeri_v(target, index, data);
1964}
1965
Martin Radev66fb8202016-07-28 11:45:20 +03001966void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001967{
Shannon Woods53a94a82014-06-24 15:20:36 -04001968 // Queries about context capabilities and maximums are answered by Context.
1969 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001970
1971 GLenum nativeType;
1972 unsigned int numParams;
1973 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1974 ASSERT(queryStatus);
1975
1976 if (nativeType == GL_INT_64_ANGLEX)
1977 {
1978 mGLState.getInteger64i_v(target, index, data);
1979 }
1980 else
1981 {
1982 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1983 }
1984}
1985
Brandon Jones59770802018-04-02 13:18:42 -07001986void Context::getInteger64i_vRobust(GLenum target,
1987 GLuint index,
1988 GLsizei bufSize,
1989 GLsizei *length,
1990 GLint64 *data)
1991{
1992 getInteger64i_v(target, index, data);
1993}
1994
Martin Radev66fb8202016-07-28 11:45:20 +03001995void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1996{
1997 // Queries about context capabilities and maximums are answered by Context.
1998 // Queries about current GL state values are answered by State.
1999
2000 GLenum nativeType;
2001 unsigned int numParams;
2002 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
2003 ASSERT(queryStatus);
2004
2005 if (nativeType == GL_BOOL)
2006 {
2007 mGLState.getBooleani_v(target, index, data);
2008 }
2009 else
2010 {
2011 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2012 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002013}
2014
Brandon Jones59770802018-04-02 13:18:42 -07002015void Context::getBooleani_vRobust(GLenum target,
2016 GLuint index,
2017 GLsizei bufSize,
2018 GLsizei *length,
2019 GLboolean *data)
2020{
2021 getBooleani_v(target, index, data);
2022}
2023
Corentin Wallez336129f2017-10-17 15:55:40 -04002024void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002025{
2026 Buffer *buffer = mGLState.getTargetBuffer(target);
2027 QueryBufferParameteriv(buffer, pname, params);
2028}
2029
Brandon Jones59770802018-04-02 13:18:42 -07002030void Context::getBufferParameterivRobust(BufferBinding target,
2031 GLenum pname,
2032 GLsizei bufSize,
2033 GLsizei *length,
2034 GLint *params)
2035{
2036 getBufferParameteriv(target, pname, params);
2037}
2038
He Yunchao010e4db2017-03-03 14:22:06 +08002039void Context::getFramebufferAttachmentParameteriv(GLenum target,
2040 GLenum attachment,
2041 GLenum pname,
2042 GLint *params)
2043{
2044 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002045 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002046}
2047
Brandon Jones59770802018-04-02 13:18:42 -07002048void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2049 GLenum attachment,
2050 GLenum pname,
2051 GLsizei bufSize,
2052 GLsizei *length,
2053 GLint *params)
2054{
2055 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2056}
2057
He Yunchao010e4db2017-03-03 14:22:06 +08002058void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2059{
2060 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2061 QueryRenderbufferiv(this, renderbuffer, pname, params);
2062}
2063
Brandon Jones59770802018-04-02 13:18:42 -07002064void Context::getRenderbufferParameterivRobust(GLenum target,
2065 GLenum pname,
2066 GLsizei bufSize,
2067 GLsizei *length,
2068 GLint *params)
2069{
2070 getRenderbufferParameteriv(target, pname, params);
2071}
2072
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002073void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002074{
Till Rathmannb8543632018-10-02 19:46:14 +02002075 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002076 QueryTexParameterfv(texture, pname, params);
2077}
2078
Brandon Jones59770802018-04-02 13:18:42 -07002079void Context::getTexParameterfvRobust(TextureType target,
2080 GLenum pname,
2081 GLsizei bufSize,
2082 GLsizei *length,
2083 GLfloat *params)
2084{
2085 getTexParameterfv(target, pname, params);
2086}
2087
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002088void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002089{
Till Rathmannb8543632018-10-02 19:46:14 +02002090 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002091 QueryTexParameteriv(texture, pname, params);
2092}
Jiajia Qin5451d532017-11-16 17:16:34 +08002093
Till Rathmannb8543632018-10-02 19:46:14 +02002094void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2095{
2096 const Texture *const texture = getTargetTexture(target);
2097 QueryTexParameterIiv(texture, pname, params);
2098}
2099
2100void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2101{
2102 const Texture *const texture = getTargetTexture(target);
2103 QueryTexParameterIuiv(texture, pname, params);
2104}
2105
Brandon Jones59770802018-04-02 13:18:42 -07002106void Context::getTexParameterivRobust(TextureType target,
2107 GLenum pname,
2108 GLsizei bufSize,
2109 GLsizei *length,
2110 GLint *params)
2111{
2112 getTexParameteriv(target, pname, params);
2113}
2114
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002115void Context::getTexParameterIivRobust(TextureType target,
2116 GLenum pname,
2117 GLsizei bufSize,
2118 GLsizei *length,
2119 GLint *params)
2120{
2121 UNIMPLEMENTED();
2122}
2123
2124void Context::getTexParameterIuivRobust(TextureType target,
2125 GLenum pname,
2126 GLsizei bufSize,
2127 GLsizei *length,
2128 GLuint *params)
2129{
2130 UNIMPLEMENTED();
2131}
2132
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002133void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002134{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002135 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002136 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002137}
2138
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002139void Context::getTexLevelParameterivRobust(TextureTarget target,
2140 GLint level,
2141 GLenum pname,
2142 GLsizei bufSize,
2143 GLsizei *length,
2144 GLint *params)
2145{
2146 UNIMPLEMENTED();
2147}
2148
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002149void Context::getTexLevelParameterfv(TextureTarget target,
2150 GLint level,
2151 GLenum pname,
2152 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002153{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002154 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002155 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002156}
2157
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002158void Context::getTexLevelParameterfvRobust(TextureTarget target,
2159 GLint level,
2160 GLenum pname,
2161 GLsizei bufSize,
2162 GLsizei *length,
2163 GLfloat *params)
2164{
2165 UNIMPLEMENTED();
2166}
2167
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002168void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002169{
Till Rathmannb8543632018-10-02 19:46:14 +02002170 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002171 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002172 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002173}
2174
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002175void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002176{
Till Rathmannb8543632018-10-02 19:46:14 +02002177 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002178 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002179 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002180}
2181
Brandon Jones59770802018-04-02 13:18:42 -07002182void Context::texParameterfvRobust(TextureType target,
2183 GLenum pname,
2184 GLsizei bufSize,
2185 const GLfloat *params)
2186{
2187 texParameterfv(target, pname, params);
2188}
2189
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002190void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002191{
Till Rathmannb8543632018-10-02 19:46:14 +02002192 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002193 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002194 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002195}
2196
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002197void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002198{
Till Rathmannb8543632018-10-02 19:46:14 +02002199 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002200 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002201 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002202}
2203
Till Rathmannb8543632018-10-02 19:46:14 +02002204void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2205{
2206 Texture *const texture = getTargetTexture(target);
2207 SetTexParameterIiv(this, texture, pname, params);
2208 onTextureChange(texture);
2209}
2210
2211void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2212{
2213 Texture *const texture = getTargetTexture(target);
2214 SetTexParameterIuiv(this, texture, pname, params);
2215 onTextureChange(texture);
2216}
2217
Brandon Jones59770802018-04-02 13:18:42 -07002218void Context::texParameterivRobust(TextureType target,
2219 GLenum pname,
2220 GLsizei bufSize,
2221 const GLint *params)
2222{
2223 texParameteriv(target, pname, params);
2224}
2225
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002226void Context::texParameterIivRobust(TextureType target,
2227 GLenum pname,
2228 GLsizei bufSize,
2229 const GLint *params)
2230{
2231 UNIMPLEMENTED();
2232}
2233
2234void Context::texParameterIuivRobust(TextureType target,
2235 GLenum pname,
2236 GLsizei bufSize,
2237 const GLuint *params)
2238{
2239 UNIMPLEMENTED();
2240}
2241
Jamie Madill493f9572018-05-24 19:52:15 -04002242void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002243{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002244 // No-op if count draws no primitives for given mode
2245 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002246 {
2247 return;
2248 }
2249
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002250 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002251 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002252 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002253}
2254
Jamie Madill493f9572018-05-24 19:52:15 -04002255void Context::drawArraysInstanced(PrimitiveMode mode,
2256 GLint first,
2257 GLsizei count,
2258 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002259{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002260 // No-op if count draws no primitives for given mode
2261 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002262 {
2263 return;
2264 }
2265
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002266 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002267 ANGLE_CONTEXT_TRY(
2268 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002269 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2270 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002271}
2272
Jamie Madill493f9572018-05-24 19:52:15 -04002273void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002274{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002275 // No-op if count draws no primitives for given mode
2276 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002277 {
2278 return;
2279 }
2280
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002281 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002282 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002283}
2284
Jamie Madill493f9572018-05-24 19:52:15 -04002285void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002286 GLsizei count,
2287 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002288 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002289 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002290{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002291 // No-op if count draws no primitives for given mode
2292 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002293 {
2294 return;
2295 }
2296
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002297 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002298 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002299 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002300}
2301
Jamie Madill493f9572018-05-24 19:52:15 -04002302void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002303 GLuint start,
2304 GLuint end,
2305 GLsizei count,
2306 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002307 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002308{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002309 // No-op if count draws no primitives for given mode
2310 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002311 {
2312 return;
2313 }
2314
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002315 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002316 ANGLE_CONTEXT_TRY(
2317 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002318}
2319
Jamie Madill493f9572018-05-24 19:52:15 -04002320void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002321{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002322 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002323 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002324}
2325
Jamie Madill493f9572018-05-24 19:52:15 -04002326void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002327{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002328 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002329 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002330}
2331
Jamie Madill675fe712016-12-19 13:07:54 -05002332void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002333{
Jamie Madillafa02a22017-11-23 12:57:38 -05002334 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002335}
2336
Jamie Madill675fe712016-12-19 13:07:54 -05002337void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002338{
Jamie Madillafa02a22017-11-23 12:57:38 -05002339 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002340}
2341
Austin Kinross6ee1e782015-05-29 17:05:37 -07002342void Context::insertEventMarker(GLsizei length, const char *marker)
2343{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002344 ASSERT(mImplementation);
2345 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002346}
2347
2348void Context::pushGroupMarker(GLsizei length, const char *marker)
2349{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002350 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002351
2352 if (marker == nullptr)
2353 {
2354 // From the EXT_debug_marker spec,
2355 // "If <marker> is null then an empty string is pushed on the stack."
2356 mImplementation->pushGroupMarker(length, "");
2357 }
2358 else
2359 {
2360 mImplementation->pushGroupMarker(length, marker);
2361 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002362}
2363
2364void Context::popGroupMarker()
2365{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002366 ASSERT(mImplementation);
2367 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002368}
2369
Geoff Langd8605522016-04-13 10:19:12 -04002370void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2371{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002372 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002373 ASSERT(programObject);
2374
2375 programObject->bindUniformLocation(location, name);
2376}
2377
Brandon Jones59770802018-04-02 13:18:42 -07002378void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002379{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002380 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002381}
2382
Brandon Jones59770802018-04-02 13:18:42 -07002383void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002384{
2385 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2386}
2387
Brandon Jones59770802018-04-02 13:18:42 -07002388void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002389{
2390 GLfloat I[16];
2391 angle::Matrix<GLfloat>::setToIdentity(I);
2392
2393 mGLState.loadPathRenderingMatrix(matrixMode, I);
2394}
2395
2396void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2397{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002398 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002399 if (!pathObj)
2400 return;
2401
Geoff Lang9bf86f02018-07-26 11:46:34 -04002402 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002403
2404 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2405}
2406
2407void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2408{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002409 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002410 if (!pathObj)
2411 return;
2412
Geoff Lang9bf86f02018-07-26 11:46:34 -04002413 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002414
2415 mImplementation->stencilStrokePath(pathObj, reference, mask);
2416}
2417
2418void Context::coverFillPath(GLuint path, GLenum coverMode)
2419{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002420 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002421 if (!pathObj)
2422 return;
2423
Geoff Lang9bf86f02018-07-26 11:46:34 -04002424 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002425
2426 mImplementation->coverFillPath(pathObj, coverMode);
2427}
2428
2429void Context::coverStrokePath(GLuint path, GLenum coverMode)
2430{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002431 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002432 if (!pathObj)
2433 return;
2434
Geoff Lang9bf86f02018-07-26 11:46:34 -04002435 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002436
2437 mImplementation->coverStrokePath(pathObj, coverMode);
2438}
2439
2440void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2441{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002442 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002443 if (!pathObj)
2444 return;
2445
Geoff Lang9bf86f02018-07-26 11:46:34 -04002446 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002447
2448 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2449}
2450
2451void Context::stencilThenCoverStrokePath(GLuint path,
2452 GLint reference,
2453 GLuint mask,
2454 GLenum coverMode)
2455{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002456 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002457 if (!pathObj)
2458 return;
2459
Geoff Lang9bf86f02018-07-26 11:46:34 -04002460 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002461
2462 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2463}
2464
Sami Väisänend59ca052016-06-21 16:10:00 +03002465void Context::coverFillPathInstanced(GLsizei numPaths,
2466 GLenum pathNameType,
2467 const void *paths,
2468 GLuint pathBase,
2469 GLenum coverMode,
2470 GLenum transformType,
2471 const GLfloat *transformValues)
2472{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002473 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002474
Geoff Lang9bf86f02018-07-26 11:46:34 -04002475 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002476
2477 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2478}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002479
Sami Väisänend59ca052016-06-21 16:10:00 +03002480void Context::coverStrokePathInstanced(GLsizei numPaths,
2481 GLenum pathNameType,
2482 const void *paths,
2483 GLuint pathBase,
2484 GLenum coverMode,
2485 GLenum transformType,
2486 const GLfloat *transformValues)
2487{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002488 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002489
2490 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002491 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002492
2493 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2494 transformValues);
2495}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002496
Sami Väisänend59ca052016-06-21 16:10:00 +03002497void Context::stencilFillPathInstanced(GLsizei numPaths,
2498 GLenum pathNameType,
2499 const void *paths,
2500 GLuint pathBase,
2501 GLenum fillMode,
2502 GLuint mask,
2503 GLenum transformType,
2504 const GLfloat *transformValues)
2505{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002506 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002507
2508 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002509 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002510
2511 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2512 transformValues);
2513}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002514
Sami Väisänend59ca052016-06-21 16:10:00 +03002515void Context::stencilStrokePathInstanced(GLsizei numPaths,
2516 GLenum pathNameType,
2517 const void *paths,
2518 GLuint pathBase,
2519 GLint reference,
2520 GLuint mask,
2521 GLenum transformType,
2522 const GLfloat *transformValues)
2523{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002524 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002525
Geoff Lang9bf86f02018-07-26 11:46:34 -04002526 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002527
2528 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2529 transformValues);
2530}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002531
Sami Väisänend59ca052016-06-21 16:10:00 +03002532void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2533 GLenum pathNameType,
2534 const void *paths,
2535 GLuint pathBase,
2536 GLenum fillMode,
2537 GLuint mask,
2538 GLenum coverMode,
2539 GLenum transformType,
2540 const GLfloat *transformValues)
2541{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002542 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002543
Geoff Lang9bf86f02018-07-26 11:46:34 -04002544 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002545
2546 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2547 transformType, transformValues);
2548}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002549
Sami Väisänend59ca052016-06-21 16:10:00 +03002550void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2551 GLenum pathNameType,
2552 const void *paths,
2553 GLuint pathBase,
2554 GLint reference,
2555 GLuint mask,
2556 GLenum coverMode,
2557 GLenum transformType,
2558 const GLfloat *transformValues)
2559{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002560 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002561
Geoff Lang9bf86f02018-07-26 11:46:34 -04002562 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002563
2564 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2565 transformType, transformValues);
2566}
2567
Sami Väisänen46eaa942016-06-29 10:26:37 +03002568void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2569{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002570 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002571
2572 programObject->bindFragmentInputLocation(location, name);
2573}
2574
2575void Context::programPathFragmentInputGen(GLuint program,
2576 GLint location,
2577 GLenum genMode,
2578 GLint components,
2579 const GLfloat *coeffs)
2580{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002581 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002582
jchen103fd614d2018-08-13 12:21:58 +08002583 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002584}
2585
jchen1015015f72017-03-16 13:54:21 +08002586GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2587{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002588 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002589 return QueryProgramResourceIndex(programObject, programInterface, name);
2590}
2591
jchen10fd7c3b52017-03-21 15:36:03 +08002592void Context::getProgramResourceName(GLuint program,
2593 GLenum programInterface,
2594 GLuint index,
2595 GLsizei bufSize,
2596 GLsizei *length,
2597 GLchar *name)
2598{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002599 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002600 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2601}
2602
jchen10191381f2017-04-11 13:59:04 +08002603GLint Context::getProgramResourceLocation(GLuint program,
2604 GLenum programInterface,
2605 const GLchar *name)
2606{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002607 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002608 return QueryProgramResourceLocation(programObject, programInterface, name);
2609}
2610
jchen10880683b2017-04-12 16:21:55 +08002611void Context::getProgramResourceiv(GLuint program,
2612 GLenum programInterface,
2613 GLuint index,
2614 GLsizei propCount,
2615 const GLenum *props,
2616 GLsizei bufSize,
2617 GLsizei *length,
2618 GLint *params)
2619{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002620 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002621 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2622 length, params);
2623}
2624
jchen10d9cd7b72017-08-30 15:04:25 +08002625void Context::getProgramInterfaceiv(GLuint program,
2626 GLenum programInterface,
2627 GLenum pname,
2628 GLint *params)
2629{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002630 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002631 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2632}
2633
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002634void Context::getProgramInterfaceivRobust(GLuint program,
2635 GLenum programInterface,
2636 GLenum pname,
2637 GLsizei bufSize,
2638 GLsizei *length,
2639 GLint *params)
2640{
2641 UNIMPLEMENTED();
2642}
2643
Jamie Madill306b6c12018-07-27 08:12:49 -04002644void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002645{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002646 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002647}
2648
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002649void Context::handleError(GLenum errorCode,
2650 const char *message,
2651 const char *file,
2652 const char *function,
2653 unsigned int line)
2654{
2655 mErrors.handleError(errorCode, message, file, function, line);
2656}
2657
Jamie Madilla139f012018-10-10 16:13:03 -04002658void Context::validationError(GLenum errorCode, const char *message)
2659{
2660 mErrors.validationError(errorCode, message);
2661}
2662
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002663// Get one of the recorded errors and clear its flag, if any.
2664// [OpenGL ES 2.0.24] section 2.5 page 13.
2665GLenum Context::getError()
2666{
Geoff Langda5777c2014-07-11 09:52:58 -04002667 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002668 {
Geoff Langda5777c2014-07-11 09:52:58 -04002669 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002670 }
Geoff Langda5777c2014-07-11 09:52:58 -04002671 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002672 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002673 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002674 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002675}
2676
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002677// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002678void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002679{
2680 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002681 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002682 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002683 mContextLostForced = true;
2684 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002685 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002686}
2687
Jamie Madillfa920eb2018-01-04 11:45:50 -05002688GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002689{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002690 // Even if the application doesn't want to know about resets, we want to know
2691 // as it will allow us to skip all the calls.
2692 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002693 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002694 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002695 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002696 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002697 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002698
2699 // EXT_robustness, section 2.6: If the reset notification behavior is
2700 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2701 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2702 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002703 }
2704
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002705 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2706 // status should be returned at least once, and GL_NO_ERROR should be returned
2707 // once the device has finished resetting.
2708 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002709 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002710 ASSERT(mResetStatus == GL_NO_ERROR);
2711 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002712
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002713 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002714 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002715 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002716 }
2717 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002718 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002719 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002720 // If markContextLost was used to mark the context lost then
2721 // assume that is not recoverable, and continue to report the
2722 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002723 mResetStatus = mImplementation->getResetStatus();
2724 }
Jamie Madill893ab082014-05-16 16:56:10 -04002725
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002726 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002727}
2728
2729bool Context::isResetNotificationEnabled()
2730{
2731 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2732}
2733
Corentin Walleze3b10e82015-05-20 11:06:25 -04002734const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002735{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002736 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002737}
2738
2739EGLenum Context::getClientType() const
2740{
2741 return mClientType;
2742}
2743
2744EGLenum Context::getRenderBuffer() const
2745{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002746 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2747 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002748 {
2749 return EGL_NONE;
2750 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002751
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002752 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002753 ASSERT(backAttachment != nullptr);
2754 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002755}
2756
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002757VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002758{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002759 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002760 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2761 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002762 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002763 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2764 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002765
Jamie Madill96a483b2017-06-27 16:49:21 -04002766 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002767 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002768
2769 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002770}
2771
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002772TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002773{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002774 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002775 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2776 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002777 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002778 transformFeedback =
2779 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002780 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002781 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002782 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002783
2784 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002785}
2786
2787bool Context::isVertexArrayGenerated(GLuint vertexArray)
2788{
Jamie Madill96a483b2017-06-27 16:49:21 -04002789 ASSERT(mVertexArrayMap.contains(0));
2790 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002791}
2792
2793bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2794{
Jamie Madill96a483b2017-06-27 16:49:21 -04002795 ASSERT(mTransformFeedbackMap.contains(0));
2796 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002797}
2798
Shannon Woods53a94a82014-06-24 15:20:36 -04002799void Context::detachTexture(GLuint texture)
2800{
2801 // Simple pass-through to State's detachTexture method, as textures do not require
2802 // allocation map management either here or in the resource manager at detach time.
2803 // Zero textures are held by the Context, and we don't attempt to request them from
2804 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002805 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002806}
2807
James Darpinian4d9d4832018-03-13 12:43:28 -07002808void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002809{
Yuly Novikov5807a532015-12-03 13:01:22 -05002810 // Simple pass-through to State's detachBuffer method, since
2811 // only buffer attachments to container objects that are bound to the current context
2812 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002813
Yuly Novikov5807a532015-12-03 13:01:22 -05002814 // [OpenGL ES 3.2] section 5.1.2 page 45:
2815 // Attachments to unbound container objects, such as
2816 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2817 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002818 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002819}
2820
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002821void Context::detachFramebuffer(GLuint framebuffer)
2822{
Shannon Woods53a94a82014-06-24 15:20:36 -04002823 // Framebuffer detachment is handled by Context, because 0 is a valid
2824 // Framebuffer object, and a pointer to it must be passed from Context
2825 // to State at binding time.
2826
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002827 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002828 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2829 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2830 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002831
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002832 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002833 {
2834 bindReadFramebuffer(0);
2835 }
2836
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002837 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002838 {
2839 bindDrawFramebuffer(0);
2840 }
2841}
2842
2843void Context::detachRenderbuffer(GLuint renderbuffer)
2844{
Jamie Madilla02315b2017-02-23 14:14:47 -05002845 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002846}
2847
Jamie Madill57a89722013-07-02 11:57:03 -04002848void Context::detachVertexArray(GLuint vertexArray)
2849{
Jamie Madill77a72f62015-04-14 11:18:32 -04002850 // Vertex array detachment is handled by Context, because 0 is a valid
2851 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002852 // binding time.
2853
Jamie Madill57a89722013-07-02 11:57:03 -04002854 // [OpenGL ES 3.0.2] section 2.10 page 43:
2855 // If a vertex array object that is currently bound is deleted, the binding
2856 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002857 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002858 {
2859 bindVertexArray(0);
2860 }
2861}
2862
Geoff Langc8058452014-02-03 12:04:11 -05002863void Context::detachTransformFeedback(GLuint transformFeedback)
2864{
Corentin Walleza2257da2016-04-19 16:43:12 -04002865 // Transform feedback detachment is handled by Context, because 0 is a valid
2866 // transform feedback, and a pointer to it must be passed from Context to State at
2867 // binding time.
2868
2869 // The OpenGL specification doesn't mention what should happen when the currently bound
2870 // transform feedback object is deleted. Since it is a container object, we treat it like
2871 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002872 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002873 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002874 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002875 }
Geoff Langc8058452014-02-03 12:04:11 -05002876}
2877
Jamie Madilldc356042013-07-19 16:36:57 -04002878void Context::detachSampler(GLuint sampler)
2879{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002880 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002881}
2882
Yunchao Hea336b902017-08-02 16:05:21 +08002883void Context::detachProgramPipeline(GLuint pipeline)
2884{
2885 mGLState.detachProgramPipeline(this, pipeline);
2886}
2887
Jamie Madill3ef140a2017-08-26 23:11:21 -04002888void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002889{
Shaodde78e82017-05-22 14:13:27 +08002890 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002891 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002892}
2893
Jamie Madille29d1672013-07-19 16:36:57 -04002894void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2895{
Till Rathmannb8543632018-10-02 19:46:14 +02002896 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002897 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002898 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002899}
Jamie Madille29d1672013-07-19 16:36:57 -04002900
Geoff Langc1984ed2016-10-07 12:41:00 -04002901void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2902{
Till Rathmannb8543632018-10-02 19:46:14 +02002903 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002904 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002905 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002906}
2907
Till Rathmannb8543632018-10-02 19:46:14 +02002908void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2909{
2910 Sampler *const samplerObject =
2911 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2912 SetSamplerParameterIiv(this, samplerObject, pname, param);
2913}
2914
2915void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2916{
2917 Sampler *const samplerObject =
2918 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2919 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2920}
2921
Brandon Jones59770802018-04-02 13:18:42 -07002922void Context::samplerParameterivRobust(GLuint sampler,
2923 GLenum pname,
2924 GLsizei bufSize,
2925 const GLint *param)
2926{
2927 samplerParameteriv(sampler, pname, param);
2928}
2929
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002930void Context::samplerParameterIivRobust(GLuint sampler,
2931 GLenum pname,
2932 GLsizei bufSize,
2933 const GLint *param)
2934{
2935 UNIMPLEMENTED();
2936}
2937
2938void Context::samplerParameterIuivRobust(GLuint sampler,
2939 GLenum pname,
2940 GLsizei bufSize,
2941 const GLuint *param)
2942{
2943 UNIMPLEMENTED();
2944}
2945
Jamie Madille29d1672013-07-19 16:36:57 -04002946void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2947{
Till Rathmannb8543632018-10-02 19:46:14 +02002948 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002949 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002950 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002951}
2952
Geoff Langc1984ed2016-10-07 12:41:00 -04002953void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002954{
Till Rathmannb8543632018-10-02 19:46:14 +02002955 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002956 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002957 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002958}
2959
Brandon Jones59770802018-04-02 13:18:42 -07002960void Context::samplerParameterfvRobust(GLuint sampler,
2961 GLenum pname,
2962 GLsizei bufSize,
2963 const GLfloat *param)
2964{
2965 samplerParameterfv(sampler, pname, param);
2966}
2967
Geoff Langc1984ed2016-10-07 12:41:00 -04002968void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002969{
Till Rathmannb8543632018-10-02 19:46:14 +02002970 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002971 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002972 QuerySamplerParameteriv(samplerObject, pname, params);
2973}
Jamie Madill9675b802013-07-19 16:36:59 -04002974
Till Rathmannb8543632018-10-02 19:46:14 +02002975void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2976{
2977 const Sampler *const samplerObject =
2978 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2979 QuerySamplerParameterIiv(samplerObject, pname, params);
2980}
2981
2982void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2983{
2984 const Sampler *const samplerObject =
2985 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2986 QuerySamplerParameterIuiv(samplerObject, pname, params);
2987}
2988
Brandon Jones59770802018-04-02 13:18:42 -07002989void Context::getSamplerParameterivRobust(GLuint sampler,
2990 GLenum pname,
2991 GLsizei bufSize,
2992 GLsizei *length,
2993 GLint *params)
2994{
2995 getSamplerParameteriv(sampler, pname, params);
2996}
2997
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002998void Context::getSamplerParameterIivRobust(GLuint sampler,
2999 GLenum pname,
3000 GLsizei bufSize,
3001 GLsizei *length,
3002 GLint *params)
3003{
3004 UNIMPLEMENTED();
3005}
3006
3007void Context::getSamplerParameterIuivRobust(GLuint sampler,
3008 GLenum pname,
3009 GLsizei bufSize,
3010 GLsizei *length,
3011 GLuint *params)
3012{
3013 UNIMPLEMENTED();
3014}
3015
Geoff Langc1984ed2016-10-07 12:41:00 -04003016void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
3017{
Till Rathmannb8543632018-10-02 19:46:14 +02003018 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05003019 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04003020 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04003021}
3022
Brandon Jones59770802018-04-02 13:18:42 -07003023void Context::getSamplerParameterfvRobust(GLuint sampler,
3024 GLenum pname,
3025 GLsizei bufSize,
3026 GLsizei *length,
3027 GLfloat *params)
3028{
3029 getSamplerParameterfv(sampler, pname, params);
3030}
3031
Olli Etuahof0fee072016-03-30 15:11:58 +03003032void Context::programParameteri(GLuint program, GLenum pname, GLint value)
3033{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04003034 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08003035 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03003036}
3037
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003038void Context::initRendererString()
3039{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003040 std::ostringstream rendererString;
3041 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003042 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003043 rendererString << ")";
3044
Geoff Langcec35902014-04-16 10:52:36 -04003045 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003046}
3047
Geoff Langc339c4e2016-11-29 10:37:36 -05003048void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003049{
Geoff Langc339c4e2016-11-29 10:37:36 -05003050 const Version &clientVersion = getClientVersion();
3051
3052 std::ostringstream versionString;
3053 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3054 << ANGLE_VERSION_STRING << ")";
3055 mVersionString = MakeStaticString(versionString.str());
3056
3057 std::ostringstream shadingLanguageVersionString;
3058 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3059 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3060 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3061 << ")";
3062 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003063}
3064
Geoff Langcec35902014-04-16 10:52:36 -04003065void Context::initExtensionStrings()
3066{
Geoff Langc339c4e2016-11-29 10:37:36 -05003067 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3068 std::ostringstream combinedStringStream;
3069 std::copy(strings.begin(), strings.end(),
3070 std::ostream_iterator<const char *>(combinedStringStream, " "));
3071 return MakeStaticString(combinedStringStream.str());
3072 };
3073
3074 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003075 for (const auto &extensionString : mExtensions.getStrings())
3076 {
3077 mExtensionStrings.push_back(MakeStaticString(extensionString));
3078 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003079 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003080
Geoff Langc339c4e2016-11-29 10:37:36 -05003081 mRequestableExtensionStrings.clear();
3082 for (const auto &extensionInfo : GetExtensionInfoMap())
3083 {
3084 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003085 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003086 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003087 {
3088 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3089 }
3090 }
3091 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003092}
3093
Geoff Langc339c4e2016-11-29 10:37:36 -05003094const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003095{
Geoff Langc339c4e2016-11-29 10:37:36 -05003096 switch (name)
3097 {
3098 case GL_VENDOR:
3099 return reinterpret_cast<const GLubyte *>("Google Inc.");
3100
3101 case GL_RENDERER:
3102 return reinterpret_cast<const GLubyte *>(mRendererString);
3103
3104 case GL_VERSION:
3105 return reinterpret_cast<const GLubyte *>(mVersionString);
3106
3107 case GL_SHADING_LANGUAGE_VERSION:
3108 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3109
3110 case GL_EXTENSIONS:
3111 return reinterpret_cast<const GLubyte *>(mExtensionString);
3112
3113 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3114 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3115
3116 default:
3117 UNREACHABLE();
3118 return nullptr;
3119 }
Geoff Langcec35902014-04-16 10:52:36 -04003120}
3121
Geoff Langc339c4e2016-11-29 10:37:36 -05003122const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003123{
Geoff Langc339c4e2016-11-29 10:37:36 -05003124 switch (name)
3125 {
3126 case GL_EXTENSIONS:
3127 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3128
3129 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3130 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3131
3132 default:
3133 UNREACHABLE();
3134 return nullptr;
3135 }
Geoff Langcec35902014-04-16 10:52:36 -04003136}
3137
3138size_t Context::getExtensionStringCount() const
3139{
3140 return mExtensionStrings.size();
3141}
3142
Geoff Lang111a99e2017-10-17 10:58:41 -04003143bool Context::isExtensionRequestable(const char *name)
3144{
3145 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3146 auto extension = extensionInfos.find(name);
3147
Geoff Lang111a99e2017-10-17 10:58:41 -04003148 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003149 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003150}
3151
Geoff Langc339c4e2016-11-29 10:37:36 -05003152void Context::requestExtension(const char *name)
3153{
3154 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3155 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3156 const auto &extension = extensionInfos.at(name);
3157 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003158 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003159
3160 if (mExtensions.*(extension.ExtensionsMember))
3161 {
3162 // Extension already enabled
3163 return;
3164 }
3165
3166 mExtensions.*(extension.ExtensionsMember) = true;
3167 updateCaps();
3168 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003169
Jamie Madill2f348d22017-06-05 10:50:59 -04003170 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3171 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003172
Jamie Madill81c2e252017-09-09 23:32:46 -04003173 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3174 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003175 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003176 for (auto &zeroTexture : mZeroTextures)
3177 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003178 if (zeroTexture.get() != nullptr)
3179 {
3180 zeroTexture->signalDirty(this, InitState::Initialized);
3181 }
Geoff Lang9aded172017-04-05 11:07:56 -04003182 }
3183
Jamie Madillb983a4b2018-08-01 11:34:51 -04003184 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003185}
3186
3187size_t Context::getRequestableExtensionStringCount() const
3188{
3189 return mRequestableExtensionStrings.size();
3190}
3191
Jamie Madill493f9572018-05-24 19:52:15 -04003192void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003193{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003194 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003195 ASSERT(transformFeedback != nullptr);
3196 ASSERT(!transformFeedback->isPaused());
3197
Jamie Madill6c1f6712017-02-14 19:08:04 -05003198 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003199 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003200}
3201
3202bool Context::hasActiveTransformFeedback(GLuint program) const
3203{
3204 for (auto pair : mTransformFeedbackMap)
3205 {
3206 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3207 {
3208 return true;
3209 }
3210 }
3211 return false;
3212}
3213
Geoff Lang33f11fb2018-05-07 13:42:47 -04003214Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003215{
3216 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3217
jchen1082af6202018-06-22 10:59:52 +08003218 // Explicitly enable GL_KHR_parallel_shader_compile
3219 supportedExtensions.parallelShaderCompile = true;
3220
Geoff Langb0f917f2017-12-05 13:41:54 -05003221 if (getClientVersion() < ES_2_0)
3222 {
3223 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003224 supportedExtensions.pointSizeArray = true;
3225 supportedExtensions.textureCubeMap = true;
3226 supportedExtensions.pointSprite = true;
3227 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003228 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003229 }
3230
3231 if (getClientVersion() < ES_3_0)
3232 {
3233 // Disable ES3+ extensions
3234 supportedExtensions.colorBufferFloat = false;
3235 supportedExtensions.eglImageExternalEssl3 = false;
3236 supportedExtensions.textureNorm16 = false;
3237 supportedExtensions.multiview = false;
3238 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003239 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003240 supportedExtensions.textureMultisample = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003241 }
3242
3243 if (getClientVersion() < ES_3_1)
3244 {
3245 // Disable ES3.1+ extensions
3246 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003247
3248 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3249 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003250 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003251 }
3252
3253 if (getClientVersion() > ES_2_0)
3254 {
3255 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3256 // supportedExtensions.sRGB = false;
3257 }
3258
3259 // Some extensions are always available because they are implemented in the GL layer.
3260 supportedExtensions.bindUniformLocation = true;
3261 supportedExtensions.vertexArrayObject = true;
3262 supportedExtensions.bindGeneratesResource = true;
3263 supportedExtensions.clientArrays = true;
3264 supportedExtensions.requestExtension = true;
Austin Eng7cf9cd22018-10-09 15:27:32 -07003265 supportedExtensions.multiDraw = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003266
3267 // Enable the no error extension if the context was created with the flag.
3268 supportedExtensions.noError = mSkipValidation;
3269
3270 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003271 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003272
3273 // Explicitly enable GL_KHR_debug
3274 supportedExtensions.debug = true;
3275 supportedExtensions.maxDebugMessageLength = 1024;
3276 supportedExtensions.maxDebugLoggedMessages = 1024;
3277 supportedExtensions.maxDebugGroupStackDepth = 1024;
3278 supportedExtensions.maxLabelLength = 1024;
3279
3280 // Explicitly enable GL_ANGLE_robust_client_memory
3281 supportedExtensions.robustClientMemory = true;
3282
3283 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003284 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003285
3286 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3287 // supports it.
3288 supportedExtensions.robustBufferAccessBehavior =
3289 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3290
3291 // Enable the cache control query unconditionally.
3292 supportedExtensions.programCacheControl = true;
3293
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003294 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003295 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003296 {
3297 // GL_ANGLE_explicit_context_gles1
3298 supportedExtensions.explicitContextGles1 = true;
3299 // GL_ANGLE_explicit_context
3300 supportedExtensions.explicitContext = true;
3301 }
3302
Geoff Lang79b91402018-10-04 15:11:30 -04003303 supportedExtensions.memorySize = true;
3304
Geoff Langb0f917f2017-12-05 13:41:54 -05003305 return supportedExtensions;
3306}
3307
Geoff Lang33f11fb2018-05-07 13:42:47 -04003308void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003309{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003310 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003311
Geoff Lang33f11fb2018-05-07 13:42:47 -04003312 mSupportedExtensions = generateSupportedExtensions();
3313 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003314
3315 mLimitations = mImplementation->getNativeLimitations();
3316
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003317 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3318 if (getClientVersion() < Version(2, 0))
3319 {
3320 mCaps.maxMultitextureUnits = 4;
3321 mCaps.maxClipPlanes = 6;
3322 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003323 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3324 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3325 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003326 mCaps.minSmoothPointSize = 1.0f;
3327 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003328 mCaps.minSmoothLineWidth = 1.0f;
3329 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003330 }
3331
Luc Ferronad2ae932018-06-11 15:31:17 -04003332 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003333 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003334
Luc Ferronad2ae932018-06-11 15:31:17 -04003335 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3336
Jamie Madill0f80ed82017-09-19 00:24:56 -04003337 if (getClientVersion() < ES_3_1)
3338 {
3339 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3340 }
3341 else
3342 {
3343 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3344 }
Geoff Lang301d1612014-07-09 10:34:37 -04003345
Jiawei Shao54aafe52018-04-27 14:54:57 +08003346 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3347 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003348 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3349
Jamie Madill0f80ed82017-09-19 00:24:56 -04003350 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3351 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3352
3353 // Limit textures as well, so we can use fast bitsets with texture bindings.
3354 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003355 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3356 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3357 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3358 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003359
Jiawei Shaodb342272017-09-27 10:21:45 +08003360 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3361
Geoff Langc287ea62016-09-16 14:46:51 -04003362 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003363 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003364 for (const auto &extensionInfo : GetExtensionInfoMap())
3365 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003366 // If the user has requested that extensions start disabled and they are requestable,
3367 // disable them.
3368 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003369 {
3370 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3371 }
3372 }
3373
3374 // Generate texture caps
3375 updateCaps();
3376}
3377
3378void Context::updateCaps()
3379{
Geoff Lang900013c2014-07-07 11:32:19 -04003380 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003381 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003382
Jamie Madill7b62cf92017-11-02 15:20:49 -04003383 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003384 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003385 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003386 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003387
Geoff Lang0d8b7242015-09-09 14:56:53 -04003388 // Update the format caps based on the client version and extensions.
3389 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3390 // ES3.
3391 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003392 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003393 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003394 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003395 formatCaps.textureAttachment =
3396 formatCaps.textureAttachment &&
3397 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3398 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3399 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003400
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003401 // OpenGL ES does not support multisampling with non-rendererable formats
3402 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003403 if (!formatCaps.renderbuffer ||
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003404 (getClientVersion() < ES_3_1 && !mSupportedExtensions.textureMultisample &&
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003405 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003406 {
Geoff Langd87878e2014-09-19 15:42:59 -04003407 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003408 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003409 else
3410 {
3411 // We may have limited the max samples for some required renderbuffer formats due to
3412 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3413 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3414
3415 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3416 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3417 // exception of signed and unsigned integer formats."
3418 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3419 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3420 {
3421 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3422 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3423 }
3424
3425 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003426 if (getClientVersion() >= ES_3_1 || mSupportedExtensions.textureMultisample)
Olli Etuaho50c562d2017-06-06 14:43:30 +03003427 {
3428 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3429 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3430 // the exception that the signed and unsigned integer formats are required only to
3431 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3432 // multisamples, which must be at least one."
3433 if (formatInfo.componentType == GL_INT ||
3434 formatInfo.componentType == GL_UNSIGNED_INT)
3435 {
3436 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3437 }
3438
3439 // GLES 3.1 section 19.3.1.
3440 if (formatCaps.texturable)
3441 {
3442 if (formatInfo.depthBits > 0)
3443 {
3444 mCaps.maxDepthTextureSamples =
3445 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3446 }
3447 else if (formatInfo.redBits > 0)
3448 {
3449 mCaps.maxColorTextureSamples =
3450 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3451 }
3452 }
3453 }
3454 }
Geoff Langd87878e2014-09-19 15:42:59 -04003455
3456 if (formatCaps.texturable && formatInfo.compressed)
3457 {
Geoff Langca271392017-04-05 12:30:00 -04003458 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003459 }
3460
Geoff Langca271392017-04-05 12:30:00 -04003461 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003462 }
Jamie Madill32447362017-06-28 14:53:52 -04003463
3464 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003465 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003466 {
3467 mMemoryProgramCache = nullptr;
3468 }
Corentin Walleze4477002017-12-01 14:39:58 -05003469
3470 // Compute which buffer types are allowed
3471 mValidBufferBindings.reset();
3472 mValidBufferBindings.set(BufferBinding::ElementArray);
3473 mValidBufferBindings.set(BufferBinding::Array);
3474
3475 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3476 {
3477 mValidBufferBindings.set(BufferBinding::PixelPack);
3478 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3479 }
3480
3481 if (getClientVersion() >= ES_3_0)
3482 {
3483 mValidBufferBindings.set(BufferBinding::CopyRead);
3484 mValidBufferBindings.set(BufferBinding::CopyWrite);
3485 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3486 mValidBufferBindings.set(BufferBinding::Uniform);
3487 }
3488
3489 if (getClientVersion() >= ES_3_1)
3490 {
3491 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3492 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3493 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3494 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3495 }
jchen107ae70d82018-07-06 13:47:01 +08003496
3497 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003498
3499 // Reinitialize state cache after extension changes.
3500 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003501}
3502
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003503void Context::initWorkarounds()
3504{
Jamie Madill761b02c2017-06-23 16:27:06 -04003505 // Apply back-end workarounds.
3506 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3507
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003508 // Lose the context upon out of memory error if the application is
3509 // expecting to watch for those events.
3510 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003511
3512 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3513 {
3514 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3515 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3516 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3517 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003518}
3519
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003520// Return true if the draw is a no-op, else return false.
3521// A no-op draw occurs if the count of vertices is less than the minimum required to
3522// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3523bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3524{
3525 return count < kMinimumPrimitiveCounts[mode];
3526}
3527
3528bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3529{
3530 return (instanceCount == 0) || noopDraw(mode, count);
3531}
3532
Jamie Madill6f755b22018-10-09 12:48:54 -04003533angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003534{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003535 if (mGLES1Renderer)
3536 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003537 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003538 }
3539
Geoff Lang9bf86f02018-07-26 11:46:34 -04003540 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003541
3542 if (isRobustResourceInitEnabled())
3543 {
3544 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3545 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3546 }
3547
Geoff Langa8cb2872018-03-09 16:09:40 -05003548 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003549 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003550}
3551
3552Error Context::prepareForClear(GLbitfield mask)
3553{
Geoff Langa8cb2872018-03-09 16:09:40 -05003554 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003555 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003556 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003557 return NoError();
3558}
3559
3560Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3561{
Geoff Langa8cb2872018-03-09 16:09:40 -05003562 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003563 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3564 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003565 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003566 return NoError();
3567}
3568
Geoff Langa8cb2872018-03-09 16:09:40 -05003569Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003570{
Geoff Langa8cb2872018-03-09 16:09:40 -05003571 ANGLE_TRY(syncDirtyObjects(objectMask));
3572 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003573 return NoError();
3574}
3575
Jamie Madill6f755b22018-10-09 12:48:54 -04003576angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003577{
3578 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003579 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003580 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003581 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003582}
3583
Jamie Madill6f755b22018-10-09 12:48:54 -04003584angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003585{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003586 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003587 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003588 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003589 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003590}
Jamie Madillc29968b2016-01-20 11:17:23 -05003591
Jamie Madill6f755b22018-10-09 12:48:54 -04003592angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003593{
3594 return mGLState.syncDirtyObjects(this, objectMask);
3595}
3596
Jamie Madillc29968b2016-01-20 11:17:23 -05003597void Context::blitFramebuffer(GLint srcX0,
3598 GLint srcY0,
3599 GLint srcX1,
3600 GLint srcY1,
3601 GLint dstX0,
3602 GLint dstY0,
3603 GLint dstX1,
3604 GLint dstY1,
3605 GLbitfield mask,
3606 GLenum filter)
3607{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003608 if (mask == 0)
3609 {
3610 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3611 // buffers are copied.
3612 return;
3613 }
3614
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003615 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003616 ASSERT(drawFramebuffer);
3617
3618 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3619 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3620
Jamie Madillbc918e72018-03-08 09:47:21 -05003621 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003622
Jamie Madillc564c072017-06-01 12:45:42 -04003623 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003624}
Jamie Madillc29968b2016-01-20 11:17:23 -05003625
3626void Context::clear(GLbitfield mask)
3627{
Geoff Langd4fff502017-09-22 11:28:28 -04003628 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3629 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003630}
3631
3632void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3633{
Olli Etuaho78df3362018-10-05 16:43:27 +03003634 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3635 const FramebufferAttachment *attachment = nullptr;
3636 if (buffer == GL_DEPTH)
3637 {
3638 attachment = framebufferObject->getDepthbuffer();
3639 }
3640 if (buffer == GL_COLOR &&
3641 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3642 {
3643 attachment = framebufferObject->getColorbuffer(drawbuffer);
3644 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003645 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3646 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003647 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003648 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003649 return;
3650 }
Geoff Langd4fff502017-09-22 11:28:28 -04003651 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003652 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003653}
3654
3655void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3656{
Olli Etuaho78df3362018-10-05 16:43:27 +03003657 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3658 const FramebufferAttachment *attachment = nullptr;
3659 if (buffer == GL_COLOR &&
3660 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3661 {
3662 attachment = framebufferObject->getColorbuffer(drawbuffer);
3663 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003664 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3665 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003666 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003667 {
3668 return;
3669 }
Geoff Langd4fff502017-09-22 11:28:28 -04003670 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003671 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003672}
3673
3674void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3675{
Olli Etuaho78df3362018-10-05 16:43:27 +03003676 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3677 const FramebufferAttachment *attachment = nullptr;
3678 if (buffer == GL_STENCIL)
3679 {
3680 attachment = framebufferObject->getStencilbuffer();
3681 }
3682 if (buffer == GL_COLOR &&
3683 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3684 {
3685 attachment = framebufferObject->getColorbuffer(drawbuffer);
3686 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003687 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3688 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003689 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003690 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003691 return;
3692 }
Geoff Langd4fff502017-09-22 11:28:28 -04003693 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003694 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003695}
3696
3697void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3698{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003699 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003700 ASSERT(framebufferObject);
3701
3702 // If a buffer is not present, the clear has no effect
3703 if (framebufferObject->getDepthbuffer() == nullptr &&
3704 framebufferObject->getStencilbuffer() == nullptr)
3705 {
3706 return;
3707 }
3708
Geoff Langd4fff502017-09-22 11:28:28 -04003709 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3710 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003711}
3712
3713void Context::readPixels(GLint x,
3714 GLint y,
3715 GLsizei width,
3716 GLsizei height,
3717 GLenum format,
3718 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003719 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003720{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003721 if (width == 0 || height == 0)
3722 {
3723 return;
3724 }
3725
Jamie Madillbc918e72018-03-08 09:47:21 -05003726 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003727
Jamie Madillb6664922017-07-25 12:55:04 -04003728 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3729 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003730
3731 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003732 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003733}
3734
Brandon Jones59770802018-04-02 13:18:42 -07003735void Context::readPixelsRobust(GLint x,
3736 GLint y,
3737 GLsizei width,
3738 GLsizei height,
3739 GLenum format,
3740 GLenum type,
3741 GLsizei bufSize,
3742 GLsizei *length,
3743 GLsizei *columns,
3744 GLsizei *rows,
3745 void *pixels)
3746{
3747 readPixels(x, y, width, height, format, type, pixels);
3748}
3749
3750void Context::readnPixelsRobust(GLint x,
3751 GLint y,
3752 GLsizei width,
3753 GLsizei height,
3754 GLenum format,
3755 GLenum type,
3756 GLsizei bufSize,
3757 GLsizei *length,
3758 GLsizei *columns,
3759 GLsizei *rows,
3760 void *data)
3761{
3762 readPixels(x, y, width, height, format, type, data);
3763}
3764
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003765void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003766 GLint level,
3767 GLenum internalformat,
3768 GLint x,
3769 GLint y,
3770 GLsizei width,
3771 GLsizei height,
3772 GLint border)
3773{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003774 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003775 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003776
Jamie Madillc29968b2016-01-20 11:17:23 -05003777 Rectangle sourceArea(x, y, width, height);
3778
Jamie Madill05b35b22017-10-03 09:01:44 -04003779 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003780 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003781 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003782}
3783
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003784void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003785 GLint level,
3786 GLint xoffset,
3787 GLint yoffset,
3788 GLint x,
3789 GLint y,
3790 GLsizei width,
3791 GLsizei height)
3792{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003793 if (width == 0 || height == 0)
3794 {
3795 return;
3796 }
3797
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003798 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003799 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003800
Jamie Madillc29968b2016-01-20 11:17:23 -05003801 Offset destOffset(xoffset, yoffset, 0);
3802 Rectangle sourceArea(x, y, width, height);
3803
Jamie Madill05b35b22017-10-03 09:01:44 -04003804 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003805 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003806 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003807}
3808
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003809void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003810 GLint level,
3811 GLint xoffset,
3812 GLint yoffset,
3813 GLint zoffset,
3814 GLint x,
3815 GLint y,
3816 GLsizei width,
3817 GLsizei height)
3818{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003819 if (width == 0 || height == 0)
3820 {
3821 return;
3822 }
3823
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003824 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003825 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003826
Jamie Madillc29968b2016-01-20 11:17:23 -05003827 Offset destOffset(xoffset, yoffset, zoffset);
3828 Rectangle sourceArea(x, y, width, height);
3829
Jamie Madill05b35b22017-10-03 09:01:44 -04003830 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3831 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003832 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3833 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003834}
3835
3836void Context::framebufferTexture2D(GLenum target,
3837 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003838 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003839 GLuint texture,
3840 GLint level)
3841{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003842 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003843 ASSERT(framebuffer);
3844
3845 if (texture != 0)
3846 {
3847 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003848 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003849 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003850 }
3851 else
3852 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003853 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003854 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003855
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003856 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003857}
3858
3859void Context::framebufferRenderbuffer(GLenum target,
3860 GLenum attachment,
3861 GLenum renderbuffertarget,
3862 GLuint renderbuffer)
3863{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003864 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003865 ASSERT(framebuffer);
3866
3867 if (renderbuffer != 0)
3868 {
3869 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003870
Jamie Madillcc129372018-04-12 09:13:18 -04003871 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003872 renderbufferObject);
3873 }
3874 else
3875 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003876 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003877 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003878
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003879 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003880}
3881
3882void Context::framebufferTextureLayer(GLenum target,
3883 GLenum attachment,
3884 GLuint texture,
3885 GLint level,
3886 GLint layer)
3887{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003888 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003889 ASSERT(framebuffer);
3890
3891 if (texture != 0)
3892 {
3893 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003894 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003895 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003896 }
3897 else
3898 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003899 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003900 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003901
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003902 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003903}
3904
Brandon Jones59770802018-04-02 13:18:42 -07003905void Context::framebufferTextureMultiviewLayered(GLenum target,
3906 GLenum attachment,
3907 GLuint texture,
3908 GLint level,
3909 GLint baseViewIndex,
3910 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003911{
Martin Radev82ef7742017-08-08 17:44:58 +03003912 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3913 ASSERT(framebuffer);
3914
3915 if (texture != 0)
3916 {
3917 Texture *textureObj = getTexture(texture);
3918
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003919 ImageIndex index;
3920 if (textureObj->getType() == TextureType::_2DArray)
3921 {
3922 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3923 }
3924 else
3925 {
3926 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3927 ASSERT(level == 0);
3928 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3929 }
Martin Radev82ef7742017-08-08 17:44:58 +03003930 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3931 numViews, baseViewIndex);
3932 }
3933 else
3934 {
3935 framebuffer->resetAttachment(this, attachment);
3936 }
3937
3938 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003939}
3940
Brandon Jones59770802018-04-02 13:18:42 -07003941void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3942 GLenum attachment,
3943 GLuint texture,
3944 GLint level,
3945 GLsizei numViews,
3946 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003947{
Martin Radev5dae57b2017-07-14 16:15:55 +03003948 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3949 ASSERT(framebuffer);
3950
3951 if (texture != 0)
3952 {
3953 Texture *textureObj = getTexture(texture);
3954
3955 ImageIndex index = ImageIndex::Make2D(level);
3956 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3957 textureObj, numViews, viewportOffsets);
3958 }
3959 else
3960 {
3961 framebuffer->resetAttachment(this, attachment);
3962 }
3963
3964 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003965}
3966
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003967void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3968{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003969 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3970 ASSERT(framebuffer);
3971
3972 if (texture != 0)
3973 {
3974 Texture *textureObj = getTexture(texture);
3975
3976 ImageIndex index = ImageIndex::MakeFromType(
3977 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3978 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3979 }
3980 else
3981 {
3982 framebuffer->resetAttachment(this, attachment);
3983 }
3984
3985 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003986}
3987
Jamie Madillc29968b2016-01-20 11:17:23 -05003988void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3989{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003990 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003991 ASSERT(framebuffer);
3992 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003993 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003994 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003995}
3996
3997void Context::readBuffer(GLenum mode)
3998{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003999 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05004000 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004001 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05004002}
4003
4004void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
4005{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004006 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004007 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004008
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004009 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004010 ASSERT(framebuffer);
4011
4012 // The specification isn't clear what should be done when the framebuffer isn't complete.
4013 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04004014 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004015}
4016
4017void Context::invalidateFramebuffer(GLenum target,
4018 GLsizei numAttachments,
4019 const GLenum *attachments)
4020{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004021 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004022 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004023
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004024 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004025 ASSERT(framebuffer);
4026
Jamie Madill427064d2018-04-13 16:20:34 -04004027 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004028 {
Jamie Madill437fa652016-05-03 15:13:24 -04004029 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004030 }
Jamie Madill437fa652016-05-03 15:13:24 -04004031
Jamie Madill4928b7c2017-06-20 12:57:39 -04004032 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004033}
4034
4035void Context::invalidateSubFramebuffer(GLenum target,
4036 GLsizei numAttachments,
4037 const GLenum *attachments,
4038 GLint x,
4039 GLint y,
4040 GLsizei width,
4041 GLsizei height)
4042{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004043 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004044 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004045
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004046 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004047 ASSERT(framebuffer);
4048
Jamie Madill427064d2018-04-13 16:20:34 -04004049 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004050 {
Jamie Madill437fa652016-05-03 15:13:24 -04004051 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004052 }
Jamie Madill437fa652016-05-03 15:13:24 -04004053
4054 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004055 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05004056}
4057
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004058void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004059 GLint level,
4060 GLint internalformat,
4061 GLsizei width,
4062 GLsizei height,
4063 GLint border,
4064 GLenum format,
4065 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004066 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004067{
Jamie Madillbc918e72018-03-08 09:47:21 -05004068 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004069
4070 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004071 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004072 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004073 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004074}
4075
Brandon Jones59770802018-04-02 13:18:42 -07004076void Context::texImage2DRobust(TextureTarget target,
4077 GLint level,
4078 GLint internalformat,
4079 GLsizei width,
4080 GLsizei height,
4081 GLint border,
4082 GLenum format,
4083 GLenum type,
4084 GLsizei bufSize,
4085 const void *pixels)
4086{
4087 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4088}
4089
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004090void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004091 GLint level,
4092 GLint internalformat,
4093 GLsizei width,
4094 GLsizei height,
4095 GLsizei depth,
4096 GLint border,
4097 GLenum format,
4098 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004099 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004100{
Jamie Madillbc918e72018-03-08 09:47:21 -05004101 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004102
4103 Extents size(width, height, depth);
4104 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004105 handleError(texture->setImage(this, mGLState.getUnpackState(),
4106 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004107 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004108}
4109
Brandon Jones59770802018-04-02 13:18:42 -07004110void Context::texImage3DRobust(TextureType target,
4111 GLint level,
4112 GLint internalformat,
4113 GLsizei width,
4114 GLsizei height,
4115 GLsizei depth,
4116 GLint border,
4117 GLenum format,
4118 GLenum type,
4119 GLsizei bufSize,
4120 const void *pixels)
4121{
4122 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4123}
4124
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004125void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004126 GLint level,
4127 GLint xoffset,
4128 GLint yoffset,
4129 GLsizei width,
4130 GLsizei height,
4131 GLenum format,
4132 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004133 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004134{
4135 // Zero sized uploads are valid but no-ops
4136 if (width == 0 || height == 0)
4137 {
4138 return;
4139 }
4140
Jamie Madillbc918e72018-03-08 09:47:21 -05004141 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004142
4143 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004144 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004145
4146 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4147
4148 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4149 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004150}
4151
Brandon Jones59770802018-04-02 13:18:42 -07004152void Context::texSubImage2DRobust(TextureTarget target,
4153 GLint level,
4154 GLint xoffset,
4155 GLint yoffset,
4156 GLsizei width,
4157 GLsizei height,
4158 GLenum format,
4159 GLenum type,
4160 GLsizei bufSize,
4161 const void *pixels)
4162{
4163 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4164}
4165
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004166void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004167 GLint level,
4168 GLint xoffset,
4169 GLint yoffset,
4170 GLint zoffset,
4171 GLsizei width,
4172 GLsizei height,
4173 GLsizei depth,
4174 GLenum format,
4175 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004176 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004177{
4178 // Zero sized uploads are valid but no-ops
4179 if (width == 0 || height == 0 || depth == 0)
4180 {
4181 return;
4182 }
4183
Jamie Madillbc918e72018-03-08 09:47:21 -05004184 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004185
4186 Box area(xoffset, yoffset, zoffset, width, height, depth);
4187 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004188
4189 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4190
4191 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004192 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004193 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004194}
4195
Brandon Jones59770802018-04-02 13:18:42 -07004196void Context::texSubImage3DRobust(TextureType target,
4197 GLint level,
4198 GLint xoffset,
4199 GLint yoffset,
4200 GLint zoffset,
4201 GLsizei width,
4202 GLsizei height,
4203 GLsizei depth,
4204 GLenum format,
4205 GLenum type,
4206 GLsizei bufSize,
4207 const void *pixels)
4208{
4209 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4210 pixels);
4211}
4212
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004213void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004214 GLint level,
4215 GLenum internalformat,
4216 GLsizei width,
4217 GLsizei height,
4218 GLint border,
4219 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004220 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004221{
Jamie Madillbc918e72018-03-08 09:47:21 -05004222 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004223
4224 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004225 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004226 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4227 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004228 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004229}
4230
Brandon Jones59770802018-04-02 13:18:42 -07004231void Context::compressedTexImage2DRobust(TextureTarget target,
4232 GLint level,
4233 GLenum internalformat,
4234 GLsizei width,
4235 GLsizei height,
4236 GLint border,
4237 GLsizei imageSize,
4238 GLsizei dataSize,
4239 const GLvoid *data)
4240{
4241 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4242}
4243
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004244void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004245 GLint level,
4246 GLenum internalformat,
4247 GLsizei width,
4248 GLsizei height,
4249 GLsizei depth,
4250 GLint border,
4251 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004252 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004253{
Jamie Madillbc918e72018-03-08 09:47:21 -05004254 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004255
4256 Extents size(width, height, depth);
4257 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004258 handleError(texture->setCompressedImage(
4259 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004260 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004261}
4262
Brandon Jones59770802018-04-02 13:18:42 -07004263void Context::compressedTexImage3DRobust(TextureType target,
4264 GLint level,
4265 GLenum internalformat,
4266 GLsizei width,
4267 GLsizei height,
4268 GLsizei depth,
4269 GLint border,
4270 GLsizei imageSize,
4271 GLsizei dataSize,
4272 const GLvoid *data)
4273{
4274 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4275 data);
4276}
4277
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004278void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004279 GLint level,
4280 GLint xoffset,
4281 GLint yoffset,
4282 GLsizei width,
4283 GLsizei height,
4284 GLenum format,
4285 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004286 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004287{
Jamie Madillbc918e72018-03-08 09:47:21 -05004288 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004289
4290 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004291 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004292 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4293 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004294 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004295}
4296
Brandon Jones59770802018-04-02 13:18:42 -07004297void Context::compressedTexSubImage2DRobust(TextureTarget target,
4298 GLint level,
4299 GLint xoffset,
4300 GLint yoffset,
4301 GLsizei width,
4302 GLsizei height,
4303 GLenum format,
4304 GLsizei imageSize,
4305 GLsizei dataSize,
4306 const GLvoid *data)
4307{
4308 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4309 data);
4310}
4311
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004312void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004313 GLint level,
4314 GLint xoffset,
4315 GLint yoffset,
4316 GLint zoffset,
4317 GLsizei width,
4318 GLsizei height,
4319 GLsizei depth,
4320 GLenum format,
4321 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004322 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004323{
4324 // Zero sized uploads are valid but no-ops
4325 if (width == 0 || height == 0)
4326 {
4327 return;
4328 }
4329
Jamie Madillbc918e72018-03-08 09:47:21 -05004330 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004331
4332 Box area(xoffset, yoffset, zoffset, width, height, depth);
4333 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004334 handleError(texture->setCompressedSubImage(
4335 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004336 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004337}
4338
Brandon Jones59770802018-04-02 13:18:42 -07004339void Context::compressedTexSubImage3DRobust(TextureType target,
4340 GLint level,
4341 GLint xoffset,
4342 GLint yoffset,
4343 GLint zoffset,
4344 GLsizei width,
4345 GLsizei height,
4346 GLsizei depth,
4347 GLenum format,
4348 GLsizei imageSize,
4349 GLsizei dataSize,
4350 const GLvoid *data)
4351{
4352 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4353 imageSize, data);
4354}
4355
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004356void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004357{
4358 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004359 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004360}
4361
Jamie Madill007530e2017-12-28 14:27:04 -05004362void Context::copyTexture(GLuint sourceId,
4363 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004364 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004365 GLuint destId,
4366 GLint destLevel,
4367 GLint internalFormat,
4368 GLenum destType,
4369 GLboolean unpackFlipY,
4370 GLboolean unpackPremultiplyAlpha,
4371 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004372{
Jamie Madillbc918e72018-03-08 09:47:21 -05004373 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004374
4375 gl::Texture *sourceTexture = getTexture(sourceId);
4376 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004377 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4378 sourceLevel, ConvertToBool(unpackFlipY),
4379 ConvertToBool(unpackPremultiplyAlpha),
4380 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004381}
4382
Jamie Madill007530e2017-12-28 14:27:04 -05004383void Context::copySubTexture(GLuint sourceId,
4384 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004385 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004386 GLuint destId,
4387 GLint destLevel,
4388 GLint xoffset,
4389 GLint yoffset,
4390 GLint x,
4391 GLint y,
4392 GLsizei width,
4393 GLsizei height,
4394 GLboolean unpackFlipY,
4395 GLboolean unpackPremultiplyAlpha,
4396 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004397{
4398 // Zero sized copies are valid but no-ops
4399 if (width == 0 || height == 0)
4400 {
4401 return;
4402 }
4403
Jamie Madillbc918e72018-03-08 09:47:21 -05004404 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004405
4406 gl::Texture *sourceTexture = getTexture(sourceId);
4407 gl::Texture *destTexture = getTexture(destId);
4408 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004409 Box box(x, y, 0, width, height, 1);
4410 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4411 ConvertToBool(unpackFlipY),
4412 ConvertToBool(unpackPremultiplyAlpha),
4413 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4414}
4415
4416void Context::copyTexture3D(GLuint sourceId,
4417 GLint sourceLevel,
4418 TextureTarget destTarget,
4419 GLuint destId,
4420 GLint destLevel,
4421 GLint internalFormat,
4422 GLenum destType,
4423 GLboolean unpackFlipY,
4424 GLboolean unpackPremultiplyAlpha,
4425 GLboolean unpackUnmultiplyAlpha)
4426{
4427 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4428
4429 Texture *sourceTexture = getTexture(sourceId);
4430 Texture *destTexture = getTexture(destId);
4431 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4432 sourceLevel, ConvertToBool(unpackFlipY),
4433 ConvertToBool(unpackPremultiplyAlpha),
4434 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4435}
4436
4437void Context::copySubTexture3D(GLuint sourceId,
4438 GLint sourceLevel,
4439 TextureTarget destTarget,
4440 GLuint destId,
4441 GLint destLevel,
4442 GLint xoffset,
4443 GLint yoffset,
4444 GLint zoffset,
4445 GLint x,
4446 GLint y,
4447 GLint z,
4448 GLsizei width,
4449 GLsizei height,
4450 GLsizei depth,
4451 GLboolean unpackFlipY,
4452 GLboolean unpackPremultiplyAlpha,
4453 GLboolean unpackUnmultiplyAlpha)
4454{
4455 // Zero sized copies are valid but no-ops
4456 if (width == 0 || height == 0 || depth == 0)
4457 {
4458 return;
4459 }
4460
4461 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4462
4463 Texture *sourceTexture = getTexture(sourceId);
4464 Texture *destTexture = getTexture(destId);
4465 Offset offset(xoffset, yoffset, zoffset);
4466 Box box(x, y, z, width, height, depth);
4467 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004468 ConvertToBool(unpackFlipY),
4469 ConvertToBool(unpackPremultiplyAlpha),
4470 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004471}
4472
Jamie Madill007530e2017-12-28 14:27:04 -05004473void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004474{
Jamie Madillbc918e72018-03-08 09:47:21 -05004475 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004476
4477 gl::Texture *sourceTexture = getTexture(sourceId);
4478 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004479 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004480}
4481
Corentin Wallez336129f2017-10-17 15:55:40 -04004482void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004483{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004484 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004485 ASSERT(buffer);
4486
Geoff Lang496c02d2016-10-20 11:38:11 -07004487 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004488}
4489
Brandon Jones59770802018-04-02 13:18:42 -07004490void Context::getBufferPointervRobust(BufferBinding target,
4491 GLenum pname,
4492 GLsizei bufSize,
4493 GLsizei *length,
4494 void **params)
4495{
4496 getBufferPointerv(target, pname, params);
4497}
4498
Corentin Wallez336129f2017-10-17 15:55:40 -04004499void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004500{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004501 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004502 ASSERT(buffer);
4503
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004504 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004505 if (error.isError())
4506 {
Jamie Madill437fa652016-05-03 15:13:24 -04004507 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004508 return nullptr;
4509 }
4510
4511 return buffer->getMapPointer();
4512}
4513
Corentin Wallez336129f2017-10-17 15:55:40 -04004514GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004515{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004516 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004517 ASSERT(buffer);
4518
4519 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004520 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004521 if (error.isError())
4522 {
Jamie Madill437fa652016-05-03 15:13:24 -04004523 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004524 return GL_FALSE;
4525 }
4526
4527 return result;
4528}
4529
Corentin Wallez336129f2017-10-17 15:55:40 -04004530void *Context::mapBufferRange(BufferBinding target,
4531 GLintptr offset,
4532 GLsizeiptr length,
4533 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004534{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004535 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004536 ASSERT(buffer);
4537
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004538 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004539 if (error.isError())
4540 {
Jamie Madill437fa652016-05-03 15:13:24 -04004541 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004542 return nullptr;
4543 }
4544
4545 return buffer->getMapPointer();
4546}
4547
Corentin Wallez336129f2017-10-17 15:55:40 -04004548void Context::flushMappedBufferRange(BufferBinding /*target*/,
4549 GLintptr /*offset*/,
4550 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004551{
4552 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4553}
4554
Jamie Madillbc918e72018-03-08 09:47:21 -05004555Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004556{
Geoff Langa8cb2872018-03-09 16:09:40 -05004557 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004558}
4559
Jamie Madillbc918e72018-03-08 09:47:21 -05004560Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004561{
Geoff Langa8cb2872018-03-09 16:09:40 -05004562 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004563}
4564
Jamie Madillbc918e72018-03-08 09:47:21 -05004565Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004566{
Geoff Langa8cb2872018-03-09 16:09:40 -05004567 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004568}
4569
Geoff Lang9bf86f02018-07-26 11:46:34 -04004570Error Context::syncStateForPathOperation()
4571{
4572 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4573
4574 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4575 ANGLE_TRY(syncDirtyBits());
4576
4577 return NoError();
4578}
4579
Jiajia Qin5451d532017-11-16 17:16:34 +08004580void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4581{
4582 UNIMPLEMENTED();
4583}
4584
Jamie Madillc20ab272016-06-09 07:20:46 -07004585void Context::activeTexture(GLenum texture)
4586{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004587 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004588}
4589
Jamie Madill876429b2017-04-20 15:46:24 -04004590void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004591{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004592 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004593}
4594
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004595void Context::blendEquation(GLenum mode)
4596{
4597 mGLState.setBlendEquation(mode, mode);
4598}
4599
Jamie Madillc20ab272016-06-09 07:20:46 -07004600void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4601{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004602 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004603}
4604
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004605void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4606{
4607 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4608}
4609
Jamie Madillc20ab272016-06-09 07:20:46 -07004610void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4611{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004612 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004613}
4614
Jamie Madill876429b2017-04-20 15:46:24 -04004615void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004616{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004617 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004618}
4619
Jamie Madill876429b2017-04-20 15:46:24 -04004620void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004621{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004622 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004623}
4624
4625void Context::clearStencil(GLint s)
4626{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004627 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004628}
4629
4630void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4631{
Geoff Lang92019432017-11-20 13:09:34 -05004632 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4633 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004634}
4635
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004636void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004637{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004638 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004639}
4640
4641void Context::depthFunc(GLenum func)
4642{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004643 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004644}
4645
4646void Context::depthMask(GLboolean flag)
4647{
Geoff Lang92019432017-11-20 13:09:34 -05004648 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004649}
4650
Jamie Madill876429b2017-04-20 15:46:24 -04004651void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004652{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004653 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004654}
4655
4656void Context::disable(GLenum cap)
4657{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004658 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004659 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004660}
4661
4662void Context::disableVertexAttribArray(GLuint index)
4663{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004664 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004665 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004666}
4667
4668void Context::enable(GLenum cap)
4669{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004670 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004671 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004672}
4673
4674void Context::enableVertexAttribArray(GLuint index)
4675{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004676 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004677 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004678}
4679
4680void Context::frontFace(GLenum mode)
4681{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004682 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004683}
4684
4685void Context::hint(GLenum target, GLenum mode)
4686{
4687 switch (target)
4688 {
4689 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004690 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004691 break;
4692
4693 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004694 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004695 break;
4696
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004697 case GL_PERSPECTIVE_CORRECTION_HINT:
4698 case GL_POINT_SMOOTH_HINT:
4699 case GL_LINE_SMOOTH_HINT:
4700 case GL_FOG_HINT:
4701 mGLState.gles1().setHint(target, mode);
4702 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004703 default:
4704 UNREACHABLE();
4705 return;
4706 }
4707}
4708
4709void Context::lineWidth(GLfloat width)
4710{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004711 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004712}
4713
4714void Context::pixelStorei(GLenum pname, GLint param)
4715{
4716 switch (pname)
4717 {
4718 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004719 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004720 break;
4721
4722 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004723 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004724 break;
4725
4726 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004727 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004728 break;
4729
4730 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004731 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004732 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004733 break;
4734
4735 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004736 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004737 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004738 break;
4739
4740 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004741 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004742 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004743 break;
4744
4745 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004746 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004747 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004748 break;
4749
4750 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004751 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004752 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004753 break;
4754
4755 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004756 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004757 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004758 break;
4759
4760 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004761 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004762 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004763 break;
4764
4765 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004766 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004767 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004768 break;
4769
4770 default:
4771 UNREACHABLE();
4772 return;
4773 }
4774}
4775
4776void Context::polygonOffset(GLfloat factor, GLfloat units)
4777{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004778 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004779}
4780
Jamie Madill876429b2017-04-20 15:46:24 -04004781void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004782{
Geoff Lang92019432017-11-20 13:09:34 -05004783 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004784}
4785
Jiawei Shaodb342272017-09-27 10:21:45 +08004786void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4787{
4788 mGLState.setSampleMaskParams(maskNumber, mask);
4789}
4790
Jamie Madillc20ab272016-06-09 07:20:46 -07004791void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4792{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004793 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004794}
4795
4796void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4797{
4798 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4799 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004800 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004801 }
4802
4803 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4804 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004805 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004806 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004807
4808 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004809}
4810
4811void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4812{
4813 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4814 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004815 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004816 }
4817
4818 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4819 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004820 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004821 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004822
4823 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004824}
4825
4826void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4827{
4828 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4829 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004830 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004831 }
4832
4833 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4834 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004835 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004836 }
4837}
4838
4839void Context::vertexAttrib1f(GLuint index, GLfloat x)
4840{
4841 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004842 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004843 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004844}
4845
4846void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4847{
4848 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004849 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004850 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004851}
4852
4853void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4854{
4855 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004856 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004857 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004858}
4859
4860void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4861{
4862 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004863 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004864 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004865}
4866
4867void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4868{
4869 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004870 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004871 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004872}
4873
4874void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4875{
4876 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004877 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004878 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004879}
4880
4881void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4882{
4883 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004884 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004885 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004886}
4887
4888void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4889{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004890 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004891 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004892}
4893
4894void Context::vertexAttribPointer(GLuint index,
4895 GLint size,
4896 GLenum type,
4897 GLboolean normalized,
4898 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004899 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004900{
Corentin Wallez336129f2017-10-17 15:55:40 -04004901 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004902 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004903 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004904}
4905
Shao80957d92017-02-20 21:25:59 +08004906void Context::vertexAttribFormat(GLuint attribIndex,
4907 GLint size,
4908 GLenum type,
4909 GLboolean normalized,
4910 GLuint relativeOffset)
4911{
Geoff Lang92019432017-11-20 13:09:34 -05004912 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004913 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004914 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004915}
4916
4917void Context::vertexAttribIFormat(GLuint attribIndex,
4918 GLint size,
4919 GLenum type,
4920 GLuint relativeOffset)
4921{
4922 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004923 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004924}
4925
4926void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4927{
Shaodde78e82017-05-22 14:13:27 +08004928 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004929 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004930}
4931
Jiajia Qin5451d532017-11-16 17:16:34 +08004932void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004933{
4934 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004935 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004936}
4937
Jamie Madillc20ab272016-06-09 07:20:46 -07004938void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4939{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004940 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004941}
4942
4943void Context::vertexAttribIPointer(GLuint index,
4944 GLint size,
4945 GLenum type,
4946 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004947 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004948{
Corentin Wallez336129f2017-10-17 15:55:40 -04004949 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4950 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004951 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004952}
4953
4954void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4955{
4956 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004957 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004958 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004959}
4960
4961void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4962{
4963 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004964 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004965 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004966}
4967
4968void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4969{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004970 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004971 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004972}
4973
4974void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4975{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004976 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004977 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004978}
4979
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004980void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4981{
4982 const VertexAttribCurrentValueData &currentValues =
4983 getGLState().getVertexAttribCurrentValue(index);
4984 const VertexArray *vao = getGLState().getVertexArray();
4985 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4986 currentValues, pname, params);
4987}
4988
Brandon Jones59770802018-04-02 13:18:42 -07004989void Context::getVertexAttribivRobust(GLuint index,
4990 GLenum pname,
4991 GLsizei bufSize,
4992 GLsizei *length,
4993 GLint *params)
4994{
4995 getVertexAttribiv(index, pname, params);
4996}
4997
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004998void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4999{
5000 const VertexAttribCurrentValueData &currentValues =
5001 getGLState().getVertexAttribCurrentValue(index);
5002 const VertexArray *vao = getGLState().getVertexArray();
5003 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5004 currentValues, pname, params);
5005}
5006
Brandon Jones59770802018-04-02 13:18:42 -07005007void Context::getVertexAttribfvRobust(GLuint index,
5008 GLenum pname,
5009 GLsizei bufSize,
5010 GLsizei *length,
5011 GLfloat *params)
5012{
5013 getVertexAttribfv(index, pname, params);
5014}
5015
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005016void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
5017{
5018 const VertexAttribCurrentValueData &currentValues =
5019 getGLState().getVertexAttribCurrentValue(index);
5020 const VertexArray *vao = getGLState().getVertexArray();
5021 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5022 currentValues, pname, params);
5023}
5024
Brandon Jones59770802018-04-02 13:18:42 -07005025void Context::getVertexAttribIivRobust(GLuint index,
5026 GLenum pname,
5027 GLsizei bufSize,
5028 GLsizei *length,
5029 GLint *params)
5030{
5031 getVertexAttribIiv(index, pname, params);
5032}
5033
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005034void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
5035{
5036 const VertexAttribCurrentValueData &currentValues =
5037 getGLState().getVertexAttribCurrentValue(index);
5038 const VertexArray *vao = getGLState().getVertexArray();
5039 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5040 currentValues, pname, params);
5041}
5042
Brandon Jones59770802018-04-02 13:18:42 -07005043void Context::getVertexAttribIuivRobust(GLuint index,
5044 GLenum pname,
5045 GLsizei bufSize,
5046 GLsizei *length,
5047 GLuint *params)
5048{
5049 getVertexAttribIuiv(index, pname, params);
5050}
5051
Jamie Madill876429b2017-04-20 15:46:24 -04005052void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005053{
5054 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
5055 QueryVertexAttribPointerv(attrib, pname, pointer);
5056}
5057
Brandon Jones59770802018-04-02 13:18:42 -07005058void Context::getVertexAttribPointervRobust(GLuint index,
5059 GLenum pname,
5060 GLsizei bufSize,
5061 GLsizei *length,
5062 void **pointer)
5063{
5064 getVertexAttribPointerv(index, pname, pointer);
5065}
5066
Jamie Madillc20ab272016-06-09 07:20:46 -07005067void Context::debugMessageControl(GLenum source,
5068 GLenum type,
5069 GLenum severity,
5070 GLsizei count,
5071 const GLuint *ids,
5072 GLboolean enabled)
5073{
5074 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005075 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005076 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005077}
5078
5079void Context::debugMessageInsert(GLenum source,
5080 GLenum type,
5081 GLuint id,
5082 GLenum severity,
5083 GLsizei length,
5084 const GLchar *buf)
5085{
5086 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005087 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005088}
5089
5090void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5091{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005092 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005093}
5094
5095GLuint Context::getDebugMessageLog(GLuint count,
5096 GLsizei bufSize,
5097 GLenum *sources,
5098 GLenum *types,
5099 GLuint *ids,
5100 GLenum *severities,
5101 GLsizei *lengths,
5102 GLchar *messageLog)
5103{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005104 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5105 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005106}
5107
5108void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5109{
5110 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005111 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005112 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005113}
5114
5115void Context::popDebugGroup()
5116{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005117 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005118 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005119}
5120
Corentin Wallez336129f2017-10-17 15:55:40 -04005121void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005122{
5123 Buffer *buffer = mGLState.getTargetBuffer(target);
5124 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005125 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005126}
5127
Corentin Wallez336129f2017-10-17 15:55:40 -04005128void Context::bufferSubData(BufferBinding target,
5129 GLintptr offset,
5130 GLsizeiptr size,
5131 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005132{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005133 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005134 {
5135 return;
5136 }
5137
5138 Buffer *buffer = mGLState.getTargetBuffer(target);
5139 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005140 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005141}
5142
Jamie Madillef300b12016-10-07 15:12:09 -04005143void Context::attachShader(GLuint program, GLuint shader)
5144{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005145 Program *programObject = mState.mShaderPrograms->getProgram(program);
5146 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005147 ASSERT(programObject && shaderObject);
5148 programObject->attachShader(shaderObject);
5149}
5150
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005151const Workarounds &Context::getWorkarounds() const
5152{
5153 return mWorkarounds;
5154}
5155
Corentin Wallez336129f2017-10-17 15:55:40 -04005156void Context::copyBufferSubData(BufferBinding readTarget,
5157 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005158 GLintptr readOffset,
5159 GLintptr writeOffset,
5160 GLsizeiptr size)
5161{
5162 // if size is zero, the copy is a successful no-op
5163 if (size == 0)
5164 {
5165 return;
5166 }
5167
5168 // TODO(jmadill): cache these.
5169 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5170 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5171
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005172 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005173}
5174
Jamie Madill01a80ee2016-11-07 12:06:18 -05005175void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5176{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005177 // Ideally we could share the program query with the validation layer if possible.
5178 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005179 ASSERT(programObject);
5180 programObject->bindAttributeLocation(index, name);
5181}
5182
Corentin Wallez336129f2017-10-17 15:55:40 -04005183void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005184{
Corentin Wallez336129f2017-10-17 15:55:40 -04005185 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5186 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005187 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005188}
5189
Corentin Wallez336129f2017-10-17 15:55:40 -04005190void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005191{
5192 bindBufferRange(target, index, buffer, 0, 0);
5193}
5194
Corentin Wallez336129f2017-10-17 15:55:40 -04005195void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005196 GLuint index,
5197 GLuint buffer,
5198 GLintptr offset,
5199 GLsizeiptr size)
5200{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005201 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5202 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5203 if (target == BufferBinding::Uniform)
5204 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005205 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005206 mStateCache.onUniformBufferStateChange(this);
5207 }
5208 else
5209 {
5210 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005211 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005212}
5213
Jamie Madill01a80ee2016-11-07 12:06:18 -05005214void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5215{
5216 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5217 {
5218 bindReadFramebuffer(framebuffer);
5219 }
5220
5221 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5222 {
5223 bindDrawFramebuffer(framebuffer);
5224 }
5225}
5226
5227void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5228{
5229 ASSERT(target == GL_RENDERBUFFER);
5230 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005231 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005232 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005233}
5234
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005235void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005236 GLsizei samples,
5237 GLenum internalformat,
5238 GLsizei width,
5239 GLsizei height,
5240 GLboolean fixedsamplelocations)
5241{
5242 Extents size(width, height, 1);
5243 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005244 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5245 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005246}
5247
Olli Etuaho89664842018-08-24 14:45:36 +03005248void Context::texStorage3DMultisample(TextureType target,
5249 GLsizei samples,
5250 GLenum internalformat,
5251 GLsizei width,
5252 GLsizei height,
5253 GLsizei depth,
5254 GLboolean fixedsamplelocations)
5255{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005256 Extents size(width, height, depth);
5257 Texture *texture = getTargetTexture(target);
5258 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5259 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005260}
5261
JiangYizhoubddc46b2016-12-09 09:50:51 +08005262void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5263{
JiangYizhou5b03f472017-01-09 10:22:53 +08005264 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5265 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005266 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005267 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005268
5269 switch (pname)
5270 {
5271 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005272 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005273 break;
5274 default:
5275 UNREACHABLE();
5276 }
5277}
5278
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005279void Context::getMultisamplefvRobust(GLenum pname,
5280 GLuint index,
5281 GLsizei bufSize,
5282 GLsizei *length,
5283 GLfloat *val)
5284{
5285 UNIMPLEMENTED();
5286}
5287
Jamie Madille8fb6402017-02-14 17:56:40 -05005288void Context::renderbufferStorage(GLenum target,
5289 GLenum internalformat,
5290 GLsizei width,
5291 GLsizei height)
5292{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005293 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5294 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5295
Jamie Madille8fb6402017-02-14 17:56:40 -05005296 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005297 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005298}
5299
5300void Context::renderbufferStorageMultisample(GLenum target,
5301 GLsizei samples,
5302 GLenum internalformat,
5303 GLsizei width,
5304 GLsizei height)
5305{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005306 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5307 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005308
5309 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005310 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005311 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005312}
5313
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005314void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5315{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005316 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005317 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005318}
5319
JiangYizhoue18e6392017-02-20 10:32:23 +08005320void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5321{
5322 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5323 QueryFramebufferParameteriv(framebuffer, pname, params);
5324}
5325
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005326void Context::getFramebufferParameterivRobust(GLenum target,
5327 GLenum pname,
5328 GLsizei bufSize,
5329 GLsizei *length,
5330 GLint *params)
5331{
5332 UNIMPLEMENTED();
5333}
5334
Jiajia Qin5451d532017-11-16 17:16:34 +08005335void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005336{
5337 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005338 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005339}
5340
Jamie Madilldec86232018-07-11 09:01:18 -04005341bool Context::getScratchBuffer(size_t requstedSizeBytes,
5342 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005343{
Jamie Madilldec86232018-07-11 09:01:18 -04005344 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005345}
5346
Jamie Madilldec86232018-07-11 09:01:18 -04005347bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5348 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005349{
Jamie Madilldec86232018-07-11 09:01:18 -04005350 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005351}
5352
Xinghua Cao10a4d432017-11-28 14:46:26 +08005353Error Context::prepareForDispatch()
5354{
Jamie Madill0cc11c62018-10-12 18:07:18 -04005355 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005356
5357 if (isRobustResourceInitEnabled())
5358 {
5359 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5360 }
5361
Jamie Madill0cc11c62018-10-12 18:07:18 -04005362 return syncDirtyBits(mComputeDirtyBits);
Xinghua Cao10a4d432017-11-28 14:46:26 +08005363}
5364
Xinghua Cao2b396592017-03-29 15:36:04 +08005365void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5366{
5367 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5368 {
5369 return;
5370 }
5371
Xinghua Cao10a4d432017-11-28 14:46:26 +08005372 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005373 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005374}
5375
Jiajia Qin5451d532017-11-16 17:16:34 +08005376void Context::dispatchComputeIndirect(GLintptr indirect)
5377{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005378 ANGLE_CONTEXT_TRY(prepareForDispatch());
5379 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005380}
5381
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005382void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005383 GLsizei levels,
5384 GLenum internalFormat,
5385 GLsizei width,
5386 GLsizei height)
5387{
5388 Extents size(width, height, 1);
5389 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005390 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005391}
5392
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005393void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005394 GLsizei levels,
5395 GLenum internalFormat,
5396 GLsizei width,
5397 GLsizei height,
5398 GLsizei depth)
5399{
5400 Extents size(width, height, depth);
5401 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005402 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005403}
5404
Jiajia Qin5451d532017-11-16 17:16:34 +08005405void Context::memoryBarrier(GLbitfield barriers)
5406{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005407 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005408}
5409
5410void Context::memoryBarrierByRegion(GLbitfield barriers)
5411{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005412 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005413}
5414
Austin Eng1bf18ce2018-10-19 15:34:02 -07005415void Context::multiDrawArrays(PrimitiveMode mode,
5416 const GLint *firsts,
5417 const GLsizei *counts,
5418 GLsizei drawcount)
5419{
5420 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5421 Program *programObject = mGLState.getLinkedProgram(this);
5422 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5423 if (hasDrawID)
5424 {
5425 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5426 {
5427 if (noopDraw(mode, counts[drawID]))
5428 {
5429 continue;
5430 }
5431 programObject->setDrawIDUniform(drawID);
5432 ANGLE_CONTEXT_TRY(
5433 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5434 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5435 counts[drawID], 1);
5436 }
5437 }
5438 else
5439 {
5440 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5441 {
5442 if (noopDraw(mode, counts[drawID]))
5443 {
5444 continue;
5445 }
5446 ANGLE_CONTEXT_TRY(
5447 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5448 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5449 counts[drawID], 1);
5450 }
5451 }
5452}
5453
5454void Context::multiDrawArraysInstanced(PrimitiveMode mode,
5455 const GLint *firsts,
5456 const GLsizei *counts,
5457 const GLsizei *instanceCounts,
5458 GLsizei drawcount)
5459{
5460 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5461 Program *programObject = mGLState.getLinkedProgram(this);
5462 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5463 if (hasDrawID)
5464 {
5465 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5466 {
5467 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5468 {
5469 continue;
5470 }
5471 programObject->setDrawIDUniform(drawID);
5472 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5473 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5474 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5475 counts[drawID], instanceCounts[drawID]);
5476 }
5477 }
5478 else
5479 {
5480 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5481 {
5482 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5483 {
5484 continue;
5485 }
5486 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5487 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5488 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5489 counts[drawID], instanceCounts[drawID]);
5490 }
5491 }
5492}
5493
5494void Context::multiDrawElements(PrimitiveMode mode,
5495 const GLsizei *counts,
5496 GLenum type,
5497 const GLsizei *offsets,
5498 GLsizei drawcount)
5499{
5500 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5501 Program *programObject = mGLState.getLinkedProgram(this);
5502 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5503 if (hasDrawID)
5504 {
5505 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5506 {
5507 if (noopDraw(mode, counts[drawID]))
5508 {
5509 continue;
5510 }
5511 programObject->setDrawIDUniform(drawID);
5512 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5513 ANGLE_CONTEXT_TRY(
5514 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5515 }
5516 }
5517 else
5518 {
5519 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5520 {
5521 if (noopDraw(mode, counts[drawID]))
5522 {
5523 continue;
5524 }
5525 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5526 ANGLE_CONTEXT_TRY(
5527 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5528 }
5529 }
5530}
5531
5532void Context::multiDrawElementsInstanced(PrimitiveMode mode,
5533 const GLsizei *counts,
5534 GLenum type,
5535 const GLsizei *offsets,
5536 const GLsizei *instanceCounts,
5537 GLsizei drawcount)
5538{
5539 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5540 Program *programObject = mGLState.getLinkedProgram(this);
5541 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5542 if (hasDrawID)
5543 {
5544 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5545 {
5546 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5547 {
5548 continue;
5549 }
5550 programObject->setDrawIDUniform(drawID);
5551 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5552 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5553 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5554 }
5555 }
5556 else
5557 {
5558 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5559 {
5560 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5561 {
5562 continue;
5563 }
5564 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5565 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5566 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5567 }
5568 }
5569}
5570
Jamie Madillc1d770e2017-04-13 17:31:24 -04005571GLenum Context::checkFramebufferStatus(GLenum target)
5572{
5573 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5574 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005575 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005576}
5577
5578void Context::compileShader(GLuint shader)
5579{
5580 Shader *shaderObject = GetValidShader(this, shader);
5581 if (!shaderObject)
5582 {
5583 return;
5584 }
5585 shaderObject->compile(this);
5586}
5587
5588void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5589{
5590 for (int i = 0; i < n; i++)
5591 {
5592 deleteBuffer(buffers[i]);
5593 }
5594}
5595
5596void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5597{
5598 for (int i = 0; i < n; i++)
5599 {
5600 if (framebuffers[i] != 0)
5601 {
5602 deleteFramebuffer(framebuffers[i]);
5603 }
5604 }
5605}
5606
5607void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5608{
5609 for (int i = 0; i < n; i++)
5610 {
5611 deleteRenderbuffer(renderbuffers[i]);
5612 }
5613}
5614
5615void Context::deleteTextures(GLsizei n, const GLuint *textures)
5616{
5617 for (int i = 0; i < n; i++)
5618 {
5619 if (textures[i] != 0)
5620 {
5621 deleteTexture(textures[i]);
5622 }
5623 }
5624}
5625
5626void Context::detachShader(GLuint program, GLuint shader)
5627{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005628 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005629 ASSERT(programObject);
5630
5631 Shader *shaderObject = getShader(shader);
5632 ASSERT(shaderObject);
5633
5634 programObject->detachShader(this, shaderObject);
5635}
5636
5637void Context::genBuffers(GLsizei n, GLuint *buffers)
5638{
5639 for (int i = 0; i < n; i++)
5640 {
5641 buffers[i] = createBuffer();
5642 }
5643}
5644
5645void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5646{
5647 for (int i = 0; i < n; i++)
5648 {
5649 framebuffers[i] = createFramebuffer();
5650 }
5651}
5652
5653void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5654{
5655 for (int i = 0; i < n; i++)
5656 {
5657 renderbuffers[i] = createRenderbuffer();
5658 }
5659}
5660
5661void Context::genTextures(GLsizei n, GLuint *textures)
5662{
5663 for (int i = 0; i < n; i++)
5664 {
5665 textures[i] = createTexture();
5666 }
5667}
5668
5669void Context::getActiveAttrib(GLuint program,
5670 GLuint index,
5671 GLsizei bufsize,
5672 GLsizei *length,
5673 GLint *size,
5674 GLenum *type,
5675 GLchar *name)
5676{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005677 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005678 ASSERT(programObject);
5679 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5680}
5681
5682void Context::getActiveUniform(GLuint program,
5683 GLuint index,
5684 GLsizei bufsize,
5685 GLsizei *length,
5686 GLint *size,
5687 GLenum *type,
5688 GLchar *name)
5689{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005690 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005691 ASSERT(programObject);
5692 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5693}
5694
5695void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5696{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005697 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005698 ASSERT(programObject);
5699 programObject->getAttachedShaders(maxcount, count, shaders);
5700}
5701
5702GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5703{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005704 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005705 ASSERT(programObject);
5706 return programObject->getAttributeLocation(name);
5707}
5708
5709void Context::getBooleanv(GLenum pname, GLboolean *params)
5710{
5711 GLenum nativeType;
5712 unsigned int numParams = 0;
5713 getQueryParameterInfo(pname, &nativeType, &numParams);
5714
5715 if (nativeType == GL_BOOL)
5716 {
5717 getBooleanvImpl(pname, params);
5718 }
5719 else
5720 {
5721 CastStateValues(this, nativeType, pname, numParams, params);
5722 }
5723}
5724
Brandon Jones59770802018-04-02 13:18:42 -07005725void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5726{
5727 getBooleanv(pname, params);
5728}
5729
Jamie Madillc1d770e2017-04-13 17:31:24 -04005730void Context::getFloatv(GLenum pname, GLfloat *params)
5731{
5732 GLenum nativeType;
5733 unsigned int numParams = 0;
5734 getQueryParameterInfo(pname, &nativeType, &numParams);
5735
5736 if (nativeType == GL_FLOAT)
5737 {
5738 getFloatvImpl(pname, params);
5739 }
5740 else
5741 {
5742 CastStateValues(this, nativeType, pname, numParams, params);
5743 }
5744}
5745
Brandon Jones59770802018-04-02 13:18:42 -07005746void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5747{
5748 getFloatv(pname, params);
5749}
5750
Jamie Madillc1d770e2017-04-13 17:31:24 -04005751void Context::getIntegerv(GLenum pname, GLint *params)
5752{
5753 GLenum nativeType;
5754 unsigned int numParams = 0;
5755 getQueryParameterInfo(pname, &nativeType, &numParams);
5756
5757 if (nativeType == GL_INT)
5758 {
5759 getIntegervImpl(pname, params);
5760 }
5761 else
5762 {
5763 CastStateValues(this, nativeType, pname, numParams, params);
5764 }
5765}
5766
Brandon Jones59770802018-04-02 13:18:42 -07005767void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5768{
5769 getIntegerv(pname, data);
5770}
5771
Jamie Madillc1d770e2017-04-13 17:31:24 -04005772void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5773{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005774 // Don't resolve link if checking the link completion status.
5775 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5776 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005777 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005778 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005779}
5780
Brandon Jones59770802018-04-02 13:18:42 -07005781void Context::getProgramivRobust(GLuint program,
5782 GLenum pname,
5783 GLsizei bufSize,
5784 GLsizei *length,
5785 GLint *params)
5786{
5787 getProgramiv(program, pname, params);
5788}
5789
Jiajia Qin5451d532017-11-16 17:16:34 +08005790void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5791{
5792 UNIMPLEMENTED();
5793}
5794
Jamie Madillbe849e42017-05-02 15:49:00 -04005795void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005796{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005797 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005798 ASSERT(programObject);
5799 programObject->getInfoLog(bufsize, length, infolog);
5800}
5801
Jiajia Qin5451d532017-11-16 17:16:34 +08005802void Context::getProgramPipelineInfoLog(GLuint pipeline,
5803 GLsizei bufSize,
5804 GLsizei *length,
5805 GLchar *infoLog)
5806{
5807 UNIMPLEMENTED();
5808}
5809
Jamie Madillc1d770e2017-04-13 17:31:24 -04005810void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5811{
5812 Shader *shaderObject = getShader(shader);
5813 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005814 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005815}
5816
Brandon Jones59770802018-04-02 13:18:42 -07005817void Context::getShaderivRobust(GLuint shader,
5818 GLenum pname,
5819 GLsizei bufSize,
5820 GLsizei *length,
5821 GLint *params)
5822{
5823 getShaderiv(shader, pname, params);
5824}
5825
Jamie Madillc1d770e2017-04-13 17:31:24 -04005826void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5827{
5828 Shader *shaderObject = getShader(shader);
5829 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005830 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005831}
5832
5833void Context::getShaderPrecisionFormat(GLenum shadertype,
5834 GLenum precisiontype,
5835 GLint *range,
5836 GLint *precision)
5837{
5838 // TODO(jmadill): Compute shaders.
5839
5840 switch (shadertype)
5841 {
5842 case GL_VERTEX_SHADER:
5843 switch (precisiontype)
5844 {
5845 case GL_LOW_FLOAT:
5846 mCaps.vertexLowpFloat.get(range, precision);
5847 break;
5848 case GL_MEDIUM_FLOAT:
5849 mCaps.vertexMediumpFloat.get(range, precision);
5850 break;
5851 case GL_HIGH_FLOAT:
5852 mCaps.vertexHighpFloat.get(range, precision);
5853 break;
5854
5855 case GL_LOW_INT:
5856 mCaps.vertexLowpInt.get(range, precision);
5857 break;
5858 case GL_MEDIUM_INT:
5859 mCaps.vertexMediumpInt.get(range, precision);
5860 break;
5861 case GL_HIGH_INT:
5862 mCaps.vertexHighpInt.get(range, precision);
5863 break;
5864
5865 default:
5866 UNREACHABLE();
5867 return;
5868 }
5869 break;
5870
5871 case GL_FRAGMENT_SHADER:
5872 switch (precisiontype)
5873 {
5874 case GL_LOW_FLOAT:
5875 mCaps.fragmentLowpFloat.get(range, precision);
5876 break;
5877 case GL_MEDIUM_FLOAT:
5878 mCaps.fragmentMediumpFloat.get(range, precision);
5879 break;
5880 case GL_HIGH_FLOAT:
5881 mCaps.fragmentHighpFloat.get(range, precision);
5882 break;
5883
5884 case GL_LOW_INT:
5885 mCaps.fragmentLowpInt.get(range, precision);
5886 break;
5887 case GL_MEDIUM_INT:
5888 mCaps.fragmentMediumpInt.get(range, precision);
5889 break;
5890 case GL_HIGH_INT:
5891 mCaps.fragmentHighpInt.get(range, precision);
5892 break;
5893
5894 default:
5895 UNREACHABLE();
5896 return;
5897 }
5898 break;
5899
5900 default:
5901 UNREACHABLE();
5902 return;
5903 }
5904}
5905
5906void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5907{
5908 Shader *shaderObject = getShader(shader);
5909 ASSERT(shaderObject);
5910 shaderObject->getSource(bufsize, length, source);
5911}
5912
5913void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5914{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005915 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005916 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005917 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005918}
5919
Brandon Jones59770802018-04-02 13:18:42 -07005920void Context::getUniformfvRobust(GLuint program,
5921 GLint location,
5922 GLsizei bufSize,
5923 GLsizei *length,
5924 GLfloat *params)
5925{
5926 getUniformfv(program, location, params);
5927}
5928
Jamie Madillc1d770e2017-04-13 17:31:24 -04005929void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5930{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005931 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005932 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005933 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005934}
5935
Brandon Jones59770802018-04-02 13:18:42 -07005936void Context::getUniformivRobust(GLuint program,
5937 GLint location,
5938 GLsizei bufSize,
5939 GLsizei *length,
5940 GLint *params)
5941{
5942 getUniformiv(program, location, params);
5943}
5944
Jamie Madillc1d770e2017-04-13 17:31:24 -04005945GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5946{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005947 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005948 ASSERT(programObject);
5949 return programObject->getUniformLocation(name);
5950}
5951
5952GLboolean Context::isBuffer(GLuint buffer)
5953{
5954 if (buffer == 0)
5955 {
5956 return GL_FALSE;
5957 }
5958
5959 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5960}
5961
5962GLboolean Context::isEnabled(GLenum cap)
5963{
5964 return mGLState.getEnableFeature(cap);
5965}
5966
5967GLboolean Context::isFramebuffer(GLuint framebuffer)
5968{
5969 if (framebuffer == 0)
5970 {
5971 return GL_FALSE;
5972 }
5973
5974 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5975}
5976
5977GLboolean Context::isProgram(GLuint program)
5978{
5979 if (program == 0)
5980 {
5981 return GL_FALSE;
5982 }
5983
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005984 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005985}
5986
5987GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5988{
5989 if (renderbuffer == 0)
5990 {
5991 return GL_FALSE;
5992 }
5993
5994 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5995}
5996
5997GLboolean Context::isShader(GLuint shader)
5998{
5999 if (shader == 0)
6000 {
6001 return GL_FALSE;
6002 }
6003
6004 return (getShader(shader) ? GL_TRUE : GL_FALSE);
6005}
6006
6007GLboolean Context::isTexture(GLuint texture)
6008{
6009 if (texture == 0)
6010 {
6011 return GL_FALSE;
6012 }
6013
6014 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
6015}
6016
6017void Context::linkProgram(GLuint program)
6018{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006019 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006020 ASSERT(programObject);
6021 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08006022
6023 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
6024 // don't need to worry that:
6025 // 1. Draw calls after link use the new executable code or the old one depending on the link
6026 // result.
6027 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
6028 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
6029 // ProgramD3D.
6030 if (programObject->isInUse())
6031 {
Jamie Madill785e8a02018-10-04 17:42:00 -04006032 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04006033 if (programObject->isLinked())
6034 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006035 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006036 }
jchen107ae70d82018-07-06 13:47:01 +08006037 mStateCache.onProgramExecutableChange(this);
6038 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006039}
6040
6041void Context::releaseShaderCompiler()
6042{
Jamie Madill4928b7c2017-06-20 12:57:39 -04006043 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006044}
6045
6046void Context::shaderBinary(GLsizei n,
6047 const GLuint *shaders,
6048 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04006049 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04006050 GLsizei length)
6051{
6052 // No binary shader formats are supported.
6053 UNIMPLEMENTED();
6054}
6055
Olli Etuaho0ca09752018-09-24 11:00:50 +03006056void Context::bindFragDataLocationIndexed(GLuint program,
6057 GLuint colorNumber,
6058 GLuint index,
6059 const char *name)
6060{
6061 Program *programObject = getProgramNoResolveLink(program);
6062 programObject->bindFragmentOutputLocation(colorNumber, name);
6063 programObject->bindFragmentOutputIndex(index, name);
6064}
6065
6066void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
6067{
6068 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
6069}
6070
6071int Context::getFragDataIndex(GLuint program, const char *name)
6072{
6073 Program *programObject = getProgramResolveLink(program);
6074 return programObject->getFragDataIndex(name);
6075}
6076
6077int Context::getProgramResourceLocationIndex(GLuint program,
6078 GLenum programInterface,
6079 const char *name)
6080{
6081 Program *programObject = getProgramResolveLink(program);
6082 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
6083 return programObject->getFragDataIndex(name);
6084}
6085
Jamie Madillc1d770e2017-04-13 17:31:24 -04006086void Context::shaderSource(GLuint shader,
6087 GLsizei count,
6088 const GLchar *const *string,
6089 const GLint *length)
6090{
6091 Shader *shaderObject = getShader(shader);
6092 ASSERT(shaderObject);
6093 shaderObject->setSource(count, string, length);
6094}
6095
6096void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
6097{
6098 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
6099}
6100
6101void Context::stencilMask(GLuint mask)
6102{
6103 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
6104}
6105
6106void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
6107{
6108 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
6109}
6110
6111void Context::uniform1f(GLint location, GLfloat x)
6112{
6113 Program *program = mGLState.getProgram();
6114 program->setUniform1fv(location, 1, &x);
6115}
6116
6117void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
6118{
6119 Program *program = mGLState.getProgram();
6120 program->setUniform1fv(location, count, v);
6121}
6122
Jamie Madill7e4eff12018-08-08 15:49:26 -04006123void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006124{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006125 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04006126 {
6127 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006128 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04006129 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006130}
6131
Jamie Madill7e4eff12018-08-08 15:49:26 -04006132void Context::uniform1i(GLint location, GLint x)
6133{
6134 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
6135}
6136
Jamie Madillc1d770e2017-04-13 17:31:24 -04006137void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
6138{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006139 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006140}
6141
6142void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
6143{
6144 GLfloat xy[2] = {x, y};
6145 Program *program = mGLState.getProgram();
6146 program->setUniform2fv(location, 1, xy);
6147}
6148
6149void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
6150{
6151 Program *program = mGLState.getProgram();
6152 program->setUniform2fv(location, count, v);
6153}
6154
6155void Context::uniform2i(GLint location, GLint x, GLint y)
6156{
6157 GLint xy[2] = {x, y};
6158 Program *program = mGLState.getProgram();
6159 program->setUniform2iv(location, 1, xy);
6160}
6161
6162void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6163{
6164 Program *program = mGLState.getProgram();
6165 program->setUniform2iv(location, count, v);
6166}
6167
6168void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6169{
6170 GLfloat xyz[3] = {x, y, z};
6171 Program *program = mGLState.getProgram();
6172 program->setUniform3fv(location, 1, xyz);
6173}
6174
6175void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6176{
6177 Program *program = mGLState.getProgram();
6178 program->setUniform3fv(location, count, v);
6179}
6180
6181void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6182{
6183 GLint xyz[3] = {x, y, z};
6184 Program *program = mGLState.getProgram();
6185 program->setUniform3iv(location, 1, xyz);
6186}
6187
6188void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6189{
6190 Program *program = mGLState.getProgram();
6191 program->setUniform3iv(location, count, v);
6192}
6193
6194void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6195{
6196 GLfloat xyzw[4] = {x, y, z, w};
6197 Program *program = mGLState.getProgram();
6198 program->setUniform4fv(location, 1, xyzw);
6199}
6200
6201void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6202{
6203 Program *program = mGLState.getProgram();
6204 program->setUniform4fv(location, count, v);
6205}
6206
6207void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6208{
6209 GLint xyzw[4] = {x, y, z, w};
6210 Program *program = mGLState.getProgram();
6211 program->setUniform4iv(location, 1, xyzw);
6212}
6213
6214void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6215{
6216 Program *program = mGLState.getProgram();
6217 program->setUniform4iv(location, count, v);
6218}
6219
6220void Context::uniformMatrix2fv(GLint location,
6221 GLsizei count,
6222 GLboolean transpose,
6223 const GLfloat *value)
6224{
6225 Program *program = mGLState.getProgram();
6226 program->setUniformMatrix2fv(location, count, transpose, value);
6227}
6228
6229void Context::uniformMatrix3fv(GLint location,
6230 GLsizei count,
6231 GLboolean transpose,
6232 const GLfloat *value)
6233{
6234 Program *program = mGLState.getProgram();
6235 program->setUniformMatrix3fv(location, count, transpose, value);
6236}
6237
6238void Context::uniformMatrix4fv(GLint location,
6239 GLsizei count,
6240 GLboolean transpose,
6241 const GLfloat *value)
6242{
6243 Program *program = mGLState.getProgram();
6244 program->setUniformMatrix4fv(location, count, transpose, value);
6245}
6246
6247void Context::validateProgram(GLuint program)
6248{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006249 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006250 ASSERT(programObject);
6251 programObject->validate(mCaps);
6252}
6253
Jiajia Qin5451d532017-11-16 17:16:34 +08006254void Context::validateProgramPipeline(GLuint pipeline)
6255{
6256 UNIMPLEMENTED();
6257}
6258
Jamie Madilld04908b2017-06-09 14:15:35 -04006259void Context::getProgramBinary(GLuint program,
6260 GLsizei bufSize,
6261 GLsizei *length,
6262 GLenum *binaryFormat,
6263 void *binary)
6264{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006265 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006266 ASSERT(programObject != nullptr);
6267
6268 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6269}
6270
6271void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6272{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006273 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006274 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006275
Jamie Madilld04908b2017-06-09 14:15:35 -04006276 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006277 if (programObject->isInUse())
6278 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006279 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006280 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006281 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006282}
6283
Jamie Madillff325f12017-08-26 15:06:05 -04006284void Context::uniform1ui(GLint location, GLuint v0)
6285{
6286 Program *program = mGLState.getProgram();
6287 program->setUniform1uiv(location, 1, &v0);
6288}
6289
6290void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6291{
6292 Program *program = mGLState.getProgram();
6293 const GLuint xy[] = {v0, v1};
6294 program->setUniform2uiv(location, 1, xy);
6295}
6296
6297void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6298{
6299 Program *program = mGLState.getProgram();
6300 const GLuint xyz[] = {v0, v1, v2};
6301 program->setUniform3uiv(location, 1, xyz);
6302}
6303
6304void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6305{
6306 Program *program = mGLState.getProgram();
6307 const GLuint xyzw[] = {v0, v1, v2, v3};
6308 program->setUniform4uiv(location, 1, xyzw);
6309}
6310
6311void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6312{
6313 Program *program = mGLState.getProgram();
6314 program->setUniform1uiv(location, count, value);
6315}
6316void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6317{
6318 Program *program = mGLState.getProgram();
6319 program->setUniform2uiv(location, count, value);
6320}
6321
6322void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6323{
6324 Program *program = mGLState.getProgram();
6325 program->setUniform3uiv(location, count, value);
6326}
6327
6328void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6329{
6330 Program *program = mGLState.getProgram();
6331 program->setUniform4uiv(location, count, value);
6332}
6333
Jamie Madillf0e04492017-08-26 15:28:42 -04006334void Context::genQueries(GLsizei n, GLuint *ids)
6335{
6336 for (GLsizei i = 0; i < n; i++)
6337 {
6338 GLuint handle = mQueryHandleAllocator.allocate();
6339 mQueryMap.assign(handle, nullptr);
6340 ids[i] = handle;
6341 }
6342}
6343
6344void Context::deleteQueries(GLsizei n, const GLuint *ids)
6345{
6346 for (int i = 0; i < n; i++)
6347 {
6348 GLuint query = ids[i];
6349
6350 Query *queryObject = nullptr;
6351 if (mQueryMap.erase(query, &queryObject))
6352 {
6353 mQueryHandleAllocator.release(query);
6354 if (queryObject)
6355 {
6356 queryObject->release(this);
6357 }
6358 }
6359 }
6360}
6361
6362GLboolean Context::isQuery(GLuint id)
6363{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006364 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006365}
6366
Jamie Madillc8c95812017-08-26 18:40:09 -04006367void Context::uniformMatrix2x3fv(GLint location,
6368 GLsizei count,
6369 GLboolean transpose,
6370 const GLfloat *value)
6371{
6372 Program *program = mGLState.getProgram();
6373 program->setUniformMatrix2x3fv(location, count, transpose, value);
6374}
6375
6376void Context::uniformMatrix3x2fv(GLint location,
6377 GLsizei count,
6378 GLboolean transpose,
6379 const GLfloat *value)
6380{
6381 Program *program = mGLState.getProgram();
6382 program->setUniformMatrix3x2fv(location, count, transpose, value);
6383}
6384
6385void Context::uniformMatrix2x4fv(GLint location,
6386 GLsizei count,
6387 GLboolean transpose,
6388 const GLfloat *value)
6389{
6390 Program *program = mGLState.getProgram();
6391 program->setUniformMatrix2x4fv(location, count, transpose, value);
6392}
6393
6394void Context::uniformMatrix4x2fv(GLint location,
6395 GLsizei count,
6396 GLboolean transpose,
6397 const GLfloat *value)
6398{
6399 Program *program = mGLState.getProgram();
6400 program->setUniformMatrix4x2fv(location, count, transpose, value);
6401}
6402
6403void Context::uniformMatrix3x4fv(GLint location,
6404 GLsizei count,
6405 GLboolean transpose,
6406 const GLfloat *value)
6407{
6408 Program *program = mGLState.getProgram();
6409 program->setUniformMatrix3x4fv(location, count, transpose, value);
6410}
6411
6412void Context::uniformMatrix4x3fv(GLint location,
6413 GLsizei count,
6414 GLboolean transpose,
6415 const GLfloat *value)
6416{
6417 Program *program = mGLState.getProgram();
6418 program->setUniformMatrix4x3fv(location, count, transpose, value);
6419}
6420
Jamie Madilld7576732017-08-26 18:49:50 -04006421void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6422{
6423 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6424 {
6425 GLuint vertexArray = arrays[arrayIndex];
6426
6427 if (arrays[arrayIndex] != 0)
6428 {
6429 VertexArray *vertexArrayObject = nullptr;
6430 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6431 {
6432 if (vertexArrayObject != nullptr)
6433 {
6434 detachVertexArray(vertexArray);
6435 vertexArrayObject->onDestroy(this);
6436 }
6437
6438 mVertexArrayHandleAllocator.release(vertexArray);
6439 }
6440 }
6441 }
6442}
6443
6444void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6445{
6446 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6447 {
6448 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6449 mVertexArrayMap.assign(vertexArray, nullptr);
6450 arrays[arrayIndex] = vertexArray;
6451 }
6452}
6453
6454bool Context::isVertexArray(GLuint array)
6455{
6456 if (array == 0)
6457 {
6458 return GL_FALSE;
6459 }
6460
6461 VertexArray *vao = getVertexArray(array);
6462 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6463}
6464
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006465void Context::endTransformFeedback()
6466{
6467 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6468 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006469 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006470}
6471
6472void Context::transformFeedbackVaryings(GLuint program,
6473 GLsizei count,
6474 const GLchar *const *varyings,
6475 GLenum bufferMode)
6476{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006477 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006478 ASSERT(programObject);
6479 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6480}
6481
6482void Context::getTransformFeedbackVarying(GLuint program,
6483 GLuint index,
6484 GLsizei bufSize,
6485 GLsizei *length,
6486 GLsizei *size,
6487 GLenum *type,
6488 GLchar *name)
6489{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006490 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006491 ASSERT(programObject);
6492 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6493}
6494
6495void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6496{
6497 for (int i = 0; i < n; i++)
6498 {
6499 GLuint transformFeedback = ids[i];
6500 if (transformFeedback == 0)
6501 {
6502 continue;
6503 }
6504
6505 TransformFeedback *transformFeedbackObject = nullptr;
6506 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6507 {
6508 if (transformFeedbackObject != nullptr)
6509 {
6510 detachTransformFeedback(transformFeedback);
6511 transformFeedbackObject->release(this);
6512 }
6513
6514 mTransformFeedbackHandleAllocator.release(transformFeedback);
6515 }
6516 }
6517}
6518
6519void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6520{
6521 for (int i = 0; i < n; i++)
6522 {
6523 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6524 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6525 ids[i] = transformFeedback;
6526 }
6527}
6528
6529bool Context::isTransformFeedback(GLuint id)
6530{
6531 if (id == 0)
6532 {
6533 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6534 // returns FALSE
6535 return GL_FALSE;
6536 }
6537
6538 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6539 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6540}
6541
6542void Context::pauseTransformFeedback()
6543{
6544 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6545 transformFeedback->pause();
6546}
6547
6548void Context::resumeTransformFeedback()
6549{
6550 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6551 transformFeedback->resume();
6552}
6553
Jamie Madill12e957f2017-08-26 21:42:26 -04006554void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6555{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006556 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006557 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006558}
6559
Brandon Jones59770802018-04-02 13:18:42 -07006560void Context::getUniformuivRobust(GLuint program,
6561 GLint location,
6562 GLsizei bufSize,
6563 GLsizei *length,
6564 GLuint *params)
6565{
6566 getUniformuiv(program, location, params);
6567}
6568
Jamie Madill12e957f2017-08-26 21:42:26 -04006569GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6570{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006571 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006572 return programObject->getFragDataLocation(name);
6573}
6574
6575void Context::getUniformIndices(GLuint program,
6576 GLsizei uniformCount,
6577 const GLchar *const *uniformNames,
6578 GLuint *uniformIndices)
6579{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006580 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006581 if (!programObject->isLinked())
6582 {
6583 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6584 {
6585 uniformIndices[uniformId] = GL_INVALID_INDEX;
6586 }
6587 }
6588 else
6589 {
6590 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6591 {
6592 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6593 }
6594 }
6595}
6596
6597void Context::getActiveUniformsiv(GLuint program,
6598 GLsizei uniformCount,
6599 const GLuint *uniformIndices,
6600 GLenum pname,
6601 GLint *params)
6602{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006603 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006604 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6605 {
6606 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006607 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006608 }
6609}
6610
6611GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6612{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006613 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006614 return programObject->getUniformBlockIndex(uniformBlockName);
6615}
6616
6617void Context::getActiveUniformBlockiv(GLuint program,
6618 GLuint uniformBlockIndex,
6619 GLenum pname,
6620 GLint *params)
6621{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006622 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006623 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6624}
6625
Brandon Jones59770802018-04-02 13:18:42 -07006626void Context::getActiveUniformBlockivRobust(GLuint program,
6627 GLuint uniformBlockIndex,
6628 GLenum pname,
6629 GLsizei bufSize,
6630 GLsizei *length,
6631 GLint *params)
6632{
6633 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6634}
6635
Jamie Madill12e957f2017-08-26 21:42:26 -04006636void Context::getActiveUniformBlockName(GLuint program,
6637 GLuint uniformBlockIndex,
6638 GLsizei bufSize,
6639 GLsizei *length,
6640 GLchar *uniformBlockName)
6641{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006642 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006643 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6644}
6645
6646void Context::uniformBlockBinding(GLuint program,
6647 GLuint uniformBlockIndex,
6648 GLuint uniformBlockBinding)
6649{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006650 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006651 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006652
Jamie Madill956ab4d2018-10-10 16:13:03 -04006653 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006654 if (programObject->isInUse())
6655 {
6656 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006657 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006658 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006659}
6660
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006661GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6662{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006663 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6664 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006665
Jamie Madill70b5bb02017-08-28 13:32:37 -04006666 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006667 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006668 if (error.isError())
6669 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006670 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006671 handleError(error);
6672 return nullptr;
6673 }
6674
Jamie Madill70b5bb02017-08-28 13:32:37 -04006675 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006676}
6677
6678GLboolean Context::isSync(GLsync sync)
6679{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006680 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006681}
6682
6683GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6684{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006685 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006686
6687 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006688 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006689 return result;
6690}
6691
6692void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6693{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006694 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006695 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006696}
6697
6698void Context::getInteger64v(GLenum pname, GLint64 *params)
6699{
6700 GLenum nativeType = GL_NONE;
6701 unsigned int numParams = 0;
6702 getQueryParameterInfo(pname, &nativeType, &numParams);
6703
6704 if (nativeType == GL_INT_64_ANGLEX)
6705 {
6706 getInteger64vImpl(pname, params);
6707 }
6708 else
6709 {
6710 CastStateValues(this, nativeType, pname, numParams, params);
6711 }
6712}
6713
Brandon Jones59770802018-04-02 13:18:42 -07006714void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6715{
6716 getInteger64v(pname, data);
6717}
6718
Corentin Wallez336129f2017-10-17 15:55:40 -04006719void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006720{
6721 Buffer *buffer = mGLState.getTargetBuffer(target);
6722 QueryBufferParameteri64v(buffer, pname, params);
6723}
6724
Brandon Jones59770802018-04-02 13:18:42 -07006725void Context::getBufferParameteri64vRobust(BufferBinding target,
6726 GLenum pname,
6727 GLsizei bufSize,
6728 GLsizei *length,
6729 GLint64 *params)
6730{
6731 getBufferParameteri64v(target, pname, params);
6732}
6733
Jamie Madill3ef140a2017-08-26 23:11:21 -04006734void Context::genSamplers(GLsizei count, GLuint *samplers)
6735{
6736 for (int i = 0; i < count; i++)
6737 {
6738 samplers[i] = mState.mSamplers->createSampler();
6739 }
6740}
6741
6742void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6743{
6744 for (int i = 0; i < count; i++)
6745 {
6746 GLuint sampler = samplers[i];
6747
6748 if (mState.mSamplers->getSampler(sampler))
6749 {
6750 detachSampler(sampler);
6751 }
6752
6753 mState.mSamplers->deleteObject(this, sampler);
6754 }
6755}
6756
6757void Context::getInternalformativ(GLenum target,
6758 GLenum internalformat,
6759 GLenum pname,
6760 GLsizei bufSize,
6761 GLint *params)
6762{
6763 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6764 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6765}
6766
Brandon Jones59770802018-04-02 13:18:42 -07006767void Context::getInternalformativRobust(GLenum target,
6768 GLenum internalformat,
6769 GLenum pname,
6770 GLsizei bufSize,
6771 GLsizei *length,
6772 GLint *params)
6773{
6774 getInternalformativ(target, internalformat, pname, bufSize, params);
6775}
6776
Jiajia Qin5451d532017-11-16 17:16:34 +08006777void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6778{
6779 programUniform1iv(program, location, 1, &v0);
6780}
6781
6782void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6783{
6784 GLint xy[2] = {v0, v1};
6785 programUniform2iv(program, location, 1, xy);
6786}
6787
6788void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6789{
6790 GLint xyz[3] = {v0, v1, v2};
6791 programUniform3iv(program, location, 1, xyz);
6792}
6793
6794void Context::programUniform4i(GLuint program,
6795 GLint location,
6796 GLint v0,
6797 GLint v1,
6798 GLint v2,
6799 GLint v3)
6800{
6801 GLint xyzw[4] = {v0, v1, v2, v3};
6802 programUniform4iv(program, location, 1, xyzw);
6803}
6804
6805void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6806{
6807 programUniform1uiv(program, location, 1, &v0);
6808}
6809
6810void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6811{
6812 GLuint xy[2] = {v0, v1};
6813 programUniform2uiv(program, location, 1, xy);
6814}
6815
6816void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6817{
6818 GLuint xyz[3] = {v0, v1, v2};
6819 programUniform3uiv(program, location, 1, xyz);
6820}
6821
6822void Context::programUniform4ui(GLuint program,
6823 GLint location,
6824 GLuint v0,
6825 GLuint v1,
6826 GLuint v2,
6827 GLuint v3)
6828{
6829 GLuint xyzw[4] = {v0, v1, v2, v3};
6830 programUniform4uiv(program, location, 1, xyzw);
6831}
6832
6833void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6834{
6835 programUniform1fv(program, location, 1, &v0);
6836}
6837
6838void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6839{
6840 GLfloat xy[2] = {v0, v1};
6841 programUniform2fv(program, location, 1, xy);
6842}
6843
6844void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6845{
6846 GLfloat xyz[3] = {v0, v1, v2};
6847 programUniform3fv(program, location, 1, xyz);
6848}
6849
6850void Context::programUniform4f(GLuint program,
6851 GLint location,
6852 GLfloat v0,
6853 GLfloat v1,
6854 GLfloat v2,
6855 GLfloat v3)
6856{
6857 GLfloat xyzw[4] = {v0, v1, v2, v3};
6858 programUniform4fv(program, location, 1, xyzw);
6859}
6860
Jamie Madill81c2e252017-09-09 23:32:46 -04006861void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6862{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006863 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006864 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006865 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006866}
6867
Jiajia Qin5451d532017-11-16 17:16:34 +08006868void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6869{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006870 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006871 ASSERT(programObject);
6872 programObject->setUniform2iv(location, count, value);
6873}
6874
6875void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6876{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006877 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006878 ASSERT(programObject);
6879 programObject->setUniform3iv(location, count, value);
6880}
6881
6882void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6883{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006884 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006885 ASSERT(programObject);
6886 programObject->setUniform4iv(location, count, value);
6887}
6888
6889void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6890{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006891 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006892 ASSERT(programObject);
6893 programObject->setUniform1uiv(location, count, value);
6894}
6895
6896void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6897{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006898 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006899 ASSERT(programObject);
6900 programObject->setUniform2uiv(location, count, value);
6901}
6902
6903void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6904{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006905 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006906 ASSERT(programObject);
6907 programObject->setUniform3uiv(location, count, value);
6908}
6909
6910void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6911{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006912 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006913 ASSERT(programObject);
6914 programObject->setUniform4uiv(location, count, value);
6915}
6916
6917void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6918{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006919 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006920 ASSERT(programObject);
6921 programObject->setUniform1fv(location, count, value);
6922}
6923
6924void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6925{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006926 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006927 ASSERT(programObject);
6928 programObject->setUniform2fv(location, count, value);
6929}
6930
6931void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6932{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006933 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006934 ASSERT(programObject);
6935 programObject->setUniform3fv(location, count, value);
6936}
6937
6938void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6939{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006940 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006941 ASSERT(programObject);
6942 programObject->setUniform4fv(location, count, value);
6943}
6944
6945void Context::programUniformMatrix2fv(GLuint program,
6946 GLint location,
6947 GLsizei count,
6948 GLboolean transpose,
6949 const GLfloat *value)
6950{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006951 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006952 ASSERT(programObject);
6953 programObject->setUniformMatrix2fv(location, count, transpose, value);
6954}
6955
6956void Context::programUniformMatrix3fv(GLuint program,
6957 GLint location,
6958 GLsizei count,
6959 GLboolean transpose,
6960 const GLfloat *value)
6961{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006962 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006963 ASSERT(programObject);
6964 programObject->setUniformMatrix3fv(location, count, transpose, value);
6965}
6966
6967void Context::programUniformMatrix4fv(GLuint program,
6968 GLint location,
6969 GLsizei count,
6970 GLboolean transpose,
6971 const GLfloat *value)
6972{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006973 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006974 ASSERT(programObject);
6975 programObject->setUniformMatrix4fv(location, count, transpose, value);
6976}
6977
6978void Context::programUniformMatrix2x3fv(GLuint program,
6979 GLint location,
6980 GLsizei count,
6981 GLboolean transpose,
6982 const GLfloat *value)
6983{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006984 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006985 ASSERT(programObject);
6986 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6987}
6988
6989void Context::programUniformMatrix3x2fv(GLuint program,
6990 GLint location,
6991 GLsizei count,
6992 GLboolean transpose,
6993 const GLfloat *value)
6994{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006995 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006996 ASSERT(programObject);
6997 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6998}
6999
7000void Context::programUniformMatrix2x4fv(GLuint program,
7001 GLint location,
7002 GLsizei count,
7003 GLboolean transpose,
7004 const GLfloat *value)
7005{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007006 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007007 ASSERT(programObject);
7008 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
7009}
7010
7011void Context::programUniformMatrix4x2fv(GLuint program,
7012 GLint location,
7013 GLsizei count,
7014 GLboolean transpose,
7015 const GLfloat *value)
7016{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007017 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007018 ASSERT(programObject);
7019 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
7020}
7021
7022void Context::programUniformMatrix3x4fv(GLuint program,
7023 GLint location,
7024 GLsizei count,
7025 GLboolean transpose,
7026 const GLfloat *value)
7027{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007028 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007029 ASSERT(programObject);
7030 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
7031}
7032
7033void Context::programUniformMatrix4x3fv(GLuint program,
7034 GLint location,
7035 GLsizei count,
7036 GLboolean transpose,
7037 const GLfloat *value)
7038{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007039 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007040 ASSERT(programObject);
7041 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
7042}
7043
Jamie Madill81c2e252017-09-09 23:32:46 -04007044void Context::onTextureChange(const Texture *texture)
7045{
7046 // Conservatively assume all textures are dirty.
7047 // TODO(jmadill): More fine-grained update.
7048 mGLState.setObjectDirty(GL_TEXTURE);
7049}
7050
James Darpiniane8a93c62018-01-04 18:02:24 -08007051bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
7052{
7053 return mGLState.isCurrentTransformFeedback(tf);
7054}
James Darpiniane8a93c62018-01-04 18:02:24 -08007055
Yunchao Hea336b902017-08-02 16:05:21 +08007056void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
7057{
7058 for (int i = 0; i < count; i++)
7059 {
7060 pipelines[i] = createProgramPipeline();
7061 }
7062}
7063
7064void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
7065{
7066 for (int i = 0; i < count; i++)
7067 {
7068 if (pipelines[i] != 0)
7069 {
7070 deleteProgramPipeline(pipelines[i]);
7071 }
7072 }
7073}
7074
7075GLboolean Context::isProgramPipeline(GLuint pipeline)
7076{
7077 if (pipeline == 0)
7078 {
7079 return GL_FALSE;
7080 }
7081
7082 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
7083}
7084
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007085void Context::finishFenceNV(GLuint fence)
7086{
7087 FenceNV *fenceObject = getFenceNV(fence);
7088
7089 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04007090 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007091}
7092
7093void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
7094{
7095 FenceNV *fenceObject = getFenceNV(fence);
7096
7097 ASSERT(fenceObject && fenceObject->isSet());
7098
7099 switch (pname)
7100 {
7101 case GL_FENCE_STATUS_NV:
7102 {
7103 // GL_NV_fence spec:
7104 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
7105 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
7106 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
7107 GLboolean status = GL_TRUE;
7108 if (fenceObject->getStatus() != GL_TRUE)
7109 {
Jamie Madilla0691b72018-07-25 10:41:22 -04007110 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007111 }
7112 *params = status;
7113 break;
7114 }
7115
7116 case GL_FENCE_CONDITION_NV:
7117 {
7118 *params = static_cast<GLint>(fenceObject->getCondition());
7119 break;
7120 }
7121
7122 default:
7123 UNREACHABLE();
7124 }
7125}
7126
7127void Context::getTranslatedShaderSource(GLuint shader,
7128 GLsizei bufsize,
7129 GLsizei *length,
7130 GLchar *source)
7131{
7132 Shader *shaderObject = getShader(shader);
7133 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08007134 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007135}
7136
7137void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
7138{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007139 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007140 ASSERT(programObject);
7141
7142 programObject->getUniformfv(this, location, params);
7143}
7144
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007145void Context::getnUniformfvRobust(GLuint program,
7146 GLint location,
7147 GLsizei bufSize,
7148 GLsizei *length,
7149 GLfloat *params)
7150{
7151 UNIMPLEMENTED();
7152}
7153
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007154void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
7155{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007156 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007157 ASSERT(programObject);
7158
7159 programObject->getUniformiv(this, location, params);
7160}
7161
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007162void Context::getnUniformivRobust(GLuint program,
7163 GLint location,
7164 GLsizei bufSize,
7165 GLsizei *length,
7166 GLint *params)
7167{
7168 UNIMPLEMENTED();
7169}
7170
7171void Context::getnUniformuivRobust(GLuint program,
7172 GLint location,
7173 GLsizei bufSize,
7174 GLsizei *length,
7175 GLuint *params)
7176{
7177 UNIMPLEMENTED();
7178}
7179
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007180GLboolean Context::isFenceNV(GLuint fence)
7181{
7182 FenceNV *fenceObject = getFenceNV(fence);
7183
7184 if (fenceObject == nullptr)
7185 {
7186 return GL_FALSE;
7187 }
7188
7189 // GL_NV_fence spec:
7190 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7191 // existing fence.
7192 return fenceObject->isSet();
7193}
7194
7195void Context::readnPixels(GLint x,
7196 GLint y,
7197 GLsizei width,
7198 GLsizei height,
7199 GLenum format,
7200 GLenum type,
7201 GLsizei bufSize,
7202 void *data)
7203{
7204 return readPixels(x, y, width, height, format, type, data);
7205}
7206
Jamie Madill007530e2017-12-28 14:27:04 -05007207void Context::setFenceNV(GLuint fence, GLenum condition)
7208{
7209 ASSERT(condition == GL_ALL_COMPLETED_NV);
7210
7211 FenceNV *fenceObject = getFenceNV(fence);
7212 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04007213 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007214}
7215
7216GLboolean Context::testFenceNV(GLuint fence)
7217{
7218 FenceNV *fenceObject = getFenceNV(fence);
7219
7220 ASSERT(fenceObject != nullptr);
7221 ASSERT(fenceObject->isSet() == GL_TRUE);
7222
7223 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007224 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007225 if (error.isError())
7226 {
7227 handleError(error);
7228 return GL_TRUE;
7229 }
7230
7231 return result;
7232}
7233
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007234void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007235{
7236 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007237 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007238 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007239}
7240
Jamie Madillfa920eb2018-01-04 11:45:50 -05007241void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007242{
7243 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007244 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007245 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7246}
7247
Jamie Madillfa920eb2018-01-04 11:45:50 -05007248void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7249{
7250 UNIMPLEMENTED();
7251}
7252
Jamie Madill5b772312018-03-08 20:28:32 -05007253bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7254{
7255 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7256 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7257 // to the fact that it is stored internally as a float, and so would require conversion
7258 // if returned from Context::getIntegerv. Since this conversion is already implemented
7259 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7260 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7261 // application.
7262 switch (pname)
7263 {
7264 case GL_COMPRESSED_TEXTURE_FORMATS:
7265 {
7266 *type = GL_INT;
7267 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7268 return true;
7269 }
7270 case GL_SHADER_BINARY_FORMATS:
7271 {
7272 *type = GL_INT;
7273 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7274 return true;
7275 }
7276
7277 case GL_MAX_VERTEX_ATTRIBS:
7278 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7279 case GL_MAX_VARYING_VECTORS:
7280 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7281 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7282 case GL_MAX_TEXTURE_IMAGE_UNITS:
7283 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7284 case GL_MAX_RENDERBUFFER_SIZE:
7285 case GL_NUM_SHADER_BINARY_FORMATS:
7286 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7287 case GL_ARRAY_BUFFER_BINDING:
7288 case GL_FRAMEBUFFER_BINDING:
7289 case GL_RENDERBUFFER_BINDING:
7290 case GL_CURRENT_PROGRAM:
7291 case GL_PACK_ALIGNMENT:
7292 case GL_UNPACK_ALIGNMENT:
7293 case GL_GENERATE_MIPMAP_HINT:
7294 case GL_RED_BITS:
7295 case GL_GREEN_BITS:
7296 case GL_BLUE_BITS:
7297 case GL_ALPHA_BITS:
7298 case GL_DEPTH_BITS:
7299 case GL_STENCIL_BITS:
7300 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7301 case GL_CULL_FACE_MODE:
7302 case GL_FRONT_FACE:
7303 case GL_ACTIVE_TEXTURE:
7304 case GL_STENCIL_FUNC:
7305 case GL_STENCIL_VALUE_MASK:
7306 case GL_STENCIL_REF:
7307 case GL_STENCIL_FAIL:
7308 case GL_STENCIL_PASS_DEPTH_FAIL:
7309 case GL_STENCIL_PASS_DEPTH_PASS:
7310 case GL_STENCIL_BACK_FUNC:
7311 case GL_STENCIL_BACK_VALUE_MASK:
7312 case GL_STENCIL_BACK_REF:
7313 case GL_STENCIL_BACK_FAIL:
7314 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7315 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7316 case GL_DEPTH_FUNC:
7317 case GL_BLEND_SRC_RGB:
7318 case GL_BLEND_SRC_ALPHA:
7319 case GL_BLEND_DST_RGB:
7320 case GL_BLEND_DST_ALPHA:
7321 case GL_BLEND_EQUATION_RGB:
7322 case GL_BLEND_EQUATION_ALPHA:
7323 case GL_STENCIL_WRITEMASK:
7324 case GL_STENCIL_BACK_WRITEMASK:
7325 case GL_STENCIL_CLEAR_VALUE:
7326 case GL_SUBPIXEL_BITS:
7327 case GL_MAX_TEXTURE_SIZE:
7328 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7329 case GL_SAMPLE_BUFFERS:
7330 case GL_SAMPLES:
7331 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7332 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7333 case GL_TEXTURE_BINDING_2D:
7334 case GL_TEXTURE_BINDING_CUBE_MAP:
7335 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7336 {
7337 *type = GL_INT;
7338 *numParams = 1;
7339 return true;
7340 }
7341 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7342 {
7343 if (!getExtensions().packReverseRowOrder)
7344 {
7345 return false;
7346 }
7347 *type = GL_INT;
7348 *numParams = 1;
7349 return true;
7350 }
7351 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7352 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7353 {
7354 if (!getExtensions().textureRectangle)
7355 {
7356 return false;
7357 }
7358 *type = GL_INT;
7359 *numParams = 1;
7360 return true;
7361 }
7362 case GL_MAX_DRAW_BUFFERS_EXT:
7363 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7364 {
7365 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7366 {
7367 return false;
7368 }
7369 *type = GL_INT;
7370 *numParams = 1;
7371 return true;
7372 }
7373 case GL_MAX_VIEWPORT_DIMS:
7374 {
7375 *type = GL_INT;
7376 *numParams = 2;
7377 return true;
7378 }
7379 case GL_VIEWPORT:
7380 case GL_SCISSOR_BOX:
7381 {
7382 *type = GL_INT;
7383 *numParams = 4;
7384 return true;
7385 }
7386 case GL_SHADER_COMPILER:
7387 case GL_SAMPLE_COVERAGE_INVERT:
7388 case GL_DEPTH_WRITEMASK:
7389 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7390 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7391 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7392 // bool-natural
7393 case GL_SAMPLE_COVERAGE:
7394 case GL_SCISSOR_TEST:
7395 case GL_STENCIL_TEST:
7396 case GL_DEPTH_TEST:
7397 case GL_BLEND:
7398 case GL_DITHER:
7399 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7400 {
7401 *type = GL_BOOL;
7402 *numParams = 1;
7403 return true;
7404 }
7405 case GL_COLOR_WRITEMASK:
7406 {
7407 *type = GL_BOOL;
7408 *numParams = 4;
7409 return true;
7410 }
7411 case GL_POLYGON_OFFSET_FACTOR:
7412 case GL_POLYGON_OFFSET_UNITS:
7413 case GL_SAMPLE_COVERAGE_VALUE:
7414 case GL_DEPTH_CLEAR_VALUE:
7415 case GL_LINE_WIDTH:
7416 {
7417 *type = GL_FLOAT;
7418 *numParams = 1;
7419 return true;
7420 }
7421 case GL_ALIASED_LINE_WIDTH_RANGE:
7422 case GL_ALIASED_POINT_SIZE_RANGE:
7423 case GL_DEPTH_RANGE:
7424 {
7425 *type = GL_FLOAT;
7426 *numParams = 2;
7427 return true;
7428 }
7429 case GL_COLOR_CLEAR_VALUE:
7430 case GL_BLEND_COLOR:
7431 {
7432 *type = GL_FLOAT;
7433 *numParams = 4;
7434 return true;
7435 }
7436 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7437 if (!getExtensions().textureFilterAnisotropic)
7438 {
7439 return false;
7440 }
7441 *type = GL_FLOAT;
7442 *numParams = 1;
7443 return true;
7444 case GL_TIMESTAMP_EXT:
7445 if (!getExtensions().disjointTimerQuery)
7446 {
7447 return false;
7448 }
7449 *type = GL_INT_64_ANGLEX;
7450 *numParams = 1;
7451 return true;
7452 case GL_GPU_DISJOINT_EXT:
7453 if (!getExtensions().disjointTimerQuery)
7454 {
7455 return false;
7456 }
7457 *type = GL_INT;
7458 *numParams = 1;
7459 return true;
7460 case GL_COVERAGE_MODULATION_CHROMIUM:
7461 if (!getExtensions().framebufferMixedSamples)
7462 {
7463 return false;
7464 }
7465 *type = GL_INT;
7466 *numParams = 1;
7467 return true;
7468 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7469 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7470 {
7471 return false;
7472 }
7473 *type = GL_INT;
7474 *numParams = 1;
7475 return true;
7476 }
7477
7478 if (getExtensions().debug)
7479 {
7480 switch (pname)
7481 {
7482 case GL_DEBUG_LOGGED_MESSAGES:
7483 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7484 case GL_DEBUG_GROUP_STACK_DEPTH:
7485 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7486 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7487 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7488 case GL_MAX_LABEL_LENGTH:
7489 *type = GL_INT;
7490 *numParams = 1;
7491 return true;
7492
7493 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7494 case GL_DEBUG_OUTPUT:
7495 *type = GL_BOOL;
7496 *numParams = 1;
7497 return true;
7498 }
7499 }
7500
7501 if (getExtensions().multisampleCompatibility)
7502 {
7503 switch (pname)
7504 {
7505 case GL_MULTISAMPLE_EXT:
7506 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7507 *type = GL_BOOL;
7508 *numParams = 1;
7509 return true;
7510 }
7511 }
7512
7513 if (getExtensions().pathRendering)
7514 {
7515 switch (pname)
7516 {
7517 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7518 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7519 *type = GL_FLOAT;
7520 *numParams = 16;
7521 return true;
7522 }
7523 }
7524
7525 if (getExtensions().bindGeneratesResource)
7526 {
7527 switch (pname)
7528 {
7529 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7530 *type = GL_BOOL;
7531 *numParams = 1;
7532 return true;
7533 }
7534 }
7535
7536 if (getExtensions().clientArrays)
7537 {
7538 switch (pname)
7539 {
7540 case GL_CLIENT_ARRAYS_ANGLE:
7541 *type = GL_BOOL;
7542 *numParams = 1;
7543 return true;
7544 }
7545 }
7546
7547 if (getExtensions().sRGBWriteControl)
7548 {
7549 switch (pname)
7550 {
7551 case GL_FRAMEBUFFER_SRGB_EXT:
7552 *type = GL_BOOL;
7553 *numParams = 1;
7554 return true;
7555 }
7556 }
7557
7558 if (getExtensions().robustResourceInitialization &&
7559 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7560 {
7561 *type = GL_BOOL;
7562 *numParams = 1;
7563 return true;
7564 }
7565
7566 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7567 {
7568 *type = GL_BOOL;
7569 *numParams = 1;
7570 return true;
7571 }
7572
jchen1082af6202018-06-22 10:59:52 +08007573 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7574 {
7575 *type = GL_INT;
7576 *numParams = 1;
7577 return true;
7578 }
7579
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007580 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7581 {
7582 *type = GL_INT;
7583 *numParams = 1;
7584 return true;
7585 }
7586
Jamie Madill5b772312018-03-08 20:28:32 -05007587 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7588 switch (pname)
7589 {
7590 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7591 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7592 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7593 {
7594 return false;
7595 }
7596 *type = GL_INT;
7597 *numParams = 1;
7598 return true;
7599
7600 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7601 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7602 {
7603 return false;
7604 }
7605 *type = GL_INT;
7606 *numParams = 1;
7607 return true;
7608
7609 case GL_PROGRAM_BINARY_FORMATS_OES:
7610 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7611 {
7612 return false;
7613 }
7614 *type = GL_INT;
7615 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7616 return true;
7617
7618 case GL_PACK_ROW_LENGTH:
7619 case GL_PACK_SKIP_ROWS:
7620 case GL_PACK_SKIP_PIXELS:
7621 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7622 {
7623 return false;
7624 }
7625 *type = GL_INT;
7626 *numParams = 1;
7627 return true;
7628 case GL_UNPACK_ROW_LENGTH:
7629 case GL_UNPACK_SKIP_ROWS:
7630 case GL_UNPACK_SKIP_PIXELS:
7631 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7632 {
7633 return false;
7634 }
7635 *type = GL_INT;
7636 *numParams = 1;
7637 return true;
7638 case GL_VERTEX_ARRAY_BINDING:
7639 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7640 {
7641 return false;
7642 }
7643 *type = GL_INT;
7644 *numParams = 1;
7645 return true;
7646 case GL_PIXEL_PACK_BUFFER_BINDING:
7647 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7648 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7649 {
7650 return false;
7651 }
7652 *type = GL_INT;
7653 *numParams = 1;
7654 return true;
7655 case GL_MAX_SAMPLES:
7656 {
7657 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7658 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7659 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7660 {
7661 return false;
7662 }
7663 *type = GL_INT;
7664 *numParams = 1;
7665 return true;
7666
7667 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7668 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7669 {
7670 return false;
7671 }
7672 *type = GL_INT;
7673 *numParams = 1;
7674 return true;
7675 }
7676 }
7677
7678 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7679 {
7680 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7681 {
7682 return false;
7683 }
7684 *type = GL_INT;
7685 *numParams = 1;
7686 return true;
7687 }
7688
7689 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7690 {
7691 *type = GL_INT;
7692 *numParams = 1;
7693 return true;
7694 }
7695
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007696 if (getClientVersion() < Version(2, 0))
7697 {
7698 switch (pname)
7699 {
7700 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007701 case GL_CLIENT_ACTIVE_TEXTURE:
7702 case GL_MATRIX_MODE:
7703 case GL_MAX_TEXTURE_UNITS:
7704 case GL_MAX_MODELVIEW_STACK_DEPTH:
7705 case GL_MAX_PROJECTION_STACK_DEPTH:
7706 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007707 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007708 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007709 case GL_VERTEX_ARRAY_STRIDE:
7710 case GL_NORMAL_ARRAY_STRIDE:
7711 case GL_COLOR_ARRAY_STRIDE:
7712 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7713 case GL_VERTEX_ARRAY_SIZE:
7714 case GL_COLOR_ARRAY_SIZE:
7715 case GL_TEXTURE_COORD_ARRAY_SIZE:
7716 case GL_VERTEX_ARRAY_TYPE:
7717 case GL_NORMAL_ARRAY_TYPE:
7718 case GL_COLOR_ARRAY_TYPE:
7719 case GL_TEXTURE_COORD_ARRAY_TYPE:
7720 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7721 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7722 case GL_COLOR_ARRAY_BUFFER_BINDING:
7723 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7724 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7725 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7726 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007727 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007728 case GL_MODELVIEW_STACK_DEPTH:
7729 case GL_PROJECTION_STACK_DEPTH:
7730 case GL_TEXTURE_STACK_DEPTH:
7731 case GL_LOGIC_OP_MODE:
7732 case GL_BLEND_SRC:
7733 case GL_BLEND_DST:
7734 case GL_PERSPECTIVE_CORRECTION_HINT:
7735 case GL_POINT_SMOOTH_HINT:
7736 case GL_LINE_SMOOTH_HINT:
7737 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007738 *type = GL_INT;
7739 *numParams = 1;
7740 return true;
7741 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007742 case GL_FOG_DENSITY:
7743 case GL_FOG_START:
7744 case GL_FOG_END:
7745 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007746 case GL_POINT_SIZE:
7747 case GL_POINT_SIZE_MIN:
7748 case GL_POINT_SIZE_MAX:
7749 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007750 *type = GL_FLOAT;
7751 *numParams = 1;
7752 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007753 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007754 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007755 *type = GL_FLOAT;
7756 *numParams = 2;
7757 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007758 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007759 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007760 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007761 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007762 *type = GL_FLOAT;
7763 *numParams = 4;
7764 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007765 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007766 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007767 *type = GL_FLOAT;
7768 *numParams = 3;
7769 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007770 case GL_MODELVIEW_MATRIX:
7771 case GL_PROJECTION_MATRIX:
7772 case GL_TEXTURE_MATRIX:
7773 *type = GL_FLOAT;
7774 *numParams = 16;
7775 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007776 case GL_LIGHT_MODEL_TWO_SIDE:
7777 *type = GL_BOOL;
7778 *numParams = 1;
7779 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007780 }
7781 }
7782
Jamie Madill5b772312018-03-08 20:28:32 -05007783 if (getClientVersion() < Version(3, 0))
7784 {
7785 return false;
7786 }
7787
7788 // Check for ES3.0+ parameter names
7789 switch (pname)
7790 {
7791 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7792 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7793 case GL_UNIFORM_BUFFER_BINDING:
7794 case GL_TRANSFORM_FEEDBACK_BINDING:
7795 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7796 case GL_COPY_READ_BUFFER_BINDING:
7797 case GL_COPY_WRITE_BUFFER_BINDING:
7798 case GL_SAMPLER_BINDING:
7799 case GL_READ_BUFFER:
7800 case GL_TEXTURE_BINDING_3D:
7801 case GL_TEXTURE_BINDING_2D_ARRAY:
7802 case GL_MAX_3D_TEXTURE_SIZE:
7803 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7804 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7805 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7806 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7807 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7808 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7809 case GL_MAX_VARYING_COMPONENTS:
7810 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7811 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7812 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7813 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7814 case GL_NUM_EXTENSIONS:
7815 case GL_MAJOR_VERSION:
7816 case GL_MINOR_VERSION:
7817 case GL_MAX_ELEMENTS_INDICES:
7818 case GL_MAX_ELEMENTS_VERTICES:
7819 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7820 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7821 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7822 case GL_UNPACK_IMAGE_HEIGHT:
7823 case GL_UNPACK_SKIP_IMAGES:
7824 {
7825 *type = GL_INT;
7826 *numParams = 1;
7827 return true;
7828 }
7829
7830 case GL_MAX_ELEMENT_INDEX:
7831 case GL_MAX_UNIFORM_BLOCK_SIZE:
7832 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7833 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7834 case GL_MAX_SERVER_WAIT_TIMEOUT:
7835 {
7836 *type = GL_INT_64_ANGLEX;
7837 *numParams = 1;
7838 return true;
7839 }
7840
7841 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7842 case GL_TRANSFORM_FEEDBACK_PAUSED:
7843 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7844 case GL_RASTERIZER_DISCARD:
7845 {
7846 *type = GL_BOOL;
7847 *numParams = 1;
7848 return true;
7849 }
7850
7851 case GL_MAX_TEXTURE_LOD_BIAS:
7852 {
7853 *type = GL_FLOAT;
7854 *numParams = 1;
7855 return true;
7856 }
7857 }
7858
7859 if (getExtensions().requestExtension)
7860 {
7861 switch (pname)
7862 {
7863 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7864 *type = GL_INT;
7865 *numParams = 1;
7866 return true;
7867 }
7868 }
7869
Yizhou Jiang7818a852018-09-06 15:02:04 +08007870 if (getExtensions().textureMultisample)
7871 {
7872 switch (pname)
7873 {
7874 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7875 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7876 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7877 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
7878 *type = GL_INT;
7879 *numParams = 1;
7880 return true;
7881 }
7882 }
7883
Jamie Madill5b772312018-03-08 20:28:32 -05007884 if (getClientVersion() < Version(3, 1))
7885 {
7886 return false;
7887 }
7888
7889 switch (pname)
7890 {
7891 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7892 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7893 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7894 case GL_MAX_FRAMEBUFFER_WIDTH:
7895 case GL_MAX_FRAMEBUFFER_HEIGHT:
7896 case GL_MAX_FRAMEBUFFER_SAMPLES:
7897 case GL_MAX_SAMPLE_MASK_WORDS:
7898 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7899 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7900 case GL_MAX_INTEGER_SAMPLES:
7901 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7902 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7903 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7904 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7905 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7906 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7907 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7908 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7909 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7910 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7911 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7912 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7913 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7914 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7915 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7916 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7917 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7918 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7919 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7920 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7921 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7922 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7923 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7924 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7925 case GL_MAX_UNIFORM_LOCATIONS:
7926 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7927 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7928 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7929 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7930 case GL_MAX_IMAGE_UNITS:
7931 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7932 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7933 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7934 case GL_SHADER_STORAGE_BUFFER_BINDING:
7935 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7936 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007937 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007938 *type = GL_INT;
7939 *numParams = 1;
7940 return true;
7941 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7942 *type = GL_INT_64_ANGLEX;
7943 *numParams = 1;
7944 return true;
7945 case GL_SAMPLE_MASK:
7946 *type = GL_BOOL;
7947 *numParams = 1;
7948 return true;
7949 }
7950
7951 if (getExtensions().geometryShader)
7952 {
7953 switch (pname)
7954 {
7955 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7956 case GL_LAYER_PROVOKING_VERTEX_EXT:
7957 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7958 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7959 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7960 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7961 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7962 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7963 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7964 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7965 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7966 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7967 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7968 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7969 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7970 *type = GL_INT;
7971 *numParams = 1;
7972 return true;
7973 }
7974 }
7975
7976 return false;
7977}
7978
7979bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7980{
7981 if (getClientVersion() < Version(3, 0))
7982 {
7983 return false;
7984 }
7985
7986 switch (target)
7987 {
7988 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7989 case GL_UNIFORM_BUFFER_BINDING:
7990 {
7991 *type = GL_INT;
7992 *numParams = 1;
7993 return true;
7994 }
7995 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7996 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7997 case GL_UNIFORM_BUFFER_START:
7998 case GL_UNIFORM_BUFFER_SIZE:
7999 {
8000 *type = GL_INT_64_ANGLEX;
8001 *numParams = 1;
8002 return true;
8003 }
8004 }
8005
8006 if (getClientVersion() < Version(3, 1))
8007 {
8008 return false;
8009 }
8010
8011 switch (target)
8012 {
8013 case GL_IMAGE_BINDING_LAYERED:
8014 {
8015 *type = GL_BOOL;
8016 *numParams = 1;
8017 return true;
8018 }
8019 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
8020 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
8021 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
8022 case GL_SHADER_STORAGE_BUFFER_BINDING:
8023 case GL_VERTEX_BINDING_BUFFER:
8024 case GL_VERTEX_BINDING_DIVISOR:
8025 case GL_VERTEX_BINDING_OFFSET:
8026 case GL_VERTEX_BINDING_STRIDE:
8027 case GL_SAMPLE_MASK_VALUE:
8028 case GL_IMAGE_BINDING_NAME:
8029 case GL_IMAGE_BINDING_LEVEL:
8030 case GL_IMAGE_BINDING_LAYER:
8031 case GL_IMAGE_BINDING_ACCESS:
8032 case GL_IMAGE_BINDING_FORMAT:
8033 {
8034 *type = GL_INT;
8035 *numParams = 1;
8036 return true;
8037 }
8038 case GL_ATOMIC_COUNTER_BUFFER_START:
8039 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
8040 case GL_SHADER_STORAGE_BUFFER_START:
8041 case GL_SHADER_STORAGE_BUFFER_SIZE:
8042 {
8043 *type = GL_INT_64_ANGLEX;
8044 *numParams = 1;
8045 return true;
8046 }
8047 }
8048
8049 return false;
8050}
8051
Jamie Madill44a6fbf2018-10-02 13:38:56 -04008052Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05008053{
8054 return mState.mShaderPrograms->getProgram(handle);
8055}
8056
8057Shader *Context::getShader(GLuint handle) const
8058{
8059 return mState.mShaderPrograms->getShader(handle);
8060}
8061
Jamie Madill5b772312018-03-08 20:28:32 -05008062bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
8063{
8064 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
8065}
8066
8067bool Context::isFramebufferGenerated(GLuint framebuffer) const
8068{
8069 return mState.mFramebuffers->isHandleGenerated(framebuffer);
8070}
8071
8072bool Context::isProgramPipelineGenerated(GLuint pipeline) const
8073{
8074 return mState.mPipelines->isHandleGenerated(pipeline);
8075}
8076
8077bool Context::usingDisplayTextureShareGroup() const
8078{
8079 return mDisplayTextureShareGroup;
8080}
8081
8082GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
8083{
8084 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
8085 internalformat == GL_DEPTH_STENCIL
8086 ? GL_DEPTH24_STENCIL8
8087 : internalformat;
8088}
8089
jchen1082af6202018-06-22 10:59:52 +08008090void Context::maxShaderCompilerThreads(GLuint count)
8091{
jchen107ae70d82018-07-06 13:47:01 +08008092 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08008093 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08008094 // A count of zero specifies a request for no parallel compiling or linking.
8095 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
8096 {
8097 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
8098 }
8099 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08008100}
8101
Jamie Madill2eb65032018-07-30 10:25:57 -04008102bool Context::isGLES1() const
8103{
8104 return mState.getClientVersion() < Version(2, 0);
8105}
8106
Jamie Madilla11819d2018-07-30 10:26:01 -04008107void Context::onSubjectStateChange(const Context *context,
8108 angle::SubjectIndex index,
8109 angle::SubjectMessage message)
8110{
Jamie Madilla11819d2018-07-30 10:26:01 -04008111 switch (index)
8112 {
8113 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008114 switch (message)
8115 {
8116 case angle::SubjectMessage::CONTENTS_CHANGED:
8117 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
8118 mStateCache.onVertexArrayBufferContentsChange(this);
8119 break;
8120 case angle::SubjectMessage::RESOURCE_MAPPED:
8121 case angle::SubjectMessage::RESOURCE_UNMAPPED:
8122 case angle::SubjectMessage::BINDING_CHANGED:
8123 mStateCache.onVertexArrayBufferStateChange(this);
8124 break;
8125 default:
8126 break;
8127 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008128 break;
8129
8130 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008131 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8132 {
8133 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
8134 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008135 break;
8136
8137 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008138 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8139 {
8140 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
8141 }
8142 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04008143 break;
8144
8145 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04008146 if (index < kTextureMaxSubjectIndex)
8147 {
8148 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04008149 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008150 }
Jamie Madille25b8002018-09-20 13:39:49 -04008151 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04008152 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04008153 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04008154 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008155 }
Jamie Madille25b8002018-09-20 13:39:49 -04008156 else
8157 {
8158 ASSERT(index < kSamplerMaxSubjectIndex);
8159 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
8160 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008161 break;
8162 }
8163}
8164
Jamie Madill6b873dd2018-07-12 23:56:30 -04008165// ErrorSet implementation.
8166ErrorSet::ErrorSet(Context *context) : mContext(context)
8167{
8168}
8169
8170ErrorSet::~ErrorSet() = default;
8171
Jamie Madill306b6c12018-07-27 08:12:49 -04008172void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04008173{
8174 // This internal enum is used to filter internal errors that are already handled.
8175 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
8176 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
8177 {
8178 return;
8179 }
8180
8181 if (ANGLE_UNLIKELY(error.isError()))
8182 {
8183 GLenum code = error.getCode();
8184 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04008185
Jamie Madill6b873dd2018-07-12 23:56:30 -04008186 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8187 {
8188 mContext->markContextLost();
8189 }
8190
8191 ASSERT(!error.getMessage().empty());
8192 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8193 error.getID(), GL_DEBUG_SEVERITY_HIGH,
8194 error.getMessage());
8195 }
8196}
8197
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008198void ErrorSet::handleError(GLenum errorCode,
8199 const char *message,
8200 const char *file,
8201 const char *function,
8202 unsigned int line)
8203{
8204 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
8205 std::stringstream errorStream;
8206 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
8207 << function << ":" << line << ". " << message;
8208
8209 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
8210}
8211
Jamie Madilla139f012018-10-10 16:13:03 -04008212void ErrorSet::validationError(GLenum errorCode, const char *message)
8213{
8214 handleError(gl::Error(errorCode, message));
8215}
8216
Jamie Madill6b873dd2018-07-12 23:56:30 -04008217bool ErrorSet::empty() const
8218{
8219 return mErrors.empty();
8220}
8221
8222GLenum ErrorSet::popError()
8223{
8224 ASSERT(!empty());
8225 GLenum error = *mErrors.begin();
8226 mErrors.erase(mErrors.begin());
8227 return error;
8228}
Jamie Madilldc358af2018-07-31 11:22:13 -04008229
8230// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008231StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008232 : mCachedHasAnyEnabledClientAttrib(false),
8233 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008234 mCachedInstancedVertexElementLimit(0),
8235 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008236{
8237}
8238
8239StateCache::~StateCache() = default;
8240
Jamie Madillac66f982018-10-09 18:30:01 -04008241void StateCache::initialize(Context *context)
8242{
8243 updateValidDrawModes(context);
8244 updateValidBindTextureTypes(context);
8245}
8246
Jamie Madilldc358af2018-07-31 11:22:13 -04008247void StateCache::updateActiveAttribsMask(Context *context)
8248{
8249 bool isGLES1 = context->isGLES1();
8250 const State &glState = context->getGLState();
8251
8252 if (!isGLES1 && !glState.getProgram())
8253 {
8254 mCachedActiveBufferedAttribsMask = AttributesMask();
8255 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008256 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008257 return;
8258 }
8259
8260 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8261 : glState.getProgram()->getActiveAttribLocationsMask();
8262
8263 const VertexArray *vao = glState.getVertexArray();
8264 ASSERT(vao);
8265
8266 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8267 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008268 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008269
Jamie Madill0a17e482018-08-31 17:19:11 -04008270 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8271 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008272 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008273 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8274}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008275
8276void StateCache::updateVertexElementLimits(Context *context)
8277{
8278 const VertexArray *vao = context->getGLState().getVertexArray();
8279
8280 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8281 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8282
8283 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8284 // If there are no buffered attributes then we should not limit the draw call count.
8285 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8286 {
8287 return;
8288 }
8289
8290 const auto &vertexAttribs = vao->getVertexAttributes();
8291 const auto &vertexBindings = vao->getVertexBindings();
8292
8293 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8294 {
8295 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8296 ASSERT(attrib.enabled);
8297
8298 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8299 ASSERT(context->isGLES1() ||
8300 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8301
8302 GLint64 limit = attrib.getCachedElementLimit();
8303 if (binding.getDivisor() > 0)
8304 {
8305 mCachedInstancedVertexElementLimit =
8306 std::min(mCachedInstancedVertexElementLimit, limit);
8307 }
8308 else
8309 {
8310 mCachedNonInstancedVertexElementLimit =
8311 std::min(mCachedNonInstancedVertexElementLimit, limit);
8312 }
8313 }
8314}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008315
Jamie Madilld84b6732018-09-06 15:54:35 -04008316void StateCache::updateBasicDrawStatesError()
8317{
8318 mCachedBasicDrawStatesError = kInvalidPointer;
8319}
8320
8321intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8322{
8323 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8324 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8325 return mCachedBasicDrawStatesError;
8326}
8327
Jamie Madillc43cdad2018-08-08 15:49:25 -04008328void StateCache::onVertexArrayBindingChange(Context *context)
8329{
8330 updateActiveAttribsMask(context);
8331 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008332 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008333}
8334
8335void StateCache::onProgramExecutableChange(Context *context)
8336{
8337 updateActiveAttribsMask(context);
8338 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008339 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008340 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008341}
8342
Jamie Madilld84b6732018-09-06 15:54:35 -04008343void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008344{
8345 updateVertexElementLimits(context);
8346}
8347
Jamie Madilld84b6732018-09-06 15:54:35 -04008348void StateCache::onVertexArrayBufferContentsChange(Context *context)
8349{
8350 updateVertexElementLimits(context);
8351 updateBasicDrawStatesError();
8352}
8353
Jamie Madillc43cdad2018-08-08 15:49:25 -04008354void StateCache::onVertexArrayStateChange(Context *context)
8355{
8356 updateActiveAttribsMask(context);
8357 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008358 updateBasicDrawStatesError();
8359}
8360
8361void StateCache::onVertexArrayBufferStateChange(Context *context)
8362{
8363 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008364}
8365
8366void StateCache::onGLES1ClientStateChange(Context *context)
8367{
8368 updateActiveAttribsMask(context);
8369}
Jamie Madilld84b6732018-09-06 15:54:35 -04008370
8371void StateCache::onDrawFramebufferChange(Context *context)
8372{
8373 updateBasicDrawStatesError();
8374}
8375
8376void StateCache::onContextCapChange(Context *context)
8377{
8378 updateBasicDrawStatesError();
8379}
8380
8381void StateCache::onStencilStateChange(Context *context)
8382{
8383 updateBasicDrawStatesError();
8384}
8385
8386void StateCache::onDefaultVertexAttributeChange(Context *context)
8387{
8388 updateBasicDrawStatesError();
8389}
8390
8391void StateCache::onActiveTextureChange(Context *context)
8392{
8393 updateBasicDrawStatesError();
8394}
8395
8396void StateCache::onQueryChange(Context *context)
8397{
8398 updateBasicDrawStatesError();
8399}
8400
8401void StateCache::onTransformFeedbackChange(Context *context)
8402{
8403 updateBasicDrawStatesError();
8404}
8405
8406void StateCache::onUniformBufferStateChange(Context *context)
8407{
8408 updateBasicDrawStatesError();
8409}
8410
8411void StateCache::onBufferBindingChange(Context *context)
8412{
8413 updateBasicDrawStatesError();
8414}
Jamie Madill526a6f62018-09-12 11:03:05 -04008415
8416void StateCache::updateValidDrawModes(Context *context)
8417{
8418 Program *program = context->getGLState().getProgram();
8419 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8420 {
8421 mCachedValidDrawModes = {{
8422 true, /* Points */
8423 true, /* Lines */
8424 true, /* LineLoop */
8425 true, /* LineStrip */
8426 true, /* Triangles */
8427 true, /* TriangleStrip */
8428 true, /* TriangleFan */
8429 false, /* LinesAdjacency */
8430 false, /* LineStripAdjacency */
8431 false, /* TrianglesAdjacency */
8432 false, /* TriangleStripAdjacency */
8433 false, /* InvalidEnum */
8434 }};
8435 }
8436 else
8437 {
8438 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8439
8440 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8441
8442 mCachedValidDrawModes = {{
8443 gsMode == PrimitiveMode::Points, /* Points */
8444 gsMode == PrimitiveMode::Lines, /* Lines */
8445 gsMode == PrimitiveMode::Lines, /* LineLoop */
8446 gsMode == PrimitiveMode::Lines, /* LineStrip */
8447 gsMode == PrimitiveMode::Triangles, /* Triangles */
8448 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8449 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8450 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8451 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8452 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8453 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8454 false, /* InvalidEnum */
8455 }};
8456 }
8457}
Jamie Madillac66f982018-10-09 18:30:01 -04008458
8459void StateCache::updateValidBindTextureTypes(Context *context)
8460{
8461 const Extensions &exts = context->getExtensions();
8462 bool isGLES3 = context->getClientMajorVersion() >= 3;
8463 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8464
8465 mCachedValidBindTextureTypes = {{
8466 true, /* _2D */
8467 isGLES3, /* _2DArray */
Yizhou Jiang7818a852018-09-06 15:02:04 +08008468 isGLES31 || exts.textureMultisample, /* _2DMultisample */
Jamie Madillac66f982018-10-09 18:30:01 -04008469 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8470 isGLES3, /* _3D */
8471 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8472 exts.textureRectangle, /* Rectangle */
8473 true, /* CubeMap */
8474 false, /* InvalidEnum */
8475
8476 }};
8477}
Jamie Madillc29968b2016-01-20 11:17:23 -05008478} // namespace gl