blob: 2dba8836ebd9f553b58fce573a8b58de76c9834c [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000011
Jamie Madill231c7f52017-04-26 13:45:37 -040012#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050013#include <iterator>
14#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030015#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050016
Tobin Ehlisd7890bc2018-06-29 11:57:22 -060017#include "common/PackedEnums.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030018#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040019#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050020#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050021#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050022#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050023#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040024#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050025#include "libANGLE/Fence.h"
26#include "libANGLE/Framebuffer.h"
27#include "libANGLE/FramebufferAttachment.h"
Lingfeng Yang461b09a2018-04-23 09:02:09 -070028#include "libANGLE/GLES1Renderer.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030029#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080031#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050033#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/ResourceManager.h"
35#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050036#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050037#include "libANGLE/Texture.h"
38#include "libANGLE/TransformFeedback.h"
39#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070040#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040041#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030042#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040043#include "libANGLE/queryutils.h"
Jamie Madill6d32cef2018-08-14 02:34:28 -040044#include "libANGLE/renderer/BufferImpl.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/renderer/ContextImpl.h"
46#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040047#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040048#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000049
Geoff Langf6db0982015-08-25 13:04:00 -040050namespace
51{
52
Jamie Madillb6664922017-07-25 12:55:04 -040053#define ANGLE_HANDLE_ERR(X) \
54 handleError(X); \
55 return;
56#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
57
Ian Ewell3ffd78b2016-01-22 16:09:42 -050058template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050059std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030060 GLsizei numPaths,
61 const void *paths,
62 GLuint pathBase)
63{
64 std::vector<gl::Path *> ret;
65 ret.reserve(numPaths);
66
67 const auto *nameArray = static_cast<const T *>(paths);
68
69 for (GLsizei i = 0; i < numPaths; ++i)
70 {
71 const GLuint pathName = nameArray[i] + pathBase;
72
73 ret.push_back(resourceManager.getPath(pathName));
74 }
75
76 return ret;
77}
78
Geoff Lang4ddf5af2016-12-01 14:30:44 -050079std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030080 GLsizei numPaths,
81 GLenum pathNameType,
82 const void *paths,
83 GLuint pathBase)
84{
85 switch (pathNameType)
86 {
87 case GL_UNSIGNED_BYTE:
88 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_BYTE:
91 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_UNSIGNED_SHORT:
94 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_SHORT:
97 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_UNSIGNED_INT:
100 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
101
102 case GL_INT:
103 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
104 }
105
106 UNREACHABLE();
107 return std::vector<gl::Path *>();
108}
109
110template <typename T>
Jamie Madill666818e2018-11-14 09:54:33 -0500111angle::Result GetQueryObjectParameter(const gl::Context *context,
112 gl::Query *query,
113 GLenum pname,
114 T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500115{
Geoff Lang2186c382016-10-14 10:54:54 -0400116 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500117
118 switch (pname)
119 {
120 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400121 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500122 case GL_QUERY_RESULT_AVAILABLE_EXT:
123 {
124 bool available;
Jamie Madill666818e2018-11-14 09:54:33 -0500125 ANGLE_TRY(query->isResultAvailable(context, &available));
126 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
127 return angle::Result::Continue();
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500128 }
129 default:
130 UNREACHABLE();
Jamie Madill666818e2018-11-14 09:54:33 -0500131 return angle::Result::Stop();
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500132 }
133}
134
Jamie Madill956ab4d2018-10-10 16:13:03 -0400135ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const gl::Context *context,
136 gl::TransformFeedback *transformFeedback,
137 GLsizei count,
138 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400139{
Geoff Lang1a683462015-09-29 15:09:59 -0400140 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400141 {
Jamie Madill09463932018-04-04 05:26:59 -0400142 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400143 }
144}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500145
146// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300147EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400149 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500150}
151
Martin Radev1be913c2016-07-11 17:59:16 +0300152EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
153{
154 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
155}
156
Geoff Langeb66a6e2016-10-31 13:06:12 -0400157gl::Version GetClientVersion(const egl::AttributeMap &attribs)
158{
159 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
160}
161
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500162GLenum GetResetStrategy(const egl::AttributeMap &attribs)
163{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800164 EGLAttrib attrib =
165 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500166 switch (attrib)
167 {
168 case EGL_NO_RESET_NOTIFICATION:
169 return GL_NO_RESET_NOTIFICATION_EXT;
170 case EGL_LOSE_CONTEXT_ON_RESET:
171 return GL_LOSE_CONTEXT_ON_RESET_EXT;
172 default:
173 UNREACHABLE();
174 return GL_NONE;
175 }
176}
177
178bool GetRobustAccess(const egl::AttributeMap &attribs)
179{
Geoff Lang077f20a2016-11-01 10:08:02 -0400180 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
181 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
182 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500183}
184
185bool GetDebug(const egl::AttributeMap &attribs)
186{
Geoff Lang077f20a2016-11-01 10:08:02 -0400187 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
188 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500189}
190
191bool GetNoError(const egl::AttributeMap &attribs)
192{
193 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
194}
195
Geoff Langc287ea62016-09-16 14:46:51 -0400196bool GetWebGLContext(const egl::AttributeMap &attribs)
197{
Jamie Madill4230d482018-09-14 10:14:45 -0400198 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400199}
200
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400201bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
202{
203 // If the context is WebGL, extensions are disabled by default
204 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
205 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
206}
207
Geoff Langf41a7152016-09-19 15:11:17 -0400208bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
209{
Jamie Madill4230d482018-09-14 10:14:45 -0400210 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400211}
212
Geoff Langfeb8c682017-02-13 16:07:35 -0500213bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
214{
215 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
216}
217
Geoff Langb433e872017-10-05 14:01:47 -0400218bool GetRobustResourceInit(const egl::AttributeMap &attribs)
219{
220 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
221}
222
Martin Radev9d901792016-07-15 15:58:58 +0300223std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
224{
225 std::string labelName;
226 if (label != nullptr)
227 {
228 size_t labelLength = length < 0 ? strlen(label) : length;
229 labelName = std::string(label, labelLength);
230 }
231 return labelName;
232}
233
234void GetObjectLabelBase(const std::string &objectLabel,
235 GLsizei bufSize,
236 GLsizei *length,
237 GLchar *label)
238{
239 size_t writeLength = objectLabel.length();
240 if (label != nullptr && bufSize > 0)
241 {
242 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
243 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
244 label[writeLength] = '\0';
245 }
246
247 if (length != nullptr)
248 {
249 *length = static_cast<GLsizei>(writeLength);
250 }
251}
252
Jamie Madill0f80ed82017-09-19 00:24:56 -0400253template <typename CapT, typename MaxT>
254void LimitCap(CapT *cap, MaxT maximum)
255{
256 *cap = std::min(*cap, static_cast<CapT>(maximum));
257}
258
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600259constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
Jamie Madill526a6f62018-09-12 11:03:05 -0400260 1, /* Points */
261 2, /* Lines */
262 2, /* LineLoop */
263 2, /* LineStrip */
264 3, /* Triangles */
265 3, /* TriangleStrip */
266 3, /* TriangleFan */
267 2, /* LinesAdjacency */
268 2, /* LineStripAdjacency */
269 3, /* TrianglesAdjacency */
270 3, /* TriangleStripAdjacency */
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600271}};
272// Indices above are code-gen'd so make sure they don't change
273// if any of these static asserts are hit, must update kMinimumPrimitiveCounts abouve
274static_assert(static_cast<gl::PrimitiveMode>(0) == gl::PrimitiveMode::Points,
275 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
276static_assert(static_cast<gl::PrimitiveMode>(1) == gl::PrimitiveMode::Lines,
277 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
278static_assert(static_cast<gl::PrimitiveMode>(2) == gl::PrimitiveMode::LineLoop,
279 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
280static_assert(static_cast<gl::PrimitiveMode>(3) == gl::PrimitiveMode::LineStrip,
281 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
282static_assert(static_cast<gl::PrimitiveMode>(4) == gl::PrimitiveMode::Triangles,
283 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
284static_assert(static_cast<gl::PrimitiveMode>(5) == gl::PrimitiveMode::TriangleStrip,
285 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
286static_assert(static_cast<gl::PrimitiveMode>(6) == gl::PrimitiveMode::TriangleFan,
287 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
288static_assert(static_cast<gl::PrimitiveMode>(7) == gl::PrimitiveMode::LinesAdjacency,
289 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
290static_assert(static_cast<gl::PrimitiveMode>(8) == gl::PrimitiveMode::LineStripAdjacency,
291 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
292static_assert(static_cast<gl::PrimitiveMode>(9) == gl::PrimitiveMode::TrianglesAdjacency,
293 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
294static_assert(static_cast<gl::PrimitiveMode>(10) == gl::PrimitiveMode::TriangleStripAdjacency,
295 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
296static_assert(static_cast<gl::PrimitiveMode>(11) == gl::PrimitiveMode::EnumCount,
297 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
298
Jamie Madill6d32cef2018-08-14 02:34:28 -0400299enum SubjectIndexes : angle::SubjectIndex
300{
301 kTexture0SubjectIndex = 0,
302 kTextureMaxSubjectIndex = kTexture0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
303 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
304 kUniformBufferMaxSubjectIndex =
305 kUniformBuffer0SubjectIndex + gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400306 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
307 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
308 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400309 kReadFramebufferSubjectIndex,
310 kDrawFramebufferSubjectIndex
311};
Geoff Langf6db0982015-08-25 13:04:00 -0400312} // anonymous namespace
313
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000314namespace gl
315{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000316
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400317Context::Context(rx::EGLImplFactory *implFactory,
318 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400319 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500320 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400321 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500322 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700323 const egl::DisplayExtensions &displayExtensions,
324 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500325 : mState(reinterpret_cast<ContextID>(this),
326 shareContext ? &shareContext->mState : nullptr,
327 shareTextures,
328 GetClientVersion(attribs),
329 &mGLState,
330 mCaps,
331 mTextureCaps,
332 mExtensions,
333 mLimitations),
334 mSkipValidation(GetNoError(attribs)),
335 mDisplayTextureShareGroup(shareTextures != nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400336 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400337 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400338 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400339 mGLState(GetDebug(attribs),
340 GetBindGeneratesResource(attribs),
341 GetClientArraysEnabled(attribs),
342 GetRobustResourceInit(attribs),
343 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400344 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500345 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400346 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500347 mHasBeenCurrent(false),
348 mContextLost(false),
349 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700350 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500351 mResetStrategy(GetResetStrategy(attribs)),
352 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400353 mSurfacelessSupported(displayExtensions.surfacelessContext),
354 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400355 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
356 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500357 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400358 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400359 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400360 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
361 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
362 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400363 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800364 mZeroFilledBuffer(1000u),
365 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000366{
Jamie Madill6d32cef2018-08-14 02:34:28 -0400367 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
368 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
369 {
370 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
371 }
Jamie Madille25b8002018-09-20 13:39:49 -0400372
373 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
374 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
375 {
376 mSamplerObserverBindings.emplace_back(this, samplerIndex);
377 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400378}
Jamie Madill5b772312018-03-08 20:28:32 -0500379
Geoff Lang33f11fb2018-05-07 13:42:47 -0400380void Context::initialize()
381{
382 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400383
Geoff Lang33f11fb2018-05-07 13:42:47 -0400384 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700385 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400386
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400387 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100388
Shannon Woods53a94a82014-06-24 15:20:36 -0400389 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400390
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000391 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400392 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000393 // and cube map texture state vectors respectively associated with them.
394 // In order that access to these initial textures not be lost, they are treated as texture
395 // objects all of whose names are 0.
396
Corentin Wallez99d492c2018-02-27 15:17:10 -0500397 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800398 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500399
Corentin Wallez99d492c2018-02-27 15:17:10 -0500400 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800401 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400402
Geoff Langeb66a6e2016-10-31 13:06:12 -0400403 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400404 {
405 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500406 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800407 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400408
Corentin Wallez99d492c2018-02-27 15:17:10 -0500409 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800410 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400411 }
Yizhou Jiang7818a852018-09-06 15:02:04 +0800412 if (getClientVersion() >= Version(3, 1) || mSupportedExtensions.textureMultisample)
Geoff Lang3b573612016-10-31 14:08:10 -0400413 {
414 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500415 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800416 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Yizhou Jiang7818a852018-09-06 15:02:04 +0800417 }
418 if (getClientVersion() >= Version(3, 1))
419 {
Olli Etuahod310a432018-08-24 15:40:23 +0300420 Texture *zeroTexture2DMultisampleArray =
421 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
422 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800423
Jiajia Qin6eafb042016-12-27 17:04:07 +0800424 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
425 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800426 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800427 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800428
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800429 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
430 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400431 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800432 }
Geoff Lang3b573612016-10-31 14:08:10 -0400433 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000434
Geoff Langb0f917f2017-12-05 13:41:54 -0500435 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400436 {
437 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500438 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800439 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400440 }
441
Geoff Langb0f917f2017-12-05 13:41:54 -0500442 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400443 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500444 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800445 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400446 }
447
Jamie Madill4928b7c2017-06-20 12:57:39 -0400448 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500449
Jamie Madill57a89722013-07-02 11:57:03 -0400450 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000451
Geoff Langeb66a6e2016-10-31 13:06:12 -0400452 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400453 {
454 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
455 // In the initial state, a default transform feedback object is bound and treated as
456 // a transform feedback object with a name of zero. That object is bound any time
457 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400458 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400459 }
Geoff Langc8058452014-02-03 12:04:11 -0500460
Corentin Wallez336129f2017-10-17 15:55:40 -0400461 for (auto type : angle::AllEnums<BufferBinding>())
462 {
463 bindBuffer(type, 0);
464 }
465
466 bindRenderbuffer(GL_RENDERBUFFER, 0);
467
468 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
469 {
470 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
471 }
472
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700473 // Initialize GLES1 renderer if appropriate.
474 if (getClientVersion() < Version(2, 0))
475 {
476 mGLES1Renderer.reset(new GLES1Renderer());
477 }
478
Jamie Madillad9f24e2016-02-12 09:27:24 -0500479 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400480 mAllDirtyBits.set();
481
Geoff Lang9bf86f02018-07-26 11:46:34 -0400482 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
483 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
484 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400485 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400486 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400487
488 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
489 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
490 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400491 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400492
Jamie Madillc67323a2017-11-02 23:11:41 -0400493 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500494 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500495 // No dirty objects.
496
497 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400498 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500499 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400500 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500501 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
502
503 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
504 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
505 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
506 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
507 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
508 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
509 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
510 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
511 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
512 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
513 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400514 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500515 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
516
517 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
518 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700519 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400520 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
521 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500522 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
523 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400524
Xinghua Cao10a4d432017-11-28 14:46:26 +0800525 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800526 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
527 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800528 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
529 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
530 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
531 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800532 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800533 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800534 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400535 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400536 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800537
Jamie Madillb4927eb2018-07-16 11:39:46 -0400538 mImplementation->setErrorSet(&mErrors);
539
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400540 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000541}
542
Jamie Madill4928b7c2017-06-20 12:57:39 -0400543egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000544{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700545 if (mGLES1Renderer)
546 {
547 mGLES1Renderer->onDestroy(this, &mGLState);
548 }
549
Jamie Madille7b3fe22018-04-05 09:42:46 -0400550 ANGLE_TRY(releaseSurface(display));
551
Corentin Wallez80b24112015-08-25 16:41:57 -0400552 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000553 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400554 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000555 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400556 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000557
Corentin Wallez80b24112015-08-25 16:41:57 -0400558 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000559 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400560 if (query.second != nullptr)
561 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400562 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400563 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000564 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400565 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000566
Corentin Wallez80b24112015-08-25 16:41:57 -0400567 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400568 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400569 if (vertexArray.second)
570 {
571 vertexArray.second->onDestroy(this);
572 }
Jamie Madill57a89722013-07-02 11:57:03 -0400573 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400574 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400575
Corentin Wallez80b24112015-08-25 16:41:57 -0400576 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500577 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500578 if (transformFeedback.second != nullptr)
579 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500580 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500581 }
Geoff Langc8058452014-02-03 12:04:11 -0500582 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400583 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500584
Jamie Madill5b772312018-03-08 20:28:32 -0500585 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400586 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800587 if (zeroTexture.get() != nullptr)
588 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400589 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800590 zeroTexture.set(this, nullptr);
591 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400592 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000593
Jamie Madill2f348d22017-06-05 10:50:59 -0400594 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500595
Jamie Madill4928b7c2017-06-20 12:57:39 -0400596 mGLState.reset(this);
597
Jamie Madill6c1f6712017-02-14 19:08:04 -0500598 mState.mBuffers->release(this);
599 mState.mShaderPrograms->release(this);
600 mState.mTextures->release(this);
601 mState.mRenderbuffers->release(this);
602 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400603 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500604 mState.mPaths->release(this);
605 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800606 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400607
jchen107ae70d82018-07-06 13:47:01 +0800608 mThreadPool.reset();
609
Jamie Madill76e471e2017-10-21 09:56:01 -0400610 mImplementation->onDestroy(this);
611
Jamie Madill4928b7c2017-06-20 12:57:39 -0400612 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000613}
614
Jamie Madill70ee0f62017-02-06 16:04:20 -0500615Context::~Context()
616{
617}
618
Geoff Lang75359662018-04-11 01:42:27 -0400619void Context::setLabel(EGLLabelKHR label)
620{
621 mLabel = label;
622}
623
624EGLLabelKHR Context::getLabel() const
625{
626 return mLabel;
627}
628
Jamie Madill4928b7c2017-06-20 12:57:39 -0400629egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000630{
Jamie Madill61e16b42017-06-19 11:13:23 -0400631 mCurrentDisplay = display;
632
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000633 if (!mHasBeenCurrent)
634 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400635 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000636 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500637 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400638 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000639
Corentin Wallezc295e512017-01-27 17:47:50 -0500640 int width = 0;
641 int height = 0;
642 if (surface != nullptr)
643 {
644 width = surface->getWidth();
645 height = surface->getHeight();
646 }
647
648 mGLState.setViewportParams(0, 0, width, height);
649 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000650
651 mHasBeenCurrent = true;
652 }
653
Jamie Madill1b94d432015-08-07 13:23:23 -0400654 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700655 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400656 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400657
Jamie Madill4928b7c2017-06-20 12:57:39 -0400658 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500659
660 Framebuffer *newDefault = nullptr;
661 if (surface != nullptr)
662 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400663 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500664 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400665 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500666 }
667 else
668 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400669 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500670 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000671
Corentin Wallez37c39792015-08-20 14:19:46 -0400672 // Update default framebuffer, the binding of the previous default
673 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400674 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400675 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700676 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400677 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400678 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400679 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700680 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400681 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400682 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400683 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400684 }
Ian Ewell292f0052016-02-04 10:37:32 -0500685
Jamie Madill32643ce2018-10-19 11:38:03 -0400686 // Notify the renderer of a context switch.
687 // TODO(jmadill): Fix this error handling. http://anglebug.com/2491
688 (void)(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400689 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000690}
691
Jamie Madill4928b7c2017-06-20 12:57:39 -0400692egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400693{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400694 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400695
Geoff Langbf7b95d2018-05-01 16:48:21 -0400696 // Remove the default framebuffer
697 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500698 {
699 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400700 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500701 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400702
703 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500704 {
705 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400706 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500707 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400708
709 if (defaultFramebuffer)
710 {
711 defaultFramebuffer->onDestroy(this);
712 delete defaultFramebuffer;
713 }
714
Corentin Wallezc295e512017-01-27 17:47:50 -0500715 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
716
717 if (mCurrentSurface)
718 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400719 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500720 mCurrentSurface = nullptr;
721 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400722
723 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400724}
725
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000726GLuint Context::createBuffer()
727{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500728 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000729}
730
731GLuint Context::createProgram()
732{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500733 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000734}
735
Jiawei Shao385b3e02018-03-21 09:43:28 +0800736GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000737{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500738 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000739}
740
741GLuint Context::createTexture()
742{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500743 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000744}
745
746GLuint Context::createRenderbuffer()
747{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500748 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000749}
750
Jamie Madill13951342018-09-30 15:24:28 -0400751void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
752{
Jamie Madill526392d2018-11-16 09:35:14 -0500753 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(this, range, createdOut));
Jamie Madill13951342018-09-30 15:24:28 -0400754}
755
Brandon Jones59770802018-04-02 13:18:42 -0700756GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300757{
Jamie Madill13951342018-09-30 15:24:28 -0400758 GLuint created = 0;
759 tryGenPaths(range, &created);
760 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300761}
762
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000763// Returns an unused framebuffer name
764GLuint Context::createFramebuffer()
765{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500766 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000767}
768
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500769void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000770{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500771 for (int i = 0; i < n; i++)
772 {
773 GLuint handle = mFenceNVHandleAllocator.allocate();
774 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
775 fences[i] = handle;
776 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000777}
778
Yunchao Hea336b902017-08-02 16:05:21 +0800779GLuint Context::createProgramPipeline()
780{
781 return mState.mPipelines->createProgramPipeline();
782}
783
Jiawei Shao385b3e02018-03-21 09:43:28 +0800784GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800785{
786 UNIMPLEMENTED();
787 return 0u;
788}
789
James Darpinian4d9d4832018-03-13 12:43:28 -0700790void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000791{
James Darpinian4d9d4832018-03-13 12:43:28 -0700792 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
793 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000794 {
795 detachBuffer(buffer);
796 }
Jamie Madill893ab082014-05-16 16:56:10 -0400797
James Darpinian4d9d4832018-03-13 12:43:28 -0700798 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000799}
800
801void Context::deleteShader(GLuint shader)
802{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500803 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000804}
805
806void Context::deleteProgram(GLuint program)
807{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500808 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000809}
810
811void Context::deleteTexture(GLuint texture)
812{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500813 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000814 {
815 detachTexture(texture);
816 }
817
Jamie Madill6c1f6712017-02-14 19:08:04 -0500818 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000819}
820
821void Context::deleteRenderbuffer(GLuint renderbuffer)
822{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500823 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000824 {
825 detachRenderbuffer(renderbuffer);
826 }
Jamie Madill893ab082014-05-16 16:56:10 -0400827
Jamie Madill6c1f6712017-02-14 19:08:04 -0500828 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000829}
830
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400831void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400832{
833 // The spec specifies the underlying Fence object is not deleted until all current
834 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
835 // and since our API is currently designed for being called from a single thread, we can delete
836 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400837 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400838}
839
Yunchao Hea336b902017-08-02 16:05:21 +0800840void Context::deleteProgramPipeline(GLuint pipeline)
841{
842 if (mState.mPipelines->getProgramPipeline(pipeline))
843 {
844 detachProgramPipeline(pipeline);
845 }
846
847 mState.mPipelines->deleteObject(this, pipeline);
848}
849
Sami Väisänene45e53b2016-05-25 10:36:04 +0300850void Context::deletePaths(GLuint first, GLsizei range)
851{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500852 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300853}
854
Brandon Jones59770802018-04-02 13:18:42 -0700855bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300856{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500857 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300858 if (pathObj == nullptr)
859 return false;
860
861 return pathObj->hasPathData();
862}
863
Brandon Jones59770802018-04-02 13:18:42 -0700864bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300865{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500866 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300867}
868
Brandon Jones59770802018-04-02 13:18:42 -0700869void Context::pathCommands(GLuint path,
870 GLsizei numCommands,
871 const GLubyte *commands,
872 GLsizei numCoords,
873 GLenum coordType,
874 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300875{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500876 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300877
878 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
879}
880
Jamie Madill007530e2017-12-28 14:27:04 -0500881void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300882{
Jamie Madill007530e2017-12-28 14:27:04 -0500883 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300884
885 switch (pname)
886 {
887 case GL_PATH_STROKE_WIDTH_CHROMIUM:
888 pathObj->setStrokeWidth(value);
889 break;
890 case GL_PATH_END_CAPS_CHROMIUM:
891 pathObj->setEndCaps(static_cast<GLenum>(value));
892 break;
893 case GL_PATH_JOIN_STYLE_CHROMIUM:
894 pathObj->setJoinStyle(static_cast<GLenum>(value));
895 break;
896 case GL_PATH_MITER_LIMIT_CHROMIUM:
897 pathObj->setMiterLimit(value);
898 break;
899 case GL_PATH_STROKE_BOUND_CHROMIUM:
900 pathObj->setStrokeBound(value);
901 break;
902 default:
903 UNREACHABLE();
904 break;
905 }
906}
907
Jamie Madill007530e2017-12-28 14:27:04 -0500908void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300909{
Jamie Madill007530e2017-12-28 14:27:04 -0500910 // TODO(jmadill): Should use proper clamping/casting.
911 pathParameterf(path, pname, static_cast<GLfloat>(value));
912}
913
914void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
915{
916 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300917
918 switch (pname)
919 {
920 case GL_PATH_STROKE_WIDTH_CHROMIUM:
921 *value = pathObj->getStrokeWidth();
922 break;
923 case GL_PATH_END_CAPS_CHROMIUM:
924 *value = static_cast<GLfloat>(pathObj->getEndCaps());
925 break;
926 case GL_PATH_JOIN_STYLE_CHROMIUM:
927 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
928 break;
929 case GL_PATH_MITER_LIMIT_CHROMIUM:
930 *value = pathObj->getMiterLimit();
931 break;
932 case GL_PATH_STROKE_BOUND_CHROMIUM:
933 *value = pathObj->getStrokeBound();
934 break;
935 default:
936 UNREACHABLE();
937 break;
938 }
939}
940
Jamie Madill007530e2017-12-28 14:27:04 -0500941void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
942{
943 GLfloat val = 0.0f;
944 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
945 if (value)
946 *value = static_cast<GLint>(val);
947}
948
Brandon Jones59770802018-04-02 13:18:42 -0700949void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300950{
951 mGLState.setPathStencilFunc(func, ref, mask);
952}
953
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000954void Context::deleteFramebuffer(GLuint framebuffer)
955{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500956 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000957 {
958 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000959 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500960
Jamie Madill6c1f6712017-02-14 19:08:04 -0500961 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000962}
963
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500964void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000965{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500966 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000967 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500968 GLuint fence = fences[i];
969
970 FenceNV *fenceObject = nullptr;
971 if (mFenceNVMap.erase(fence, &fenceObject))
972 {
973 mFenceNVHandleAllocator.release(fence);
974 delete fenceObject;
975 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000976 }
977}
978
Geoff Lang70d0f492015-12-10 17:45:46 -0500979Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000980{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500981 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000982}
983
Geoff Lang70d0f492015-12-10 17:45:46 -0500984Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000985{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500986 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000987}
988
Jamie Madill70b5bb02017-08-28 13:32:37 -0400989Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400990{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400991 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400992}
993
Jamie Madill57a89722013-07-02 11:57:03 -0400994VertexArray *Context::getVertexArray(GLuint handle) const
995{
Jamie Madill96a483b2017-06-27 16:49:21 -0400996 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400997}
998
Jamie Madilldc356042013-07-19 16:36:57 -0400999Sampler *Context::getSampler(GLuint handle) const
1000{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001001 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001002}
1003
Geoff Langc8058452014-02-03 12:04:11 -05001004TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1005{
Jamie Madill96a483b2017-06-27 16:49:21 -04001006 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001007}
1008
Yunchao Hea336b902017-08-02 16:05:21 +08001009ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1010{
1011 return mState.mPipelines->getProgramPipeline(handle);
1012}
1013
Geoff Lang75359662018-04-11 01:42:27 -04001014gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001015{
1016 switch (identifier)
1017 {
1018 case GL_BUFFER:
1019 return getBuffer(name);
1020 case GL_SHADER:
1021 return getShader(name);
1022 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001023 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001024 case GL_VERTEX_ARRAY:
1025 return getVertexArray(name);
1026 case GL_QUERY:
1027 return getQuery(name);
1028 case GL_TRANSFORM_FEEDBACK:
1029 return getTransformFeedback(name);
1030 case GL_SAMPLER:
1031 return getSampler(name);
1032 case GL_TEXTURE:
1033 return getTexture(name);
1034 case GL_RENDERBUFFER:
1035 return getRenderbuffer(name);
1036 case GL_FRAMEBUFFER:
1037 return getFramebuffer(name);
1038 default:
1039 UNREACHABLE();
1040 return nullptr;
1041 }
1042}
1043
Geoff Lang75359662018-04-11 01:42:27 -04001044gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001045{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001046 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001047}
1048
Martin Radev9d901792016-07-15 15:58:58 +03001049void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1050{
Geoff Lang75359662018-04-11 01:42:27 -04001051 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001052 ASSERT(object != nullptr);
1053
1054 std::string labelName = GetObjectLabelFromPointer(length, label);
1055 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001056
1057 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1058 // specified object is active until we do this.
1059 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001060}
1061
1062void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1063{
Geoff Lang75359662018-04-11 01:42:27 -04001064 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001065 ASSERT(object != nullptr);
1066
1067 std::string labelName = GetObjectLabelFromPointer(length, label);
1068 object->setLabel(labelName);
1069}
1070
1071void Context::getObjectLabel(GLenum identifier,
1072 GLuint name,
1073 GLsizei bufSize,
1074 GLsizei *length,
1075 GLchar *label) const
1076{
Geoff Lang75359662018-04-11 01:42:27 -04001077 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001078 ASSERT(object != nullptr);
1079
1080 const std::string &objectLabel = object->getLabel();
1081 GetObjectLabelBase(objectLabel, bufSize, length, label);
1082}
1083
1084void Context::getObjectPtrLabel(const void *ptr,
1085 GLsizei bufSize,
1086 GLsizei *length,
1087 GLchar *label) const
1088{
Geoff Lang75359662018-04-11 01:42:27 -04001089 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001090 ASSERT(object != nullptr);
1091
1092 const std::string &objectLabel = object->getLabel();
1093 GetObjectLabelBase(objectLabel, bufSize, length, label);
1094}
1095
Jamie Madilldc356042013-07-19 16:36:57 -04001096bool Context::isSampler(GLuint samplerName) const
1097{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001098 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001099}
1100
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001101void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001102{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001103 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001104
Jamie Madilldedd7b92014-11-05 16:30:36 -05001105 if (handle == 0)
1106 {
1107 texture = mZeroTextures[target].get();
1108 }
1109 else
1110 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001111 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001112 }
1113
1114 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001115 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001116 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001117}
1118
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001119void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001120{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001121 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1122 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001123 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001124 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001125}
1126
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001127void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001128{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001129 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1130 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001131 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001132 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001133 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001134}
1135
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001136void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001137{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001138 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001139 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001140 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001141 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001142}
1143
Shao80957d92017-02-20 21:25:59 +08001144void Context::bindVertexBuffer(GLuint bindingIndex,
1145 GLuint bufferHandle,
1146 GLintptr offset,
1147 GLsizei stride)
1148{
1149 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001150 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001151 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001152}
1153
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001154void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001155{
Geoff Lang76b10c92014-09-05 16:28:14 -04001156 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001157 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001158 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001159 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001160 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001161}
1162
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001163void Context::bindImageTexture(GLuint unit,
1164 GLuint texture,
1165 GLint level,
1166 GLboolean layered,
1167 GLint layer,
1168 GLenum access,
1169 GLenum format)
1170{
1171 Texture *tex = mState.mTextures->getTexture(texture);
1172 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1173}
1174
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001175void Context::useProgram(GLuint program)
1176{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001177 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001178 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001179}
1180
Jiajia Qin5451d532017-11-16 17:16:34 +08001181void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1182{
1183 UNIMPLEMENTED();
1184}
1185
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001186void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001187{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001188 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001189 TransformFeedback *transformFeedback =
1190 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001191 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001192 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001193}
1194
Yunchao Hea336b902017-08-02 16:05:21 +08001195void Context::bindProgramPipeline(GLuint pipelineHandle)
1196{
1197 ProgramPipeline *pipeline =
1198 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1199 mGLState.setProgramPipelineBinding(this, pipeline);
1200}
1201
Corentin Wallezad3ae902018-03-09 13:40:42 -05001202void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001203{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001204 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001205 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001206
Geoff Lang5aad9672014-09-08 11:10:42 -04001207 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001208 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001209
1210 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001211 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001212 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001213}
1214
Corentin Wallezad3ae902018-03-09 13:40:42 -05001215void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001216{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001217 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001218 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001219
Jamie Madill5188a272018-07-25 10:53:56 -04001220 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001221
Geoff Lang5aad9672014-09-08 11:10:42 -04001222 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001223 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001224 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001225}
1226
Corentin Wallezad3ae902018-03-09 13:40:42 -05001227void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001228{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001229 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001230
1231 Query *queryObject = getQuery(id, true, target);
1232 ASSERT(queryObject);
1233
Jamie Madill5188a272018-07-25 10:53:56 -04001234 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001235}
1236
Corentin Wallezad3ae902018-03-09 13:40:42 -05001237void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001238{
1239 switch (pname)
1240 {
1241 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001242 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001243 break;
1244 case GL_QUERY_COUNTER_BITS_EXT:
1245 switch (target)
1246 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001247 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001248 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1249 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001250 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001251 params[0] = getExtensions().queryCounterBitsTimestamp;
1252 break;
1253 default:
1254 UNREACHABLE();
1255 params[0] = 0;
1256 break;
1257 }
1258 break;
1259 default:
1260 UNREACHABLE();
1261 return;
1262 }
1263}
1264
Corentin Wallezad3ae902018-03-09 13:40:42 -05001265void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001266 GLenum pname,
1267 GLsizei bufSize,
1268 GLsizei *length,
1269 GLint *params)
1270{
1271 getQueryiv(target, pname, params);
1272}
1273
Geoff Lang2186c382016-10-14 10:54:54 -04001274void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001275{
Jamie Madill5188a272018-07-25 10:53:56 -04001276 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001277}
1278
Brandon Jones59770802018-04-02 13:18:42 -07001279void Context::getQueryObjectivRobust(GLuint id,
1280 GLenum pname,
1281 GLsizei bufSize,
1282 GLsizei *length,
1283 GLint *params)
1284{
1285 getQueryObjectiv(id, pname, params);
1286}
1287
Geoff Lang2186c382016-10-14 10:54:54 -04001288void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001289{
Jamie Madill5188a272018-07-25 10:53:56 -04001290 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001291}
1292
Brandon Jones59770802018-04-02 13:18:42 -07001293void Context::getQueryObjectuivRobust(GLuint id,
1294 GLenum pname,
1295 GLsizei bufSize,
1296 GLsizei *length,
1297 GLuint *params)
1298{
1299 getQueryObjectuiv(id, pname, params);
1300}
1301
Geoff Lang2186c382016-10-14 10:54:54 -04001302void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001303{
Jamie Madill5188a272018-07-25 10:53:56 -04001304 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001305}
1306
Brandon Jones59770802018-04-02 13:18:42 -07001307void Context::getQueryObjecti64vRobust(GLuint id,
1308 GLenum pname,
1309 GLsizei bufSize,
1310 GLsizei *length,
1311 GLint64 *params)
1312{
1313 getQueryObjecti64v(id, pname, params);
1314}
1315
Geoff Lang2186c382016-10-14 10:54:54 -04001316void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001317{
Jamie Madill5188a272018-07-25 10:53:56 -04001318 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001319}
1320
Brandon Jones59770802018-04-02 13:18:42 -07001321void Context::getQueryObjectui64vRobust(GLuint id,
1322 GLenum pname,
1323 GLsizei bufSize,
1324 GLsizei *length,
1325 GLuint64 *params)
1326{
1327 getQueryObjectui64v(id, pname, params);
1328}
1329
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001330Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001331{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001332 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001333}
1334
Jamie Madill2f348d22017-06-05 10:50:59 -04001335FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001336{
Jamie Madill96a483b2017-06-27 16:49:21 -04001337 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001338}
1339
Corentin Wallezad3ae902018-03-09 13:40:42 -05001340Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001341{
Jamie Madill96a483b2017-06-27 16:49:21 -04001342 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001343 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001344 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001345 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001346
1347 Query *query = mQueryMap.query(handle);
1348 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001349 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001350 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001351 query = new Query(mImplementation->createQuery(type), handle);
1352 query->addRef();
1353 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001354 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001355 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001356}
1357
Geoff Lang70d0f492015-12-10 17:45:46 -05001358Query *Context::getQuery(GLuint handle) const
1359{
Jamie Madill96a483b2017-06-27 16:49:21 -04001360 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001361}
1362
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001363Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001364{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001365 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1366 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001367}
1368
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001369Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001370{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001371 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001372}
1373
Geoff Lang492a7e42014-11-05 13:27:06 -05001374Compiler *Context::getCompiler() const
1375{
Jamie Madill2f348d22017-06-05 10:50:59 -04001376 if (mCompiler.get() == nullptr)
1377 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001378 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001379 }
1380 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001381}
1382
Jamie Madillc1d770e2017-04-13 17:31:24 -04001383void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001384{
1385 switch (pname)
1386 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001387 case GL_SHADER_COMPILER:
1388 *params = GL_TRUE;
1389 break;
1390 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1391 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1392 break;
1393 default:
1394 mGLState.getBooleanv(pname, params);
1395 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001396 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001397}
1398
Jamie Madillc1d770e2017-04-13 17:31:24 -04001399void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001400{
Shannon Woods53a94a82014-06-24 15:20:36 -04001401 // Queries about context capabilities and maximums are answered by Context.
1402 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001403 switch (pname)
1404 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001405 case GL_ALIASED_LINE_WIDTH_RANGE:
1406 params[0] = mCaps.minAliasedLineWidth;
1407 params[1] = mCaps.maxAliasedLineWidth;
1408 break;
1409 case GL_ALIASED_POINT_SIZE_RANGE:
1410 params[0] = mCaps.minAliasedPointSize;
1411 params[1] = mCaps.maxAliasedPointSize;
1412 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001413 case GL_SMOOTH_POINT_SIZE_RANGE:
1414 params[0] = mCaps.minSmoothPointSize;
1415 params[1] = mCaps.maxSmoothPointSize;
1416 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001417 case GL_SMOOTH_LINE_WIDTH_RANGE:
1418 params[0] = mCaps.minSmoothLineWidth;
1419 params[1] = mCaps.maxSmoothLineWidth;
1420 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001421 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1422 ASSERT(mExtensions.textureFilterAnisotropic);
1423 *params = mExtensions.maxTextureAnisotropy;
1424 break;
1425 case GL_MAX_TEXTURE_LOD_BIAS:
1426 *params = mCaps.maxLODBias;
1427 break;
1428
1429 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1430 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1431 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001432 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1433 // GLES1 constants for modelview/projection matrix.
1434 if (getClientVersion() < Version(2, 0))
1435 {
1436 mGLState.getFloatv(pname, params);
1437 }
1438 else
1439 {
1440 ASSERT(mExtensions.pathRendering);
1441 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1442 memcpy(params, m, 16 * sizeof(GLfloat));
1443 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001444 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001445 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001446
Jamie Madill231c7f52017-04-26 13:45:37 -04001447 default:
1448 mGLState.getFloatv(pname, params);
1449 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001450 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001451}
1452
Jamie Madillc1d770e2017-04-13 17:31:24 -04001453void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001454{
Shannon Woods53a94a82014-06-24 15:20:36 -04001455 // Queries about context capabilities and maximums are answered by Context.
1456 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001457
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001458 switch (pname)
1459 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001460 case GL_MAX_VERTEX_ATTRIBS:
1461 *params = mCaps.maxVertexAttributes;
1462 break;
1463 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1464 *params = mCaps.maxVertexUniformVectors;
1465 break;
1466 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001467 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001468 break;
1469 case GL_MAX_VARYING_VECTORS:
1470 *params = mCaps.maxVaryingVectors;
1471 break;
1472 case GL_MAX_VARYING_COMPONENTS:
1473 *params = mCaps.maxVertexOutputComponents;
1474 break;
1475 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1476 *params = mCaps.maxCombinedTextureImageUnits;
1477 break;
1478 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001479 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001480 break;
1481 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001482 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001483 break;
1484 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1485 *params = mCaps.maxFragmentUniformVectors;
1486 break;
1487 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001488 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001489 break;
1490 case GL_MAX_RENDERBUFFER_SIZE:
1491 *params = mCaps.maxRenderbufferSize;
1492 break;
1493 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1494 *params = mCaps.maxColorAttachments;
1495 break;
1496 case GL_MAX_DRAW_BUFFERS_EXT:
1497 *params = mCaps.maxDrawBuffers;
1498 break;
1499 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1500 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1501 case GL_SUBPIXEL_BITS:
1502 *params = 4;
1503 break;
1504 case GL_MAX_TEXTURE_SIZE:
1505 *params = mCaps.max2DTextureSize;
1506 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001507 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1508 *params = mCaps.maxRectangleTextureSize;
1509 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001510 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1511 *params = mCaps.maxCubeMapTextureSize;
1512 break;
1513 case GL_MAX_3D_TEXTURE_SIZE:
1514 *params = mCaps.max3DTextureSize;
1515 break;
1516 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1517 *params = mCaps.maxArrayTextureLayers;
1518 break;
1519 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1520 *params = mCaps.uniformBufferOffsetAlignment;
1521 break;
1522 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1523 *params = mCaps.maxUniformBufferBindings;
1524 break;
1525 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001526 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001527 break;
1528 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001529 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001530 break;
1531 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1532 *params = mCaps.maxCombinedTextureImageUnits;
1533 break;
1534 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1535 *params = mCaps.maxVertexOutputComponents;
1536 break;
1537 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1538 *params = mCaps.maxFragmentInputComponents;
1539 break;
1540 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1541 *params = mCaps.minProgramTexelOffset;
1542 break;
1543 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1544 *params = mCaps.maxProgramTexelOffset;
1545 break;
1546 case GL_MAJOR_VERSION:
1547 *params = getClientVersion().major;
1548 break;
1549 case GL_MINOR_VERSION:
1550 *params = getClientVersion().minor;
1551 break;
1552 case GL_MAX_ELEMENTS_INDICES:
1553 *params = mCaps.maxElementsIndices;
1554 break;
1555 case GL_MAX_ELEMENTS_VERTICES:
1556 *params = mCaps.maxElementsVertices;
1557 break;
1558 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1559 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1560 break;
1561 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1562 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1563 break;
1564 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1565 *params = mCaps.maxTransformFeedbackSeparateComponents;
1566 break;
1567 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1568 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1569 break;
1570 case GL_MAX_SAMPLES_ANGLE:
1571 *params = mCaps.maxSamples;
1572 break;
1573 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001574 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001575 params[0] = mCaps.maxViewportWidth;
1576 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001577 }
1578 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001579 case GL_COMPRESSED_TEXTURE_FORMATS:
1580 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1581 params);
1582 break;
1583 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1584 *params = mResetStrategy;
1585 break;
1586 case GL_NUM_SHADER_BINARY_FORMATS:
1587 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1588 break;
1589 case GL_SHADER_BINARY_FORMATS:
1590 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1591 break;
1592 case GL_NUM_PROGRAM_BINARY_FORMATS:
1593 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1594 break;
1595 case GL_PROGRAM_BINARY_FORMATS:
1596 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1597 break;
1598 case GL_NUM_EXTENSIONS:
1599 *params = static_cast<GLint>(mExtensionStrings.size());
1600 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001601
Geoff Lang38f24ee2018-10-01 13:04:59 -04001602 // GL_ANGLE_request_extension
1603 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1604 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1605 break;
1606
Jamie Madill231c7f52017-04-26 13:45:37 -04001607 // GL_KHR_debug
1608 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1609 *params = mExtensions.maxDebugMessageLength;
1610 break;
1611 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1612 *params = mExtensions.maxDebugLoggedMessages;
1613 break;
1614 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1615 *params = mExtensions.maxDebugGroupStackDepth;
1616 break;
1617 case GL_MAX_LABEL_LENGTH:
1618 *params = mExtensions.maxLabelLength;
1619 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001620
Martin Radeve5285d22017-07-14 16:23:53 +03001621 // GL_ANGLE_multiview
1622 case GL_MAX_VIEWS_ANGLE:
1623 *params = mExtensions.maxViews;
1624 break;
1625
Jamie Madill231c7f52017-04-26 13:45:37 -04001626 // GL_EXT_disjoint_timer_query
1627 case GL_GPU_DISJOINT_EXT:
1628 *params = mImplementation->getGPUDisjoint();
1629 break;
1630 case GL_MAX_FRAMEBUFFER_WIDTH:
1631 *params = mCaps.maxFramebufferWidth;
1632 break;
1633 case GL_MAX_FRAMEBUFFER_HEIGHT:
1634 *params = mCaps.maxFramebufferHeight;
1635 break;
1636 case GL_MAX_FRAMEBUFFER_SAMPLES:
1637 *params = mCaps.maxFramebufferSamples;
1638 break;
1639 case GL_MAX_SAMPLE_MASK_WORDS:
1640 *params = mCaps.maxSampleMaskWords;
1641 break;
1642 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1643 *params = mCaps.maxColorTextureSamples;
1644 break;
1645 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1646 *params = mCaps.maxDepthTextureSamples;
1647 break;
1648 case GL_MAX_INTEGER_SAMPLES:
1649 *params = mCaps.maxIntegerSamples;
1650 break;
1651 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1652 *params = mCaps.maxVertexAttribRelativeOffset;
1653 break;
1654 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1655 *params = mCaps.maxVertexAttribBindings;
1656 break;
1657 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1658 *params = mCaps.maxVertexAttribStride;
1659 break;
1660 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001661 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001662 break;
1663 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001664 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001665 break;
1666 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001667 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001668 break;
1669 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001670 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001671 break;
1672 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001673 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001674 break;
1675 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001676 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001677 break;
1678 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001679 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001680 break;
1681 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001682 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001683 break;
1684 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1685 *params = mCaps.minProgramTextureGatherOffset;
1686 break;
1687 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1688 *params = mCaps.maxProgramTextureGatherOffset;
1689 break;
1690 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1691 *params = mCaps.maxComputeWorkGroupInvocations;
1692 break;
1693 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001694 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001695 break;
1696 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001697 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001698 break;
1699 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1700 *params = mCaps.maxComputeSharedMemorySize;
1701 break;
1702 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001703 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001704 break;
1705 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001706 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001707 break;
1708 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001709 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001710 break;
1711 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001712 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001713 break;
1714 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001715 *params =
1716 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001717 break;
1718 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001719 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001720 break;
1721 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1722 *params = mCaps.maxCombinedShaderOutputResources;
1723 break;
1724 case GL_MAX_UNIFORM_LOCATIONS:
1725 *params = mCaps.maxUniformLocations;
1726 break;
1727 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1728 *params = mCaps.maxAtomicCounterBufferBindings;
1729 break;
1730 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1731 *params = mCaps.maxAtomicCounterBufferSize;
1732 break;
1733 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1734 *params = mCaps.maxCombinedAtomicCounterBuffers;
1735 break;
1736 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1737 *params = mCaps.maxCombinedAtomicCounters;
1738 break;
1739 case GL_MAX_IMAGE_UNITS:
1740 *params = mCaps.maxImageUnits;
1741 break;
1742 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1743 *params = mCaps.maxCombinedImageUniforms;
1744 break;
1745 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1746 *params = mCaps.maxShaderStorageBufferBindings;
1747 break;
1748 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1749 *params = mCaps.maxCombinedShaderStorageBlocks;
1750 break;
1751 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1752 *params = mCaps.shaderStorageBufferOffsetAlignment;
1753 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001754
1755 // GL_EXT_geometry_shader
1756 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1757 *params = mCaps.maxFramebufferLayers;
1758 break;
1759 case GL_LAYER_PROVOKING_VERTEX_EXT:
1760 *params = mCaps.layerProvokingVertex;
1761 break;
1762 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001763 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001764 break;
1765 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001766 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001767 break;
1768 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001769 *params =
1770 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001771 break;
1772 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1773 *params = mCaps.maxGeometryInputComponents;
1774 break;
1775 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1776 *params = mCaps.maxGeometryOutputComponents;
1777 break;
1778 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1779 *params = mCaps.maxGeometryOutputVertices;
1780 break;
1781 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1782 *params = mCaps.maxGeometryTotalOutputComponents;
1783 break;
1784 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1785 *params = mCaps.maxGeometryShaderInvocations;
1786 break;
1787 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001788 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001789 break;
1790 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001791 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001792 break;
1793 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001794 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001795 break;
1796 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001797 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001798 break;
1799 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001800 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001801 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001802 // GLES1 emulation: Caps queries
1803 case GL_MAX_TEXTURE_UNITS:
1804 *params = mCaps.maxMultitextureUnits;
1805 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001806 case GL_MAX_MODELVIEW_STACK_DEPTH:
1807 *params = mCaps.maxModelviewMatrixStackDepth;
1808 break;
1809 case GL_MAX_PROJECTION_STACK_DEPTH:
1810 *params = mCaps.maxProjectionMatrixStackDepth;
1811 break;
1812 case GL_MAX_TEXTURE_STACK_DEPTH:
1813 *params = mCaps.maxTextureMatrixStackDepth;
1814 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001815 case GL_MAX_LIGHTS:
1816 *params = mCaps.maxLights;
1817 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001818 case GL_MAX_CLIP_PLANES:
1819 *params = mCaps.maxClipPlanes;
1820 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001821 // GLES1 emulation: Vertex attribute queries
1822 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1823 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1824 case GL_COLOR_ARRAY_BUFFER_BINDING:
1825 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1826 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1827 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1828 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1829 break;
1830 case GL_VERTEX_ARRAY_STRIDE:
1831 case GL_NORMAL_ARRAY_STRIDE:
1832 case GL_COLOR_ARRAY_STRIDE:
1833 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1834 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1835 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1836 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1837 break;
1838 case GL_VERTEX_ARRAY_SIZE:
1839 case GL_COLOR_ARRAY_SIZE:
1840 case GL_TEXTURE_COORD_ARRAY_SIZE:
1841 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1842 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1843 break;
1844 case GL_VERTEX_ARRAY_TYPE:
1845 case GL_COLOR_ARRAY_TYPE:
1846 case GL_NORMAL_ARRAY_TYPE:
1847 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1848 case GL_TEXTURE_COORD_ARRAY_TYPE:
1849 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1850 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1851 break;
1852
jchen1082af6202018-06-22 10:59:52 +08001853 // GL_KHR_parallel_shader_compile
1854 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1855 *params = mGLState.getMaxShaderCompilerThreads();
1856 break;
1857
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001858 // GL_EXT_blend_func_extended
1859 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1860 *params = mExtensions.maxDualSourceDrawBuffers;
1861 break;
1862
Jamie Madill231c7f52017-04-26 13:45:37 -04001863 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001864 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001865 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001866 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001867}
1868
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001869void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001870{
Shannon Woods53a94a82014-06-24 15:20:36 -04001871 // Queries about context capabilities and maximums are answered by Context.
1872 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001873 switch (pname)
1874 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001875 case GL_MAX_ELEMENT_INDEX:
1876 *params = mCaps.maxElementIndex;
1877 break;
1878 case GL_MAX_UNIFORM_BLOCK_SIZE:
1879 *params = mCaps.maxUniformBlockSize;
1880 break;
1881 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001882 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001883 break;
1884 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001885 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001886 break;
1887 case GL_MAX_SERVER_WAIT_TIMEOUT:
1888 *params = mCaps.maxServerWaitTimeout;
1889 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001890
Jamie Madill231c7f52017-04-26 13:45:37 -04001891 // GL_EXT_disjoint_timer_query
1892 case GL_TIMESTAMP_EXT:
1893 *params = mImplementation->getTimestamp();
1894 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001895
Jamie Madill231c7f52017-04-26 13:45:37 -04001896 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1897 *params = mCaps.maxShaderStorageBlockSize;
1898 break;
1899 default:
1900 UNREACHABLE();
1901 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001902 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001903}
1904
Geoff Lang70d0f492015-12-10 17:45:46 -05001905void Context::getPointerv(GLenum pname, void **params) const
1906{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001907 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001908}
1909
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001910void Context::getPointervRobustANGLERobust(GLenum pname,
1911 GLsizei bufSize,
1912 GLsizei *length,
1913 void **params)
1914{
1915 UNIMPLEMENTED();
1916}
1917
Martin Radev66fb8202016-07-28 11:45:20 +03001918void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001919{
Shannon Woods53a94a82014-06-24 15:20:36 -04001920 // Queries about context capabilities and maximums are answered by Context.
1921 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001922
1923 GLenum nativeType;
1924 unsigned int numParams;
1925 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1926 ASSERT(queryStatus);
1927
1928 if (nativeType == GL_INT)
1929 {
1930 switch (target)
1931 {
1932 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1933 ASSERT(index < 3u);
1934 *data = mCaps.maxComputeWorkGroupCount[index];
1935 break;
1936 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1937 ASSERT(index < 3u);
1938 *data = mCaps.maxComputeWorkGroupSize[index];
1939 break;
1940 default:
1941 mGLState.getIntegeri_v(target, index, data);
1942 }
1943 }
1944 else
1945 {
1946 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1947 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001948}
1949
Brandon Jones59770802018-04-02 13:18:42 -07001950void Context::getIntegeri_vRobust(GLenum target,
1951 GLuint index,
1952 GLsizei bufSize,
1953 GLsizei *length,
1954 GLint *data)
1955{
1956 getIntegeri_v(target, index, data);
1957}
1958
Martin Radev66fb8202016-07-28 11:45:20 +03001959void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001960{
Shannon Woods53a94a82014-06-24 15:20:36 -04001961 // Queries about context capabilities and maximums are answered by Context.
1962 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001963
1964 GLenum nativeType;
1965 unsigned int numParams;
1966 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1967 ASSERT(queryStatus);
1968
1969 if (nativeType == GL_INT_64_ANGLEX)
1970 {
1971 mGLState.getInteger64i_v(target, index, data);
1972 }
1973 else
1974 {
1975 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1976 }
1977}
1978
Brandon Jones59770802018-04-02 13:18:42 -07001979void Context::getInteger64i_vRobust(GLenum target,
1980 GLuint index,
1981 GLsizei bufSize,
1982 GLsizei *length,
1983 GLint64 *data)
1984{
1985 getInteger64i_v(target, index, data);
1986}
1987
Martin Radev66fb8202016-07-28 11:45:20 +03001988void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1989{
1990 // Queries about context capabilities and maximums are answered by Context.
1991 // Queries about current GL state values are answered by State.
1992
1993 GLenum nativeType;
1994 unsigned int numParams;
1995 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1996 ASSERT(queryStatus);
1997
1998 if (nativeType == GL_BOOL)
1999 {
2000 mGLState.getBooleani_v(target, index, data);
2001 }
2002 else
2003 {
2004 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2005 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002006}
2007
Brandon Jones59770802018-04-02 13:18:42 -07002008void Context::getBooleani_vRobust(GLenum target,
2009 GLuint index,
2010 GLsizei bufSize,
2011 GLsizei *length,
2012 GLboolean *data)
2013{
2014 getBooleani_v(target, index, data);
2015}
2016
Corentin Wallez336129f2017-10-17 15:55:40 -04002017void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002018{
2019 Buffer *buffer = mGLState.getTargetBuffer(target);
2020 QueryBufferParameteriv(buffer, pname, params);
2021}
2022
Brandon Jones59770802018-04-02 13:18:42 -07002023void Context::getBufferParameterivRobust(BufferBinding target,
2024 GLenum pname,
2025 GLsizei bufSize,
2026 GLsizei *length,
2027 GLint *params)
2028{
2029 getBufferParameteriv(target, pname, params);
2030}
2031
He Yunchao010e4db2017-03-03 14:22:06 +08002032void Context::getFramebufferAttachmentParameteriv(GLenum target,
2033 GLenum attachment,
2034 GLenum pname,
2035 GLint *params)
2036{
2037 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002038 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002039}
2040
Brandon Jones59770802018-04-02 13:18:42 -07002041void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2042 GLenum attachment,
2043 GLenum pname,
2044 GLsizei bufSize,
2045 GLsizei *length,
2046 GLint *params)
2047{
2048 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2049}
2050
He Yunchao010e4db2017-03-03 14:22:06 +08002051void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2052{
2053 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2054 QueryRenderbufferiv(this, renderbuffer, pname, params);
2055}
2056
Brandon Jones59770802018-04-02 13:18:42 -07002057void Context::getRenderbufferParameterivRobust(GLenum target,
2058 GLenum pname,
2059 GLsizei bufSize,
2060 GLsizei *length,
2061 GLint *params)
2062{
2063 getRenderbufferParameteriv(target, pname, params);
2064}
2065
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002066void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002067{
Till Rathmannb8543632018-10-02 19:46:14 +02002068 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002069 QueryTexParameterfv(texture, pname, params);
2070}
2071
Brandon Jones59770802018-04-02 13:18:42 -07002072void Context::getTexParameterfvRobust(TextureType target,
2073 GLenum pname,
2074 GLsizei bufSize,
2075 GLsizei *length,
2076 GLfloat *params)
2077{
2078 getTexParameterfv(target, pname, params);
2079}
2080
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002081void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002082{
Till Rathmannb8543632018-10-02 19:46:14 +02002083 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002084 QueryTexParameteriv(texture, pname, params);
2085}
Jiajia Qin5451d532017-11-16 17:16:34 +08002086
Till Rathmannb8543632018-10-02 19:46:14 +02002087void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2088{
2089 const Texture *const texture = getTargetTexture(target);
2090 QueryTexParameterIiv(texture, pname, params);
2091}
2092
2093void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2094{
2095 const Texture *const texture = getTargetTexture(target);
2096 QueryTexParameterIuiv(texture, pname, params);
2097}
2098
Brandon Jones59770802018-04-02 13:18:42 -07002099void Context::getTexParameterivRobust(TextureType target,
2100 GLenum pname,
2101 GLsizei bufSize,
2102 GLsizei *length,
2103 GLint *params)
2104{
2105 getTexParameteriv(target, pname, params);
2106}
2107
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002108void Context::getTexParameterIivRobust(TextureType target,
2109 GLenum pname,
2110 GLsizei bufSize,
2111 GLsizei *length,
2112 GLint *params)
2113{
2114 UNIMPLEMENTED();
2115}
2116
2117void Context::getTexParameterIuivRobust(TextureType target,
2118 GLenum pname,
2119 GLsizei bufSize,
2120 GLsizei *length,
2121 GLuint *params)
2122{
2123 UNIMPLEMENTED();
2124}
2125
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002126void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002127{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002128 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002129 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002130}
2131
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002132void Context::getTexLevelParameterivRobust(TextureTarget target,
2133 GLint level,
2134 GLenum pname,
2135 GLsizei bufSize,
2136 GLsizei *length,
2137 GLint *params)
2138{
2139 UNIMPLEMENTED();
2140}
2141
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002142void Context::getTexLevelParameterfv(TextureTarget target,
2143 GLint level,
2144 GLenum pname,
2145 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002146{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002147 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002148 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002149}
2150
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002151void Context::getTexLevelParameterfvRobust(TextureTarget target,
2152 GLint level,
2153 GLenum pname,
2154 GLsizei bufSize,
2155 GLsizei *length,
2156 GLfloat *params)
2157{
2158 UNIMPLEMENTED();
2159}
2160
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002161void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002162{
Till Rathmannb8543632018-10-02 19:46:14 +02002163 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002164 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002165 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002166}
2167
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002168void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002169{
Till Rathmannb8543632018-10-02 19:46:14 +02002170 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002171 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002172 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002173}
2174
Brandon Jones59770802018-04-02 13:18:42 -07002175void Context::texParameterfvRobust(TextureType target,
2176 GLenum pname,
2177 GLsizei bufSize,
2178 const GLfloat *params)
2179{
2180 texParameterfv(target, pname, params);
2181}
2182
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002183void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002184{
Till Rathmannb8543632018-10-02 19:46:14 +02002185 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002186 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002187 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002188}
2189
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002190void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002191{
Till Rathmannb8543632018-10-02 19:46:14 +02002192 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002193 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002194 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002195}
2196
Till Rathmannb8543632018-10-02 19:46:14 +02002197void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2198{
2199 Texture *const texture = getTargetTexture(target);
2200 SetTexParameterIiv(this, texture, pname, params);
2201 onTextureChange(texture);
2202}
2203
2204void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2205{
2206 Texture *const texture = getTargetTexture(target);
2207 SetTexParameterIuiv(this, texture, pname, params);
2208 onTextureChange(texture);
2209}
2210
Brandon Jones59770802018-04-02 13:18:42 -07002211void Context::texParameterivRobust(TextureType target,
2212 GLenum pname,
2213 GLsizei bufSize,
2214 const GLint *params)
2215{
2216 texParameteriv(target, pname, params);
2217}
2218
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002219void Context::texParameterIivRobust(TextureType target,
2220 GLenum pname,
2221 GLsizei bufSize,
2222 const GLint *params)
2223{
2224 UNIMPLEMENTED();
2225}
2226
2227void Context::texParameterIuivRobust(TextureType target,
2228 GLenum pname,
2229 GLsizei bufSize,
2230 const GLuint *params)
2231{
2232 UNIMPLEMENTED();
2233}
2234
Jamie Madill493f9572018-05-24 19:52:15 -04002235void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002236{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002237 // No-op if count draws no primitives for given mode
2238 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002239 {
2240 return;
2241 }
2242
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002243 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002244 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002245 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002246}
2247
Jamie Madill493f9572018-05-24 19:52:15 -04002248void Context::drawArraysInstanced(PrimitiveMode mode,
2249 GLint first,
2250 GLsizei count,
2251 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002252{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002253 // No-op if count draws no primitives for given mode
2254 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002255 {
2256 return;
2257 }
2258
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002259 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002260 ANGLE_CONTEXT_TRY(
2261 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002262 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2263 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002264}
2265
Jamie Madill493f9572018-05-24 19:52:15 -04002266void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002267{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002268 // No-op if count draws no primitives for given mode
2269 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002270 {
2271 return;
2272 }
2273
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002274 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002275 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002276}
2277
Jamie Madill493f9572018-05-24 19:52:15 -04002278void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002279 GLsizei count,
2280 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002281 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002282 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002283{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002284 // No-op if count draws no primitives for given mode
2285 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002286 {
2287 return;
2288 }
2289
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002290 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002291 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002292 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002293}
2294
Jamie Madill493f9572018-05-24 19:52:15 -04002295void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002296 GLuint start,
2297 GLuint end,
2298 GLsizei count,
2299 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002300 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002301{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002302 // No-op if count draws no primitives for given mode
2303 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002304 {
2305 return;
2306 }
2307
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002308 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002309 ANGLE_CONTEXT_TRY(
2310 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002311}
2312
Jamie Madill493f9572018-05-24 19:52:15 -04002313void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002314{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002315 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002316 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002317}
2318
Jamie Madill493f9572018-05-24 19:52:15 -04002319void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002320{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002321 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002322 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002323}
2324
Jamie Madill675fe712016-12-19 13:07:54 -05002325void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002326{
Jamie Madillafa02a22017-11-23 12:57:38 -05002327 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002328}
2329
Jamie Madill675fe712016-12-19 13:07:54 -05002330void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002331{
Jamie Madillafa02a22017-11-23 12:57:38 -05002332 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002333}
2334
Austin Kinross6ee1e782015-05-29 17:05:37 -07002335void Context::insertEventMarker(GLsizei length, const char *marker)
2336{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002337 ASSERT(mImplementation);
2338 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002339}
2340
2341void Context::pushGroupMarker(GLsizei length, const char *marker)
2342{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002343 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002344
2345 if (marker == nullptr)
2346 {
2347 // From the EXT_debug_marker spec,
2348 // "If <marker> is null then an empty string is pushed on the stack."
2349 mImplementation->pushGroupMarker(length, "");
2350 }
2351 else
2352 {
2353 mImplementation->pushGroupMarker(length, marker);
2354 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002355}
2356
2357void Context::popGroupMarker()
2358{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002359 ASSERT(mImplementation);
2360 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002361}
2362
Geoff Langd8605522016-04-13 10:19:12 -04002363void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2364{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002365 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002366 ASSERT(programObject);
2367
2368 programObject->bindUniformLocation(location, name);
2369}
2370
Brandon Jones59770802018-04-02 13:18:42 -07002371void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002372{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002373 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002374}
2375
Brandon Jones59770802018-04-02 13:18:42 -07002376void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002377{
2378 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2379}
2380
Brandon Jones59770802018-04-02 13:18:42 -07002381void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002382{
2383 GLfloat I[16];
2384 angle::Matrix<GLfloat>::setToIdentity(I);
2385
2386 mGLState.loadPathRenderingMatrix(matrixMode, I);
2387}
2388
2389void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2390{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002391 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002392 if (!pathObj)
2393 return;
2394
Geoff Lang9bf86f02018-07-26 11:46:34 -04002395 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002396
2397 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2398}
2399
2400void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2401{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002402 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002403 if (!pathObj)
2404 return;
2405
Geoff Lang9bf86f02018-07-26 11:46:34 -04002406 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002407
2408 mImplementation->stencilStrokePath(pathObj, reference, mask);
2409}
2410
2411void Context::coverFillPath(GLuint path, GLenum coverMode)
2412{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002413 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002414 if (!pathObj)
2415 return;
2416
Geoff Lang9bf86f02018-07-26 11:46:34 -04002417 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002418
2419 mImplementation->coverFillPath(pathObj, coverMode);
2420}
2421
2422void Context::coverStrokePath(GLuint path, GLenum coverMode)
2423{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002424 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002425 if (!pathObj)
2426 return;
2427
Geoff Lang9bf86f02018-07-26 11:46:34 -04002428 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002429
2430 mImplementation->coverStrokePath(pathObj, coverMode);
2431}
2432
2433void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2434{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002435 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002436 if (!pathObj)
2437 return;
2438
Geoff Lang9bf86f02018-07-26 11:46:34 -04002439 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002440
2441 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2442}
2443
2444void Context::stencilThenCoverStrokePath(GLuint path,
2445 GLint reference,
2446 GLuint mask,
2447 GLenum coverMode)
2448{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002449 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002450 if (!pathObj)
2451 return;
2452
Geoff Lang9bf86f02018-07-26 11:46:34 -04002453 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002454
2455 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2456}
2457
Sami Väisänend59ca052016-06-21 16:10:00 +03002458void Context::coverFillPathInstanced(GLsizei numPaths,
2459 GLenum pathNameType,
2460 const void *paths,
2461 GLuint pathBase,
2462 GLenum coverMode,
2463 GLenum transformType,
2464 const GLfloat *transformValues)
2465{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002466 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002467
Geoff Lang9bf86f02018-07-26 11:46:34 -04002468 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002469
2470 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2471}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002472
Sami Väisänend59ca052016-06-21 16:10:00 +03002473void Context::coverStrokePathInstanced(GLsizei numPaths,
2474 GLenum pathNameType,
2475 const void *paths,
2476 GLuint pathBase,
2477 GLenum coverMode,
2478 GLenum transformType,
2479 const GLfloat *transformValues)
2480{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002481 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002482
2483 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002484 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002485
2486 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2487 transformValues);
2488}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002489
Sami Väisänend59ca052016-06-21 16:10:00 +03002490void Context::stencilFillPathInstanced(GLsizei numPaths,
2491 GLenum pathNameType,
2492 const void *paths,
2493 GLuint pathBase,
2494 GLenum fillMode,
2495 GLuint mask,
2496 GLenum transformType,
2497 const GLfloat *transformValues)
2498{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002499 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002500
2501 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002502 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002503
2504 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2505 transformValues);
2506}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002507
Sami Väisänend59ca052016-06-21 16:10:00 +03002508void Context::stencilStrokePathInstanced(GLsizei numPaths,
2509 GLenum pathNameType,
2510 const void *paths,
2511 GLuint pathBase,
2512 GLint reference,
2513 GLuint mask,
2514 GLenum transformType,
2515 const GLfloat *transformValues)
2516{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002517 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002518
Geoff Lang9bf86f02018-07-26 11:46:34 -04002519 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002520
2521 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2522 transformValues);
2523}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002524
Sami Väisänend59ca052016-06-21 16:10:00 +03002525void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2526 GLenum pathNameType,
2527 const void *paths,
2528 GLuint pathBase,
2529 GLenum fillMode,
2530 GLuint mask,
2531 GLenum coverMode,
2532 GLenum transformType,
2533 const GLfloat *transformValues)
2534{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002535 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002536
Geoff Lang9bf86f02018-07-26 11:46:34 -04002537 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002538
2539 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2540 transformType, transformValues);
2541}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002542
Sami Väisänend59ca052016-06-21 16:10:00 +03002543void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2544 GLenum pathNameType,
2545 const void *paths,
2546 GLuint pathBase,
2547 GLint reference,
2548 GLuint mask,
2549 GLenum coverMode,
2550 GLenum transformType,
2551 const GLfloat *transformValues)
2552{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002553 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002554
Geoff Lang9bf86f02018-07-26 11:46:34 -04002555 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002556
2557 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2558 transformType, transformValues);
2559}
2560
Sami Väisänen46eaa942016-06-29 10:26:37 +03002561void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2562{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002563 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002564
2565 programObject->bindFragmentInputLocation(location, name);
2566}
2567
2568void Context::programPathFragmentInputGen(GLuint program,
2569 GLint location,
2570 GLenum genMode,
2571 GLint components,
2572 const GLfloat *coeffs)
2573{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002574 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002575
jchen103fd614d2018-08-13 12:21:58 +08002576 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002577}
2578
jchen1015015f72017-03-16 13:54:21 +08002579GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2580{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002581 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002582 return QueryProgramResourceIndex(programObject, programInterface, name);
2583}
2584
jchen10fd7c3b52017-03-21 15:36:03 +08002585void Context::getProgramResourceName(GLuint program,
2586 GLenum programInterface,
2587 GLuint index,
2588 GLsizei bufSize,
2589 GLsizei *length,
2590 GLchar *name)
2591{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002592 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002593 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2594}
2595
jchen10191381f2017-04-11 13:59:04 +08002596GLint Context::getProgramResourceLocation(GLuint program,
2597 GLenum programInterface,
2598 const GLchar *name)
2599{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002600 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002601 return QueryProgramResourceLocation(programObject, programInterface, name);
2602}
2603
jchen10880683b2017-04-12 16:21:55 +08002604void Context::getProgramResourceiv(GLuint program,
2605 GLenum programInterface,
2606 GLuint index,
2607 GLsizei propCount,
2608 const GLenum *props,
2609 GLsizei bufSize,
2610 GLsizei *length,
2611 GLint *params)
2612{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002613 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002614 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2615 length, params);
2616}
2617
jchen10d9cd7b72017-08-30 15:04:25 +08002618void Context::getProgramInterfaceiv(GLuint program,
2619 GLenum programInterface,
2620 GLenum pname,
2621 GLint *params)
2622{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002623 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002624 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2625}
2626
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002627void Context::getProgramInterfaceivRobust(GLuint program,
2628 GLenum programInterface,
2629 GLenum pname,
2630 GLsizei bufSize,
2631 GLsizei *length,
2632 GLint *params)
2633{
2634 UNIMPLEMENTED();
2635}
2636
Jamie Madill306b6c12018-07-27 08:12:49 -04002637void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002638{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002639 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002640}
2641
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002642void Context::handleError(GLenum errorCode,
2643 const char *message,
2644 const char *file,
2645 const char *function,
2646 unsigned int line)
2647{
2648 mErrors.handleError(errorCode, message, file, function, line);
2649}
2650
Jamie Madilla139f012018-10-10 16:13:03 -04002651void Context::validationError(GLenum errorCode, const char *message)
2652{
2653 mErrors.validationError(errorCode, message);
2654}
2655
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002656// Get one of the recorded errors and clear its flag, if any.
2657// [OpenGL ES 2.0.24] section 2.5 page 13.
2658GLenum Context::getError()
2659{
Geoff Langda5777c2014-07-11 09:52:58 -04002660 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002661 {
Geoff Langda5777c2014-07-11 09:52:58 -04002662 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002663 }
Geoff Langda5777c2014-07-11 09:52:58 -04002664 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002665 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002666 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002667 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002668}
2669
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002670// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002671void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002672{
2673 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002674 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002675 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002676 mContextLostForced = true;
2677 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002678 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002679}
2680
Jamie Madillfa920eb2018-01-04 11:45:50 -05002681GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002682{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002683 // Even if the application doesn't want to know about resets, we want to know
2684 // as it will allow us to skip all the calls.
2685 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002686 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002687 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002688 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002689 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002690 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002691
2692 // EXT_robustness, section 2.6: If the reset notification behavior is
2693 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2694 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2695 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002696 }
2697
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002698 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2699 // status should be returned at least once, and GL_NO_ERROR should be returned
2700 // once the device has finished resetting.
2701 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002702 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002703 ASSERT(mResetStatus == GL_NO_ERROR);
2704 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002705
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002706 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002707 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002708 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002709 }
2710 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002711 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002712 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002713 // If markContextLost was used to mark the context lost then
2714 // assume that is not recoverable, and continue to report the
2715 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002716 mResetStatus = mImplementation->getResetStatus();
2717 }
Jamie Madill893ab082014-05-16 16:56:10 -04002718
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002719 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002720}
2721
2722bool Context::isResetNotificationEnabled()
2723{
2724 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2725}
2726
Corentin Walleze3b10e82015-05-20 11:06:25 -04002727const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002728{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002729 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002730}
2731
2732EGLenum Context::getClientType() const
2733{
2734 return mClientType;
2735}
2736
2737EGLenum Context::getRenderBuffer() const
2738{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002739 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2740 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002741 {
2742 return EGL_NONE;
2743 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002744
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002745 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002746 ASSERT(backAttachment != nullptr);
2747 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002748}
2749
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002750VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002751{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002752 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002753 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2754 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002755 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002756 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2757 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002758
Jamie Madill96a483b2017-06-27 16:49:21 -04002759 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002760 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002761
2762 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002763}
2764
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002765TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002766{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002767 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002768 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2769 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002770 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002771 transformFeedback =
2772 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002773 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002774 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002775 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002776
2777 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002778}
2779
2780bool Context::isVertexArrayGenerated(GLuint vertexArray)
2781{
Jamie Madill96a483b2017-06-27 16:49:21 -04002782 ASSERT(mVertexArrayMap.contains(0));
2783 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002784}
2785
2786bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2787{
Jamie Madill96a483b2017-06-27 16:49:21 -04002788 ASSERT(mTransformFeedbackMap.contains(0));
2789 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002790}
2791
Shannon Woods53a94a82014-06-24 15:20:36 -04002792void Context::detachTexture(GLuint texture)
2793{
2794 // Simple pass-through to State's detachTexture method, as textures do not require
2795 // allocation map management either here or in the resource manager at detach time.
2796 // Zero textures are held by the Context, and we don't attempt to request them from
2797 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002798 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002799}
2800
James Darpinian4d9d4832018-03-13 12:43:28 -07002801void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002802{
Yuly Novikov5807a532015-12-03 13:01:22 -05002803 // Simple pass-through to State's detachBuffer method, since
2804 // only buffer attachments to container objects that are bound to the current context
2805 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002806
Yuly Novikov5807a532015-12-03 13:01:22 -05002807 // [OpenGL ES 3.2] section 5.1.2 page 45:
2808 // Attachments to unbound container objects, such as
2809 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2810 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002811 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002812}
2813
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002814void Context::detachFramebuffer(GLuint framebuffer)
2815{
Shannon Woods53a94a82014-06-24 15:20:36 -04002816 // Framebuffer detachment is handled by Context, because 0 is a valid
2817 // Framebuffer object, and a pointer to it must be passed from Context
2818 // to State at binding time.
2819
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002820 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002821 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2822 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2823 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002824
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002825 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002826 {
2827 bindReadFramebuffer(0);
2828 }
2829
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002830 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002831 {
2832 bindDrawFramebuffer(0);
2833 }
2834}
2835
2836void Context::detachRenderbuffer(GLuint renderbuffer)
2837{
Jamie Madilla02315b2017-02-23 14:14:47 -05002838 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002839}
2840
Jamie Madill57a89722013-07-02 11:57:03 -04002841void Context::detachVertexArray(GLuint vertexArray)
2842{
Jamie Madill77a72f62015-04-14 11:18:32 -04002843 // Vertex array detachment is handled by Context, because 0 is a valid
2844 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002845 // binding time.
2846
Jamie Madill57a89722013-07-02 11:57:03 -04002847 // [OpenGL ES 3.0.2] section 2.10 page 43:
2848 // If a vertex array object that is currently bound is deleted, the binding
2849 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002850 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002851 {
2852 bindVertexArray(0);
2853 }
2854}
2855
Geoff Langc8058452014-02-03 12:04:11 -05002856void Context::detachTransformFeedback(GLuint transformFeedback)
2857{
Corentin Walleza2257da2016-04-19 16:43:12 -04002858 // Transform feedback detachment is handled by Context, because 0 is a valid
2859 // transform feedback, and a pointer to it must be passed from Context to State at
2860 // binding time.
2861
2862 // The OpenGL specification doesn't mention what should happen when the currently bound
2863 // transform feedback object is deleted. Since it is a container object, we treat it like
2864 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002865 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002866 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002867 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002868 }
Geoff Langc8058452014-02-03 12:04:11 -05002869}
2870
Jamie Madilldc356042013-07-19 16:36:57 -04002871void Context::detachSampler(GLuint sampler)
2872{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002873 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002874}
2875
Yunchao Hea336b902017-08-02 16:05:21 +08002876void Context::detachProgramPipeline(GLuint pipeline)
2877{
2878 mGLState.detachProgramPipeline(this, pipeline);
2879}
2880
Jamie Madill3ef140a2017-08-26 23:11:21 -04002881void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002882{
Shaodde78e82017-05-22 14:13:27 +08002883 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002884 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002885}
2886
Jamie Madille29d1672013-07-19 16:36:57 -04002887void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2888{
Till Rathmannb8543632018-10-02 19:46:14 +02002889 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002890 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002891 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002892}
Jamie Madille29d1672013-07-19 16:36:57 -04002893
Geoff Langc1984ed2016-10-07 12:41:00 -04002894void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2895{
Till Rathmannb8543632018-10-02 19:46:14 +02002896 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002897 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002898 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002899}
2900
Till Rathmannb8543632018-10-02 19:46:14 +02002901void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2902{
2903 Sampler *const samplerObject =
2904 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2905 SetSamplerParameterIiv(this, samplerObject, pname, param);
2906}
2907
2908void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2909{
2910 Sampler *const samplerObject =
2911 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2912 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2913}
2914
Brandon Jones59770802018-04-02 13:18:42 -07002915void Context::samplerParameterivRobust(GLuint sampler,
2916 GLenum pname,
2917 GLsizei bufSize,
2918 const GLint *param)
2919{
2920 samplerParameteriv(sampler, pname, param);
2921}
2922
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002923void Context::samplerParameterIivRobust(GLuint sampler,
2924 GLenum pname,
2925 GLsizei bufSize,
2926 const GLint *param)
2927{
2928 UNIMPLEMENTED();
2929}
2930
2931void Context::samplerParameterIuivRobust(GLuint sampler,
2932 GLenum pname,
2933 GLsizei bufSize,
2934 const GLuint *param)
2935{
2936 UNIMPLEMENTED();
2937}
2938
Jamie Madille29d1672013-07-19 16:36:57 -04002939void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2940{
Till Rathmannb8543632018-10-02 19:46:14 +02002941 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002942 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002943 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002944}
2945
Geoff Langc1984ed2016-10-07 12:41:00 -04002946void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002947{
Till Rathmannb8543632018-10-02 19:46:14 +02002948 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002949 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002950 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002951}
2952
Brandon Jones59770802018-04-02 13:18:42 -07002953void Context::samplerParameterfvRobust(GLuint sampler,
2954 GLenum pname,
2955 GLsizei bufSize,
2956 const GLfloat *param)
2957{
2958 samplerParameterfv(sampler, pname, param);
2959}
2960
Geoff Langc1984ed2016-10-07 12:41:00 -04002961void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002962{
Till Rathmannb8543632018-10-02 19:46:14 +02002963 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002964 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002965 QuerySamplerParameteriv(samplerObject, pname, params);
2966}
Jamie Madill9675b802013-07-19 16:36:59 -04002967
Till Rathmannb8543632018-10-02 19:46:14 +02002968void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2969{
2970 const Sampler *const samplerObject =
2971 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2972 QuerySamplerParameterIiv(samplerObject, pname, params);
2973}
2974
2975void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2976{
2977 const Sampler *const samplerObject =
2978 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2979 QuerySamplerParameterIuiv(samplerObject, pname, params);
2980}
2981
Brandon Jones59770802018-04-02 13:18:42 -07002982void Context::getSamplerParameterivRobust(GLuint sampler,
2983 GLenum pname,
2984 GLsizei bufSize,
2985 GLsizei *length,
2986 GLint *params)
2987{
2988 getSamplerParameteriv(sampler, pname, params);
2989}
2990
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002991void Context::getSamplerParameterIivRobust(GLuint sampler,
2992 GLenum pname,
2993 GLsizei bufSize,
2994 GLsizei *length,
2995 GLint *params)
2996{
2997 UNIMPLEMENTED();
2998}
2999
3000void Context::getSamplerParameterIuivRobust(GLuint sampler,
3001 GLenum pname,
3002 GLsizei bufSize,
3003 GLsizei *length,
3004 GLuint *params)
3005{
3006 UNIMPLEMENTED();
3007}
3008
Geoff Langc1984ed2016-10-07 12:41:00 -04003009void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
3010{
Till Rathmannb8543632018-10-02 19:46:14 +02003011 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05003012 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04003013 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04003014}
3015
Brandon Jones59770802018-04-02 13:18:42 -07003016void Context::getSamplerParameterfvRobust(GLuint sampler,
3017 GLenum pname,
3018 GLsizei bufSize,
3019 GLsizei *length,
3020 GLfloat *params)
3021{
3022 getSamplerParameterfv(sampler, pname, params);
3023}
3024
Olli Etuahof0fee072016-03-30 15:11:58 +03003025void Context::programParameteri(GLuint program, GLenum pname, GLint value)
3026{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04003027 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08003028 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03003029}
3030
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003031void Context::initRendererString()
3032{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003033 std::ostringstream rendererString;
3034 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003035 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003036 rendererString << ")";
3037
Geoff Langcec35902014-04-16 10:52:36 -04003038 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003039}
3040
Geoff Langc339c4e2016-11-29 10:37:36 -05003041void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003042{
Geoff Langc339c4e2016-11-29 10:37:36 -05003043 const Version &clientVersion = getClientVersion();
3044
3045 std::ostringstream versionString;
3046 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3047 << ANGLE_VERSION_STRING << ")";
3048 mVersionString = MakeStaticString(versionString.str());
3049
3050 std::ostringstream shadingLanguageVersionString;
3051 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3052 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3053 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3054 << ")";
3055 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003056}
3057
Geoff Langcec35902014-04-16 10:52:36 -04003058void Context::initExtensionStrings()
3059{
Geoff Langc339c4e2016-11-29 10:37:36 -05003060 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3061 std::ostringstream combinedStringStream;
3062 std::copy(strings.begin(), strings.end(),
3063 std::ostream_iterator<const char *>(combinedStringStream, " "));
3064 return MakeStaticString(combinedStringStream.str());
3065 };
3066
3067 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003068 for (const auto &extensionString : mExtensions.getStrings())
3069 {
3070 mExtensionStrings.push_back(MakeStaticString(extensionString));
3071 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003072 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003073
Geoff Langc339c4e2016-11-29 10:37:36 -05003074 mRequestableExtensionStrings.clear();
3075 for (const auto &extensionInfo : GetExtensionInfoMap())
3076 {
3077 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003078 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003079 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003080 {
3081 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3082 }
3083 }
3084 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003085}
3086
Geoff Langc339c4e2016-11-29 10:37:36 -05003087const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003088{
Geoff Langc339c4e2016-11-29 10:37:36 -05003089 switch (name)
3090 {
3091 case GL_VENDOR:
3092 return reinterpret_cast<const GLubyte *>("Google Inc.");
3093
3094 case GL_RENDERER:
3095 return reinterpret_cast<const GLubyte *>(mRendererString);
3096
3097 case GL_VERSION:
3098 return reinterpret_cast<const GLubyte *>(mVersionString);
3099
3100 case GL_SHADING_LANGUAGE_VERSION:
3101 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3102
3103 case GL_EXTENSIONS:
3104 return reinterpret_cast<const GLubyte *>(mExtensionString);
3105
3106 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3107 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3108
3109 default:
3110 UNREACHABLE();
3111 return nullptr;
3112 }
Geoff Langcec35902014-04-16 10:52:36 -04003113}
3114
Geoff Langc339c4e2016-11-29 10:37:36 -05003115const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003116{
Geoff Langc339c4e2016-11-29 10:37:36 -05003117 switch (name)
3118 {
3119 case GL_EXTENSIONS:
3120 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3121
3122 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3123 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3124
3125 default:
3126 UNREACHABLE();
3127 return nullptr;
3128 }
Geoff Langcec35902014-04-16 10:52:36 -04003129}
3130
3131size_t Context::getExtensionStringCount() const
3132{
3133 return mExtensionStrings.size();
3134}
3135
Geoff Lang111a99e2017-10-17 10:58:41 -04003136bool Context::isExtensionRequestable(const char *name)
3137{
3138 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3139 auto extension = extensionInfos.find(name);
3140
Geoff Lang111a99e2017-10-17 10:58:41 -04003141 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003142 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003143}
3144
Geoff Langc339c4e2016-11-29 10:37:36 -05003145void Context::requestExtension(const char *name)
3146{
3147 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3148 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3149 const auto &extension = extensionInfos.at(name);
3150 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003151 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003152
3153 if (mExtensions.*(extension.ExtensionsMember))
3154 {
3155 // Extension already enabled
3156 return;
3157 }
3158
3159 mExtensions.*(extension.ExtensionsMember) = true;
3160 updateCaps();
3161 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003162
Jamie Madill2f348d22017-06-05 10:50:59 -04003163 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3164 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003165
Jamie Madill81c2e252017-09-09 23:32:46 -04003166 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3167 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003168 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003169 for (auto &zeroTexture : mZeroTextures)
3170 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003171 if (zeroTexture.get() != nullptr)
3172 {
3173 zeroTexture->signalDirty(this, InitState::Initialized);
3174 }
Geoff Lang9aded172017-04-05 11:07:56 -04003175 }
3176
Jamie Madillb983a4b2018-08-01 11:34:51 -04003177 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003178}
3179
3180size_t Context::getRequestableExtensionStringCount() const
3181{
3182 return mRequestableExtensionStrings.size();
3183}
3184
Jamie Madill493f9572018-05-24 19:52:15 -04003185void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003186{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003187 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003188 ASSERT(transformFeedback != nullptr);
3189 ASSERT(!transformFeedback->isPaused());
3190
Jamie Madill6c1f6712017-02-14 19:08:04 -05003191 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003192 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003193}
3194
3195bool Context::hasActiveTransformFeedback(GLuint program) const
3196{
3197 for (auto pair : mTransformFeedbackMap)
3198 {
3199 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3200 {
3201 return true;
3202 }
3203 }
3204 return false;
3205}
3206
Geoff Lang33f11fb2018-05-07 13:42:47 -04003207Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003208{
3209 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3210
jchen1082af6202018-06-22 10:59:52 +08003211 // Explicitly enable GL_KHR_parallel_shader_compile
3212 supportedExtensions.parallelShaderCompile = true;
3213
Geoff Langb0f917f2017-12-05 13:41:54 -05003214 if (getClientVersion() < ES_2_0)
3215 {
3216 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003217 supportedExtensions.pointSizeArray = true;
3218 supportedExtensions.textureCubeMap = true;
3219 supportedExtensions.pointSprite = true;
3220 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003221 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003222 }
3223
3224 if (getClientVersion() < ES_3_0)
3225 {
3226 // Disable ES3+ extensions
3227 supportedExtensions.colorBufferFloat = false;
3228 supportedExtensions.eglImageExternalEssl3 = false;
3229 supportedExtensions.textureNorm16 = false;
3230 supportedExtensions.multiview = false;
3231 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003232 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003233 supportedExtensions.textureMultisample = false;
Geoff Lang7198ebc2018-11-22 14:36:06 -05003234
3235 // Don't expose GL_EXT_texture_sRGB_decode without sRGB texture support
3236 if (!supportedExtensions.sRGB)
3237 {
3238 supportedExtensions.textureSRGBDecode = false;
3239 }
Geoff Langb0f917f2017-12-05 13:41:54 -05003240 }
3241
3242 if (getClientVersion() < ES_3_1)
3243 {
3244 // Disable ES3.1+ extensions
3245 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003246
3247 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3248 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003249 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003250 }
3251
3252 if (getClientVersion() > ES_2_0)
3253 {
3254 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3255 // supportedExtensions.sRGB = false;
3256 }
3257
3258 // Some extensions are always available because they are implemented in the GL layer.
3259 supportedExtensions.bindUniformLocation = true;
3260 supportedExtensions.vertexArrayObject = true;
3261 supportedExtensions.bindGeneratesResource = true;
3262 supportedExtensions.clientArrays = true;
3263 supportedExtensions.requestExtension = true;
Austin Eng7cf9cd22018-10-09 15:27:32 -07003264 supportedExtensions.multiDraw = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003265
3266 // Enable the no error extension if the context was created with the flag.
3267 supportedExtensions.noError = mSkipValidation;
3268
3269 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003270 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003271
3272 // Explicitly enable GL_KHR_debug
3273 supportedExtensions.debug = true;
3274 supportedExtensions.maxDebugMessageLength = 1024;
3275 supportedExtensions.maxDebugLoggedMessages = 1024;
3276 supportedExtensions.maxDebugGroupStackDepth = 1024;
3277 supportedExtensions.maxLabelLength = 1024;
3278
3279 // Explicitly enable GL_ANGLE_robust_client_memory
3280 supportedExtensions.robustClientMemory = true;
3281
3282 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003283 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003284
3285 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3286 // supports it.
3287 supportedExtensions.robustBufferAccessBehavior =
3288 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3289
3290 // Enable the cache control query unconditionally.
3291 supportedExtensions.programCacheControl = true;
3292
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003293 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003294 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003295 {
3296 // GL_ANGLE_explicit_context_gles1
3297 supportedExtensions.explicitContextGles1 = true;
3298 // GL_ANGLE_explicit_context
3299 supportedExtensions.explicitContext = true;
3300 }
3301
Geoff Lang79b91402018-10-04 15:11:30 -04003302 supportedExtensions.memorySize = true;
3303
Geoff Langb0f917f2017-12-05 13:41:54 -05003304 return supportedExtensions;
3305}
3306
Geoff Lang33f11fb2018-05-07 13:42:47 -04003307void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003308{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003309 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003310
Geoff Lang33f11fb2018-05-07 13:42:47 -04003311 mSupportedExtensions = generateSupportedExtensions();
3312 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003313
3314 mLimitations = mImplementation->getNativeLimitations();
3315
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003316 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3317 if (getClientVersion() < Version(2, 0))
3318 {
3319 mCaps.maxMultitextureUnits = 4;
3320 mCaps.maxClipPlanes = 6;
3321 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003322 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3323 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3324 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003325 mCaps.minSmoothPointSize = 1.0f;
3326 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003327 mCaps.minSmoothLineWidth = 1.0f;
3328 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003329 }
3330
Luc Ferronad2ae932018-06-11 15:31:17 -04003331 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003332 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003333
Luc Ferronad2ae932018-06-11 15:31:17 -04003334 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3335
Jamie Madill0f80ed82017-09-19 00:24:56 -04003336 if (getClientVersion() < ES_3_1)
3337 {
3338 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3339 }
3340 else
3341 {
3342 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3343 }
Geoff Lang301d1612014-07-09 10:34:37 -04003344
Jiawei Shao54aafe52018-04-27 14:54:57 +08003345 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3346 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003347 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3348
Jamie Madill0f80ed82017-09-19 00:24:56 -04003349 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3350 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3351
3352 // Limit textures as well, so we can use fast bitsets with texture bindings.
3353 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003354 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3355 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3356 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3357 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003358
Jiawei Shaodb342272017-09-27 10:21:45 +08003359 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3360
Geoff Langc287ea62016-09-16 14:46:51 -04003361 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003362 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003363 for (const auto &extensionInfo : GetExtensionInfoMap())
3364 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003365 // If the user has requested that extensions start disabled and they are requestable,
3366 // disable them.
3367 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003368 {
3369 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3370 }
3371 }
3372
3373 // Generate texture caps
3374 updateCaps();
3375}
3376
3377void Context::updateCaps()
3378{
Geoff Lang900013c2014-07-07 11:32:19 -04003379 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003380 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003381
Jamie Madill7b62cf92017-11-02 15:20:49 -04003382 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003383 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003384 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003385 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003386
Geoff Lang0d8b7242015-09-09 14:56:53 -04003387 // Update the format caps based on the client version and extensions.
3388 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3389 // ES3.
3390 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003391 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003392 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003393 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003394 formatCaps.textureAttachment =
3395 formatCaps.textureAttachment &&
3396 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3397 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3398 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003399
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003400 // OpenGL ES does not support multisampling with non-rendererable formats
3401 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003402 if (!formatCaps.renderbuffer ||
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003403 (getClientVersion() < ES_3_1 && !mSupportedExtensions.textureMultisample &&
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003404 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003405 {
Geoff Langd87878e2014-09-19 15:42:59 -04003406 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003407 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003408 else
3409 {
3410 // We may have limited the max samples for some required renderbuffer formats due to
3411 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3412 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3413
3414 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3415 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3416 // exception of signed and unsigned integer formats."
3417 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3418 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3419 {
3420 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3421 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3422 }
3423
3424 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003425 if (getClientVersion() >= ES_3_1 || mSupportedExtensions.textureMultisample)
Olli Etuaho50c562d2017-06-06 14:43:30 +03003426 {
3427 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3428 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3429 // the exception that the signed and unsigned integer formats are required only to
3430 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3431 // multisamples, which must be at least one."
3432 if (formatInfo.componentType == GL_INT ||
3433 formatInfo.componentType == GL_UNSIGNED_INT)
3434 {
3435 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3436 }
3437
3438 // GLES 3.1 section 19.3.1.
3439 if (formatCaps.texturable)
3440 {
3441 if (formatInfo.depthBits > 0)
3442 {
3443 mCaps.maxDepthTextureSamples =
3444 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3445 }
3446 else if (formatInfo.redBits > 0)
3447 {
3448 mCaps.maxColorTextureSamples =
3449 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3450 }
3451 }
3452 }
3453 }
Geoff Langd87878e2014-09-19 15:42:59 -04003454
3455 if (formatCaps.texturable && formatInfo.compressed)
3456 {
Geoff Langca271392017-04-05 12:30:00 -04003457 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003458 }
3459
Geoff Langca271392017-04-05 12:30:00 -04003460 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003461 }
Jamie Madill32447362017-06-28 14:53:52 -04003462
3463 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003464 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003465 {
3466 mMemoryProgramCache = nullptr;
3467 }
Corentin Walleze4477002017-12-01 14:39:58 -05003468
3469 // Compute which buffer types are allowed
3470 mValidBufferBindings.reset();
3471 mValidBufferBindings.set(BufferBinding::ElementArray);
3472 mValidBufferBindings.set(BufferBinding::Array);
3473
3474 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3475 {
3476 mValidBufferBindings.set(BufferBinding::PixelPack);
3477 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3478 }
3479
3480 if (getClientVersion() >= ES_3_0)
3481 {
3482 mValidBufferBindings.set(BufferBinding::CopyRead);
3483 mValidBufferBindings.set(BufferBinding::CopyWrite);
3484 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3485 mValidBufferBindings.set(BufferBinding::Uniform);
3486 }
3487
3488 if (getClientVersion() >= ES_3_1)
3489 {
3490 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3491 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3492 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3493 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3494 }
jchen107ae70d82018-07-06 13:47:01 +08003495
3496 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003497
3498 // Reinitialize state cache after extension changes.
3499 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003500}
3501
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003502void Context::initWorkarounds()
3503{
Jamie Madill761b02c2017-06-23 16:27:06 -04003504 // Apply back-end workarounds.
3505 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3506
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003507 // Lose the context upon out of memory error if the application is
3508 // expecting to watch for those events.
3509 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003510
3511 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3512 {
3513 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3514 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3515 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3516 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003517}
3518
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003519// Return true if the draw is a no-op, else return false.
3520// A no-op draw occurs if the count of vertices is less than the minimum required to
3521// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3522bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3523{
3524 return count < kMinimumPrimitiveCounts[mode];
3525}
3526
3527bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3528{
3529 return (instanceCount == 0) || noopDraw(mode, count);
3530}
3531
Jamie Madill6f755b22018-10-09 12:48:54 -04003532angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003533{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003534 if (mGLES1Renderer)
3535 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003536 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003537 }
3538
Geoff Lang9bf86f02018-07-26 11:46:34 -04003539 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003540
3541 if (isRobustResourceInitEnabled())
3542 {
3543 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3544 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3545 }
3546
Jamie Madill9e63a812018-11-16 12:30:04 +00003547 ANGLE_TRY(syncDirtyBits());
3548 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003549}
3550
Jamie Madill526392d2018-11-16 09:35:14 -05003551angle::Result Context::prepareForClear(GLbitfield mask)
Geoff Langd4fff502017-09-22 11:28:28 -04003552{
Geoff Langa8cb2872018-03-09 16:09:40 -05003553 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003554 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003555 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill526392d2018-11-16 09:35:14 -05003556 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003557}
3558
Jamie Madill526392d2018-11-16 09:35:14 -05003559angle::Result Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
Geoff Langd4fff502017-09-22 11:28:28 -04003560{
Geoff Langa8cb2872018-03-09 16:09:40 -05003561 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003562 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3563 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003564 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill526392d2018-11-16 09:35:14 -05003565 return angle::Result::Continue();
Jamie Madill05b35b22017-10-03 09:01:44 -04003566}
3567
Jamie Madill526392d2018-11-16 09:35:14 -05003568angle::Result Context::syncState(const State::DirtyBits &bitMask,
3569 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));
Jamie Madill526392d2018-11-16 09:35:14 -05003573 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003574}
3575
Jamie Madill9e63a812018-11-16 12:30:04 +00003576angle::Result Context::syncDirtyBits()
3577{
3578 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
3579 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
3580 mGLState.clearDirtyBits();
3581 return angle::Result::Continue();
3582}
3583
3584angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
3585{
3586 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
3587 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
3588 mGLState.clearDirtyBits(dirtyBits);
3589 return angle::Result::Continue();
3590}
3591
3592angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
3593{
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 Madill526392d2018-11-16 09:35:14 -05004555angle::Result 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 Madill526392d2018-11-16 09:35:14 -05004560angle::Result 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 Madill526392d2018-11-16 09:35:14 -05004565angle::Result 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
Jamie Madill526392d2018-11-16 09:35:14 -05004570angle::Result Context::syncStateForPathOperation()
Geoff Lang9bf86f02018-07-26 11:46:34 -04004571{
4572 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4573
4574 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4575 ANGLE_TRY(syncDirtyBits());
4576
Jamie Madill526392d2018-11-16 09:35:14 -05004577 return angle::Result::Continue();
Geoff Lang9bf86f02018-07-26 11:46:34 -04004578}
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
Jamie Madill526392d2018-11-16 09:35:14 -05005353angle::Result Context::prepareForDispatch()
Xinghua Cao10a4d432017-11-28 14:46:26 +08005354{
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