blob: 7af3e6693a48048464ca91766af221387e87dbdb [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000011
Jamie Madill231c7f52017-04-26 13:45:37 -040012#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050013#include <iterator>
14#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030015#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050016
Tobin Ehlisd7890bc2018-06-29 11:57:22 -060017#include "common/PackedEnums.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030018#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040019#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050020#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050021#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050022#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050023#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040024#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050025#include "libANGLE/Fence.h"
26#include "libANGLE/Framebuffer.h"
27#include "libANGLE/FramebufferAttachment.h"
Lingfeng Yang461b09a2018-04-23 09:02:09 -070028#include "libANGLE/GLES1Renderer.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030029#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080031#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050033#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/ResourceManager.h"
35#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050036#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050037#include "libANGLE/Texture.h"
38#include "libANGLE/TransformFeedback.h"
39#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070040#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040041#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030042#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040043#include "libANGLE/queryutils.h"
Jamie Madill6d32cef2018-08-14 02:34:28 -040044#include "libANGLE/renderer/BufferImpl.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/renderer/ContextImpl.h"
46#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040047#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040048#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000049
Geoff Langf6db0982015-08-25 13:04:00 -040050namespace
51{
52
Jamie Madillb6664922017-07-25 12:55:04 -040053#define ANGLE_HANDLE_ERR(X) \
54 handleError(X); \
55 return;
56#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
57
Ian Ewell3ffd78b2016-01-22 16:09:42 -050058template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050059std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030060 GLsizei numPaths,
61 const void *paths,
62 GLuint pathBase)
63{
64 std::vector<gl::Path *> ret;
65 ret.reserve(numPaths);
66
67 const auto *nameArray = static_cast<const T *>(paths);
68
69 for (GLsizei i = 0; i < numPaths; ++i)
70 {
71 const GLuint pathName = nameArray[i] + pathBase;
72
73 ret.push_back(resourceManager.getPath(pathName));
74 }
75
76 return ret;
77}
78
Geoff Lang4ddf5af2016-12-01 14:30:44 -050079std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030080 GLsizei numPaths,
81 GLenum pathNameType,
82 const void *paths,
83 GLuint pathBase)
84{
85 switch (pathNameType)
86 {
87 case GL_UNSIGNED_BYTE:
88 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_BYTE:
91 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_UNSIGNED_SHORT:
94 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_SHORT:
97 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_UNSIGNED_INT:
100 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
101
102 case GL_INT:
103 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
104 }
105
106 UNREACHABLE();
107 return std::vector<gl::Path *>();
108}
109
110template <typename T>
Jamie Madill666818e2018-11-14 09:54:33 -0500111angle::Result GetQueryObjectParameter(const gl::Context *context,
112 gl::Query *query,
113 GLenum pname,
114 T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500115{
Geoff Lang2186c382016-10-14 10:54:54 -0400116 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500117
118 switch (pname)
119 {
120 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400121 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500122 case GL_QUERY_RESULT_AVAILABLE_EXT:
123 {
124 bool available;
Jamie Madill666818e2018-11-14 09:54:33 -0500125 ANGLE_TRY(query->isResultAvailable(context, &available));
126 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
127 return angle::Result::Continue();
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500128 }
129 default:
130 UNREACHABLE();
Jamie Madill666818e2018-11-14 09:54:33 -0500131 return angle::Result::Stop();
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500132 }
133}
134
Jamie Madill956ab4d2018-10-10 16:13:03 -0400135ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const gl::Context *context,
136 gl::TransformFeedback *transformFeedback,
137 GLsizei count,
138 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400139{
Geoff Lang1a683462015-09-29 15:09:59 -0400140 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400141 {
Jamie Madill09463932018-04-04 05:26:59 -0400142 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400143 }
144}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500145
146// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300147EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400149 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500150}
151
Martin Radev1be913c2016-07-11 17:59:16 +0300152EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
153{
154 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
155}
156
Geoff Langeb66a6e2016-10-31 13:06:12 -0400157gl::Version GetClientVersion(const egl::AttributeMap &attribs)
158{
159 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
160}
161
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500162GLenum GetResetStrategy(const egl::AttributeMap &attribs)
163{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800164 EGLAttrib attrib =
165 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500166 switch (attrib)
167 {
168 case EGL_NO_RESET_NOTIFICATION:
169 return GL_NO_RESET_NOTIFICATION_EXT;
170 case EGL_LOSE_CONTEXT_ON_RESET:
171 return GL_LOSE_CONTEXT_ON_RESET_EXT;
172 default:
173 UNREACHABLE();
174 return GL_NONE;
175 }
176}
177
178bool GetRobustAccess(const egl::AttributeMap &attribs)
179{
Geoff Lang077f20a2016-11-01 10:08:02 -0400180 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
181 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
182 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500183}
184
185bool GetDebug(const egl::AttributeMap &attribs)
186{
Geoff Lang077f20a2016-11-01 10:08:02 -0400187 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
188 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500189}
190
191bool GetNoError(const egl::AttributeMap &attribs)
192{
193 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
194}
195
Geoff Langc287ea62016-09-16 14:46:51 -0400196bool GetWebGLContext(const egl::AttributeMap &attribs)
197{
Jamie Madill4230d482018-09-14 10:14:45 -0400198 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400199}
200
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400201bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
202{
203 // If the context is WebGL, extensions are disabled by default
204 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
205 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
206}
207
Geoff Langf41a7152016-09-19 15:11:17 -0400208bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
209{
Jamie Madill4230d482018-09-14 10:14:45 -0400210 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400211}
212
Geoff Langfeb8c682017-02-13 16:07:35 -0500213bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
214{
215 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
216}
217
Geoff Langb433e872017-10-05 14:01:47 -0400218bool GetRobustResourceInit(const egl::AttributeMap &attribs)
219{
220 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
221}
222
Martin Radev9d901792016-07-15 15:58:58 +0300223std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
224{
225 std::string labelName;
226 if (label != nullptr)
227 {
228 size_t labelLength = length < 0 ? strlen(label) : length;
229 labelName = std::string(label, labelLength);
230 }
231 return labelName;
232}
233
234void GetObjectLabelBase(const std::string &objectLabel,
235 GLsizei bufSize,
236 GLsizei *length,
237 GLchar *label)
238{
239 size_t writeLength = objectLabel.length();
240 if (label != nullptr && bufSize > 0)
241 {
242 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
243 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
244 label[writeLength] = '\0';
245 }
246
247 if (length != nullptr)
248 {
249 *length = static_cast<GLsizei>(writeLength);
250 }
251}
252
Jamie Madill0f80ed82017-09-19 00:24:56 -0400253template <typename CapT, typename MaxT>
254void LimitCap(CapT *cap, MaxT maximum)
255{
256 *cap = std::min(*cap, static_cast<CapT>(maximum));
257}
258
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600259constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
Jamie Madill526a6f62018-09-12 11:03:05 -0400260 1, /* Points */
261 2, /* Lines */
262 2, /* LineLoop */
263 2, /* LineStrip */
264 3, /* Triangles */
265 3, /* TriangleStrip */
266 3, /* TriangleFan */
267 2, /* LinesAdjacency */
268 2, /* LineStripAdjacency */
269 3, /* TrianglesAdjacency */
270 3, /* TriangleStripAdjacency */
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600271}};
272// Indices above are code-gen'd so make sure they don't change
273// if any of these static asserts are hit, must update kMinimumPrimitiveCounts abouve
274static_assert(static_cast<gl::PrimitiveMode>(0) == gl::PrimitiveMode::Points,
275 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
276static_assert(static_cast<gl::PrimitiveMode>(1) == gl::PrimitiveMode::Lines,
277 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
278static_assert(static_cast<gl::PrimitiveMode>(2) == gl::PrimitiveMode::LineLoop,
279 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
280static_assert(static_cast<gl::PrimitiveMode>(3) == gl::PrimitiveMode::LineStrip,
281 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
282static_assert(static_cast<gl::PrimitiveMode>(4) == gl::PrimitiveMode::Triangles,
283 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
284static_assert(static_cast<gl::PrimitiveMode>(5) == gl::PrimitiveMode::TriangleStrip,
285 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
286static_assert(static_cast<gl::PrimitiveMode>(6) == gl::PrimitiveMode::TriangleFan,
287 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
288static_assert(static_cast<gl::PrimitiveMode>(7) == gl::PrimitiveMode::LinesAdjacency,
289 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
290static_assert(static_cast<gl::PrimitiveMode>(8) == gl::PrimitiveMode::LineStripAdjacency,
291 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
292static_assert(static_cast<gl::PrimitiveMode>(9) == gl::PrimitiveMode::TrianglesAdjacency,
293 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
294static_assert(static_cast<gl::PrimitiveMode>(10) == gl::PrimitiveMode::TriangleStripAdjacency,
295 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
296static_assert(static_cast<gl::PrimitiveMode>(11) == gl::PrimitiveMode::EnumCount,
297 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
298
Jamie Madill6d32cef2018-08-14 02:34:28 -0400299enum SubjectIndexes : angle::SubjectIndex
300{
301 kTexture0SubjectIndex = 0,
302 kTextureMaxSubjectIndex = kTexture0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
303 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
304 kUniformBufferMaxSubjectIndex =
305 kUniformBuffer0SubjectIndex + gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400306 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
307 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
308 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400309 kReadFramebufferSubjectIndex,
310 kDrawFramebufferSubjectIndex
311};
Geoff Langf6db0982015-08-25 13:04:00 -0400312} // anonymous namespace
313
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000314namespace gl
315{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000316
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400317Context::Context(rx::EGLImplFactory *implFactory,
318 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400319 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500320 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400321 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500322 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700323 const egl::DisplayExtensions &displayExtensions,
324 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500325 : mState(reinterpret_cast<ContextID>(this),
326 shareContext ? &shareContext->mState : nullptr,
327 shareTextures,
328 GetClientVersion(attribs),
329 &mGLState,
330 mCaps,
331 mTextureCaps,
332 mExtensions,
333 mLimitations),
334 mSkipValidation(GetNoError(attribs)),
335 mDisplayTextureShareGroup(shareTextures != nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400336 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400337 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400338 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400339 mGLState(GetDebug(attribs),
340 GetBindGeneratesResource(attribs),
341 GetClientArraysEnabled(attribs),
342 GetRobustResourceInit(attribs),
343 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400344 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500345 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400346 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500347 mHasBeenCurrent(false),
348 mContextLost(false),
349 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700350 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500351 mResetStrategy(GetResetStrategy(attribs)),
352 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400353 mSurfacelessSupported(displayExtensions.surfacelessContext),
354 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400355 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
356 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500357 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400358 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400359 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400360 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
361 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
362 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400363 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800364 mZeroFilledBuffer(1000u),
365 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000366{
Jamie Madill6d32cef2018-08-14 02:34:28 -0400367 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
368 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
369 {
370 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
371 }
Jamie Madille25b8002018-09-20 13:39:49 -0400372
373 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
374 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
375 {
376 mSamplerObserverBindings.emplace_back(this, samplerIndex);
377 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400378}
Jamie Madill5b772312018-03-08 20:28:32 -0500379
Geoff Lang33f11fb2018-05-07 13:42:47 -0400380void Context::initialize()
381{
382 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400383
Geoff Lang33f11fb2018-05-07 13:42:47 -0400384 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700385 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400386
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400387 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100388
Shannon Woods53a94a82014-06-24 15:20:36 -0400389 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400390
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000391 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400392 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000393 // and cube map texture state vectors respectively associated with them.
394 // In order that access to these initial textures not be lost, they are treated as texture
395 // objects all of whose names are 0.
396
Corentin Wallez99d492c2018-02-27 15:17:10 -0500397 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800398 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500399
Corentin Wallez99d492c2018-02-27 15:17:10 -0500400 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800401 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400402
Geoff Langeb66a6e2016-10-31 13:06:12 -0400403 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400404 {
405 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500406 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800407 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400408
Corentin Wallez99d492c2018-02-27 15:17:10 -0500409 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800410 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400411 }
Yizhou Jiang7818a852018-09-06 15:02:04 +0800412 if (getClientVersion() >= Version(3, 1) || mSupportedExtensions.textureMultisample)
Geoff Lang3b573612016-10-31 14:08:10 -0400413 {
414 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500415 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800416 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Yizhou Jiang7818a852018-09-06 15:02:04 +0800417 }
418 if (getClientVersion() >= Version(3, 1))
419 {
Olli Etuahod310a432018-08-24 15:40:23 +0300420 Texture *zeroTexture2DMultisampleArray =
421 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
422 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800423
Jiajia Qin6eafb042016-12-27 17:04:07 +0800424 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
425 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800426 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800427 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800428
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800429 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
430 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400431 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800432 }
Geoff Lang3b573612016-10-31 14:08:10 -0400433 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000434
Geoff Langb0f917f2017-12-05 13:41:54 -0500435 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400436 {
437 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500438 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800439 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400440 }
441
Geoff Langb0f917f2017-12-05 13:41:54 -0500442 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400443 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500444 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800445 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400446 }
447
Jamie Madill4928b7c2017-06-20 12:57:39 -0400448 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500449
Jamie Madill57a89722013-07-02 11:57:03 -0400450 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000451
Geoff Langeb66a6e2016-10-31 13:06:12 -0400452 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400453 {
454 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
455 // In the initial state, a default transform feedback object is bound and treated as
456 // a transform feedback object with a name of zero. That object is bound any time
457 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400458 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400459 }
Geoff Langc8058452014-02-03 12:04:11 -0500460
Corentin Wallez336129f2017-10-17 15:55:40 -0400461 for (auto type : angle::AllEnums<BufferBinding>())
462 {
463 bindBuffer(type, 0);
464 }
465
466 bindRenderbuffer(GL_RENDERBUFFER, 0);
467
468 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
469 {
470 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
471 }
472
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700473 // Initialize GLES1 renderer if appropriate.
474 if (getClientVersion() < Version(2, 0))
475 {
476 mGLES1Renderer.reset(new GLES1Renderer());
477 }
478
Jamie Madillad9f24e2016-02-12 09:27:24 -0500479 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400480 mAllDirtyBits.set();
481
Geoff Lang9bf86f02018-07-26 11:46:34 -0400482 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
483 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
484 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400485 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400486 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400487
488 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
489 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
490 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400491 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400492
Jamie Madillc67323a2017-11-02 23:11:41 -0400493 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500494 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500495 // No dirty objects.
496
497 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400498 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500499 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400500 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500501 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
502
503 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
504 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
505 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
506 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
507 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
508 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
509 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
510 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
511 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
512 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
513 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400514 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500515 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
516
517 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
518 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700519 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400520 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
521 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500522 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
523 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400524
Xinghua Cao10a4d432017-11-28 14:46:26 +0800525 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800526 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
527 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800528 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
529 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
530 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
531 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800532 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800533 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800534 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400535 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400536 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800537
Jamie Madillb4927eb2018-07-16 11:39:46 -0400538 mImplementation->setErrorSet(&mErrors);
539
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400540 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000541}
542
Jamie Madill4928b7c2017-06-20 12:57:39 -0400543egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000544{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700545 if (mGLES1Renderer)
546 {
547 mGLES1Renderer->onDestroy(this, &mGLState);
548 }
549
Jamie Madille7b3fe22018-04-05 09:42:46 -0400550 ANGLE_TRY(releaseSurface(display));
551
Corentin Wallez80b24112015-08-25 16:41:57 -0400552 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000553 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400554 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000555 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400556 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000557
Corentin Wallez80b24112015-08-25 16:41:57 -0400558 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000559 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400560 if (query.second != nullptr)
561 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400562 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400563 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000564 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400565 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000566
Corentin Wallez80b24112015-08-25 16:41:57 -0400567 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400568 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400569 if (vertexArray.second)
570 {
571 vertexArray.second->onDestroy(this);
572 }
Jamie Madill57a89722013-07-02 11:57:03 -0400573 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400574 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400575
Corentin Wallez80b24112015-08-25 16:41:57 -0400576 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500577 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500578 if (transformFeedback.second != nullptr)
579 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500580 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500581 }
Geoff Langc8058452014-02-03 12:04:11 -0500582 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400583 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500584
Jamie Madill5b772312018-03-08 20:28:32 -0500585 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400586 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800587 if (zeroTexture.get() != nullptr)
588 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400589 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800590 zeroTexture.set(this, nullptr);
591 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400592 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000593
Jamie Madill2f348d22017-06-05 10:50:59 -0400594 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500595
Jamie Madill4928b7c2017-06-20 12:57:39 -0400596 mGLState.reset(this);
597
Jamie Madill6c1f6712017-02-14 19:08:04 -0500598 mState.mBuffers->release(this);
599 mState.mShaderPrograms->release(this);
600 mState.mTextures->release(this);
601 mState.mRenderbuffers->release(this);
602 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400603 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500604 mState.mPaths->release(this);
605 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800606 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400607
jchen107ae70d82018-07-06 13:47:01 +0800608 mThreadPool.reset();
609
Jamie Madill76e471e2017-10-21 09:56:01 -0400610 mImplementation->onDestroy(this);
611
Jamie Madill4928b7c2017-06-20 12:57:39 -0400612 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000613}
614
Jamie Madill70ee0f62017-02-06 16:04:20 -0500615Context::~Context()
616{
617}
618
Geoff Lang75359662018-04-11 01:42:27 -0400619void Context::setLabel(EGLLabelKHR label)
620{
621 mLabel = label;
622}
623
624EGLLabelKHR Context::getLabel() const
625{
626 return mLabel;
627}
628
Jamie Madill4928b7c2017-06-20 12:57:39 -0400629egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000630{
Jamie Madill61e16b42017-06-19 11:13:23 -0400631 mCurrentDisplay = display;
632
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000633 if (!mHasBeenCurrent)
634 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400635 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000636 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500637 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400638 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000639
Corentin Wallezc295e512017-01-27 17:47:50 -0500640 int width = 0;
641 int height = 0;
642 if (surface != nullptr)
643 {
644 width = surface->getWidth();
645 height = surface->getHeight();
646 }
647
648 mGLState.setViewportParams(0, 0, width, height);
649 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000650
651 mHasBeenCurrent = true;
652 }
653
Jamie Madill1b94d432015-08-07 13:23:23 -0400654 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700655 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400656 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400657
Jamie Madill4928b7c2017-06-20 12:57:39 -0400658 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500659
660 Framebuffer *newDefault = nullptr;
661 if (surface != nullptr)
662 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400663 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500664 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400665 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500666 }
667 else
668 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400669 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500670 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000671
Corentin Wallez37c39792015-08-20 14:19:46 -0400672 // Update default framebuffer, the binding of the previous default
673 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400674 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400675 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700676 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400677 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400678 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400679 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700680 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400681 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400682 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400683 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400684 }
Ian Ewell292f0052016-02-04 10:37:32 -0500685
Jamie Madill32643ce2018-10-19 11:38:03 -0400686 // Notify the renderer of a context switch.
687 // TODO(jmadill): Fix this error handling. http://anglebug.com/2491
688 (void)(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400689 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000690}
691
Jamie Madill4928b7c2017-06-20 12:57:39 -0400692egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400693{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400694 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400695
Geoff Langbf7b95d2018-05-01 16:48:21 -0400696 // Remove the default framebuffer
697 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500698 {
699 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400700 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500701 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400702
703 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500704 {
705 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400706 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500707 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400708
709 if (defaultFramebuffer)
710 {
711 defaultFramebuffer->onDestroy(this);
712 delete defaultFramebuffer;
713 }
714
Corentin Wallezc295e512017-01-27 17:47:50 -0500715 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
716
717 if (mCurrentSurface)
718 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400719 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500720 mCurrentSurface = nullptr;
721 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400722
723 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400724}
725
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000726GLuint Context::createBuffer()
727{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500728 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000729}
730
731GLuint Context::createProgram()
732{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500733 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000734}
735
Jiawei Shao385b3e02018-03-21 09:43:28 +0800736GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000737{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500738 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000739}
740
741GLuint Context::createTexture()
742{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500743 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000744}
745
746GLuint Context::createRenderbuffer()
747{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500748 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000749}
750
Jamie Madill13951342018-09-30 15:24:28 -0400751void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
752{
753 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
754}
755
Brandon Jones59770802018-04-02 13:18:42 -0700756GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300757{
Jamie Madill13951342018-09-30 15:24:28 -0400758 GLuint created = 0;
759 tryGenPaths(range, &created);
760 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300761}
762
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000763// Returns an unused framebuffer name
764GLuint Context::createFramebuffer()
765{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500766 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000767}
768
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500769void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000770{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500771 for (int i = 0; i < n; i++)
772 {
773 GLuint handle = mFenceNVHandleAllocator.allocate();
774 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
775 fences[i] = handle;
776 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000777}
778
Yunchao Hea336b902017-08-02 16:05:21 +0800779GLuint Context::createProgramPipeline()
780{
781 return mState.mPipelines->createProgramPipeline();
782}
783
Jiawei Shao385b3e02018-03-21 09:43:28 +0800784GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800785{
786 UNIMPLEMENTED();
787 return 0u;
788}
789
James Darpinian4d9d4832018-03-13 12:43:28 -0700790void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000791{
James Darpinian4d9d4832018-03-13 12:43:28 -0700792 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
793 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000794 {
795 detachBuffer(buffer);
796 }
Jamie Madill893ab082014-05-16 16:56:10 -0400797
James Darpinian4d9d4832018-03-13 12:43:28 -0700798 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000799}
800
801void Context::deleteShader(GLuint shader)
802{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500803 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000804}
805
806void Context::deleteProgram(GLuint program)
807{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500808 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000809}
810
811void Context::deleteTexture(GLuint texture)
812{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500813 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000814 {
815 detachTexture(texture);
816 }
817
Jamie Madill6c1f6712017-02-14 19:08:04 -0500818 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000819}
820
821void Context::deleteRenderbuffer(GLuint renderbuffer)
822{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500823 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000824 {
825 detachRenderbuffer(renderbuffer);
826 }
Jamie Madill893ab082014-05-16 16:56:10 -0400827
Jamie Madill6c1f6712017-02-14 19:08:04 -0500828 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000829}
830
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400831void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400832{
833 // The spec specifies the underlying Fence object is not deleted until all current
834 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
835 // and since our API is currently designed for being called from a single thread, we can delete
836 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400837 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400838}
839
Yunchao Hea336b902017-08-02 16:05:21 +0800840void Context::deleteProgramPipeline(GLuint pipeline)
841{
842 if (mState.mPipelines->getProgramPipeline(pipeline))
843 {
844 detachProgramPipeline(pipeline);
845 }
846
847 mState.mPipelines->deleteObject(this, pipeline);
848}
849
Sami Väisänene45e53b2016-05-25 10:36:04 +0300850void Context::deletePaths(GLuint first, GLsizei range)
851{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500852 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300853}
854
Brandon Jones59770802018-04-02 13:18:42 -0700855bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300856{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500857 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300858 if (pathObj == nullptr)
859 return false;
860
861 return pathObj->hasPathData();
862}
863
Brandon Jones59770802018-04-02 13:18:42 -0700864bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300865{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500866 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300867}
868
Brandon Jones59770802018-04-02 13:18:42 -0700869void Context::pathCommands(GLuint path,
870 GLsizei numCommands,
871 const GLubyte *commands,
872 GLsizei numCoords,
873 GLenum coordType,
874 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300875{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500876 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300877
878 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
879}
880
Jamie Madill007530e2017-12-28 14:27:04 -0500881void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300882{
Jamie Madill007530e2017-12-28 14:27:04 -0500883 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300884
885 switch (pname)
886 {
887 case GL_PATH_STROKE_WIDTH_CHROMIUM:
888 pathObj->setStrokeWidth(value);
889 break;
890 case GL_PATH_END_CAPS_CHROMIUM:
891 pathObj->setEndCaps(static_cast<GLenum>(value));
892 break;
893 case GL_PATH_JOIN_STYLE_CHROMIUM:
894 pathObj->setJoinStyle(static_cast<GLenum>(value));
895 break;
896 case GL_PATH_MITER_LIMIT_CHROMIUM:
897 pathObj->setMiterLimit(value);
898 break;
899 case GL_PATH_STROKE_BOUND_CHROMIUM:
900 pathObj->setStrokeBound(value);
901 break;
902 default:
903 UNREACHABLE();
904 break;
905 }
906}
907
Jamie Madill007530e2017-12-28 14:27:04 -0500908void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300909{
Jamie Madill007530e2017-12-28 14:27:04 -0500910 // TODO(jmadill): Should use proper clamping/casting.
911 pathParameterf(path, pname, static_cast<GLfloat>(value));
912}
913
914void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
915{
916 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300917
918 switch (pname)
919 {
920 case GL_PATH_STROKE_WIDTH_CHROMIUM:
921 *value = pathObj->getStrokeWidth();
922 break;
923 case GL_PATH_END_CAPS_CHROMIUM:
924 *value = static_cast<GLfloat>(pathObj->getEndCaps());
925 break;
926 case GL_PATH_JOIN_STYLE_CHROMIUM:
927 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
928 break;
929 case GL_PATH_MITER_LIMIT_CHROMIUM:
930 *value = pathObj->getMiterLimit();
931 break;
932 case GL_PATH_STROKE_BOUND_CHROMIUM:
933 *value = pathObj->getStrokeBound();
934 break;
935 default:
936 UNREACHABLE();
937 break;
938 }
939}
940
Jamie Madill007530e2017-12-28 14:27:04 -0500941void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
942{
943 GLfloat val = 0.0f;
944 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
945 if (value)
946 *value = static_cast<GLint>(val);
947}
948
Brandon Jones59770802018-04-02 13:18:42 -0700949void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300950{
951 mGLState.setPathStencilFunc(func, ref, mask);
952}
953
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000954void Context::deleteFramebuffer(GLuint framebuffer)
955{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500956 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000957 {
958 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000959 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500960
Jamie Madill6c1f6712017-02-14 19:08:04 -0500961 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000962}
963
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500964void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000965{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500966 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000967 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500968 GLuint fence = fences[i];
969
970 FenceNV *fenceObject = nullptr;
971 if (mFenceNVMap.erase(fence, &fenceObject))
972 {
973 mFenceNVHandleAllocator.release(fence);
974 delete fenceObject;
975 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000976 }
977}
978
Geoff Lang70d0f492015-12-10 17:45:46 -0500979Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000980{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500981 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000982}
983
Geoff Lang70d0f492015-12-10 17:45:46 -0500984Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000985{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500986 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000987}
988
Jamie Madill70b5bb02017-08-28 13:32:37 -0400989Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400990{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400991 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400992}
993
Jamie Madill57a89722013-07-02 11:57:03 -0400994VertexArray *Context::getVertexArray(GLuint handle) const
995{
Jamie Madill96a483b2017-06-27 16:49:21 -0400996 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400997}
998
Jamie Madilldc356042013-07-19 16:36:57 -0400999Sampler *Context::getSampler(GLuint handle) const
1000{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001001 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001002}
1003
Geoff Langc8058452014-02-03 12:04:11 -05001004TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1005{
Jamie Madill96a483b2017-06-27 16:49:21 -04001006 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001007}
1008
Yunchao Hea336b902017-08-02 16:05:21 +08001009ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1010{
1011 return mState.mPipelines->getProgramPipeline(handle);
1012}
1013
Geoff Lang75359662018-04-11 01:42:27 -04001014gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001015{
1016 switch (identifier)
1017 {
1018 case GL_BUFFER:
1019 return getBuffer(name);
1020 case GL_SHADER:
1021 return getShader(name);
1022 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001023 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001024 case GL_VERTEX_ARRAY:
1025 return getVertexArray(name);
1026 case GL_QUERY:
1027 return getQuery(name);
1028 case GL_TRANSFORM_FEEDBACK:
1029 return getTransformFeedback(name);
1030 case GL_SAMPLER:
1031 return getSampler(name);
1032 case GL_TEXTURE:
1033 return getTexture(name);
1034 case GL_RENDERBUFFER:
1035 return getRenderbuffer(name);
1036 case GL_FRAMEBUFFER:
1037 return getFramebuffer(name);
1038 default:
1039 UNREACHABLE();
1040 return nullptr;
1041 }
1042}
1043
Geoff Lang75359662018-04-11 01:42:27 -04001044gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001045{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001046 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001047}
1048
Martin Radev9d901792016-07-15 15:58:58 +03001049void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1050{
Geoff Lang75359662018-04-11 01:42:27 -04001051 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001052 ASSERT(object != nullptr);
1053
1054 std::string labelName = GetObjectLabelFromPointer(length, label);
1055 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001056
1057 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1058 // specified object is active until we do this.
1059 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001060}
1061
1062void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1063{
Geoff Lang75359662018-04-11 01:42:27 -04001064 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001065 ASSERT(object != nullptr);
1066
1067 std::string labelName = GetObjectLabelFromPointer(length, label);
1068 object->setLabel(labelName);
1069}
1070
1071void Context::getObjectLabel(GLenum identifier,
1072 GLuint name,
1073 GLsizei bufSize,
1074 GLsizei *length,
1075 GLchar *label) const
1076{
Geoff Lang75359662018-04-11 01:42:27 -04001077 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001078 ASSERT(object != nullptr);
1079
1080 const std::string &objectLabel = object->getLabel();
1081 GetObjectLabelBase(objectLabel, bufSize, length, label);
1082}
1083
1084void Context::getObjectPtrLabel(const void *ptr,
1085 GLsizei bufSize,
1086 GLsizei *length,
1087 GLchar *label) const
1088{
Geoff Lang75359662018-04-11 01:42:27 -04001089 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001090 ASSERT(object != nullptr);
1091
1092 const std::string &objectLabel = object->getLabel();
1093 GetObjectLabelBase(objectLabel, bufSize, length, label);
1094}
1095
Jamie Madilldc356042013-07-19 16:36:57 -04001096bool Context::isSampler(GLuint samplerName) const
1097{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001098 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001099}
1100
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001101void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001102{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001103 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001104
Jamie Madilldedd7b92014-11-05 16:30:36 -05001105 if (handle == 0)
1106 {
1107 texture = mZeroTextures[target].get();
1108 }
1109 else
1110 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001111 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001112 }
1113
1114 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001115 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001116 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001117}
1118
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001119void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001120{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001121 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1122 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001123 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001124 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001125}
1126
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001127void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001128{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001129 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1130 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001131 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001132 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001133 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001134}
1135
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001136void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001137{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001138 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001139 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001140 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001141 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001142}
1143
Shao80957d92017-02-20 21:25:59 +08001144void Context::bindVertexBuffer(GLuint bindingIndex,
1145 GLuint bufferHandle,
1146 GLintptr offset,
1147 GLsizei stride)
1148{
1149 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001150 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001151 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001152}
1153
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001154void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001155{
Geoff Lang76b10c92014-09-05 16:28:14 -04001156 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001157 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001158 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001159 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001160 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001161}
1162
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001163void Context::bindImageTexture(GLuint unit,
1164 GLuint texture,
1165 GLint level,
1166 GLboolean layered,
1167 GLint layer,
1168 GLenum access,
1169 GLenum format)
1170{
1171 Texture *tex = mState.mTextures->getTexture(texture);
1172 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1173}
1174
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001175void Context::useProgram(GLuint program)
1176{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001177 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001178 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001179}
1180
Jiajia Qin5451d532017-11-16 17:16:34 +08001181void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1182{
1183 UNIMPLEMENTED();
1184}
1185
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001186void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001187{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001188 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001189 TransformFeedback *transformFeedback =
1190 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001191 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001192 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001193}
1194
Yunchao Hea336b902017-08-02 16:05:21 +08001195void Context::bindProgramPipeline(GLuint pipelineHandle)
1196{
1197 ProgramPipeline *pipeline =
1198 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1199 mGLState.setProgramPipelineBinding(this, pipeline);
1200}
1201
Corentin Wallezad3ae902018-03-09 13:40:42 -05001202void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001203{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001204 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001205 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001206
Geoff Lang5aad9672014-09-08 11:10:42 -04001207 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001208 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001209
1210 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001211 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001212 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001213}
1214
Corentin Wallezad3ae902018-03-09 13:40:42 -05001215void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001216{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001217 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001218 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001219
Jamie Madill5188a272018-07-25 10:53:56 -04001220 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001221
Geoff Lang5aad9672014-09-08 11:10:42 -04001222 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001223 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001224 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001225}
1226
Corentin Wallezad3ae902018-03-09 13:40:42 -05001227void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001228{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001229 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001230
1231 Query *queryObject = getQuery(id, true, target);
1232 ASSERT(queryObject);
1233
Jamie Madill5188a272018-07-25 10:53:56 -04001234 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001235}
1236
Corentin Wallezad3ae902018-03-09 13:40:42 -05001237void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001238{
1239 switch (pname)
1240 {
1241 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001242 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001243 break;
1244 case GL_QUERY_COUNTER_BITS_EXT:
1245 switch (target)
1246 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001247 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001248 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1249 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001250 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001251 params[0] = getExtensions().queryCounterBitsTimestamp;
1252 break;
1253 default:
1254 UNREACHABLE();
1255 params[0] = 0;
1256 break;
1257 }
1258 break;
1259 default:
1260 UNREACHABLE();
1261 return;
1262 }
1263}
1264
Corentin Wallezad3ae902018-03-09 13:40:42 -05001265void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001266 GLenum pname,
1267 GLsizei bufSize,
1268 GLsizei *length,
1269 GLint *params)
1270{
1271 getQueryiv(target, pname, params);
1272}
1273
Geoff Lang2186c382016-10-14 10:54:54 -04001274void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001275{
Jamie Madill5188a272018-07-25 10:53:56 -04001276 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001277}
1278
Brandon Jones59770802018-04-02 13:18:42 -07001279void Context::getQueryObjectivRobust(GLuint id,
1280 GLenum pname,
1281 GLsizei bufSize,
1282 GLsizei *length,
1283 GLint *params)
1284{
1285 getQueryObjectiv(id, pname, params);
1286}
1287
Geoff Lang2186c382016-10-14 10:54:54 -04001288void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001289{
Jamie Madill5188a272018-07-25 10:53:56 -04001290 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001291}
1292
Brandon Jones59770802018-04-02 13:18:42 -07001293void Context::getQueryObjectuivRobust(GLuint id,
1294 GLenum pname,
1295 GLsizei bufSize,
1296 GLsizei *length,
1297 GLuint *params)
1298{
1299 getQueryObjectuiv(id, pname, params);
1300}
1301
Geoff Lang2186c382016-10-14 10:54:54 -04001302void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001303{
Jamie Madill5188a272018-07-25 10:53:56 -04001304 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001305}
1306
Brandon Jones59770802018-04-02 13:18:42 -07001307void Context::getQueryObjecti64vRobust(GLuint id,
1308 GLenum pname,
1309 GLsizei bufSize,
1310 GLsizei *length,
1311 GLint64 *params)
1312{
1313 getQueryObjecti64v(id, pname, params);
1314}
1315
Geoff Lang2186c382016-10-14 10:54:54 -04001316void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001317{
Jamie Madill5188a272018-07-25 10:53:56 -04001318 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001319}
1320
Brandon Jones59770802018-04-02 13:18:42 -07001321void Context::getQueryObjectui64vRobust(GLuint id,
1322 GLenum pname,
1323 GLsizei bufSize,
1324 GLsizei *length,
1325 GLuint64 *params)
1326{
1327 getQueryObjectui64v(id, pname, params);
1328}
1329
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001330Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001331{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001332 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001333}
1334
Jamie Madill2f348d22017-06-05 10:50:59 -04001335FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001336{
Jamie Madill96a483b2017-06-27 16:49:21 -04001337 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001338}
1339
Corentin Wallezad3ae902018-03-09 13:40:42 -05001340Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001341{
Jamie Madill96a483b2017-06-27 16:49:21 -04001342 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001343 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001344 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001345 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001346
1347 Query *query = mQueryMap.query(handle);
1348 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001349 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001350 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001351 query = new Query(mImplementation->createQuery(type), handle);
1352 query->addRef();
1353 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001354 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001355 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001356}
1357
Geoff Lang70d0f492015-12-10 17:45:46 -05001358Query *Context::getQuery(GLuint handle) const
1359{
Jamie Madill96a483b2017-06-27 16:49:21 -04001360 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001361}
1362
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001363Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001364{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001365 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1366 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001367}
1368
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001369Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001370{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001371 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001372}
1373
Geoff Lang492a7e42014-11-05 13:27:06 -05001374Compiler *Context::getCompiler() const
1375{
Jamie Madill2f348d22017-06-05 10:50:59 -04001376 if (mCompiler.get() == nullptr)
1377 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001378 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001379 }
1380 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001381}
1382
Jamie Madillc1d770e2017-04-13 17:31:24 -04001383void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001384{
1385 switch (pname)
1386 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001387 case GL_SHADER_COMPILER:
1388 *params = GL_TRUE;
1389 break;
1390 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1391 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1392 break;
1393 default:
1394 mGLState.getBooleanv(pname, params);
1395 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001396 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001397}
1398
Jamie Madillc1d770e2017-04-13 17:31:24 -04001399void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001400{
Shannon Woods53a94a82014-06-24 15:20:36 -04001401 // Queries about context capabilities and maximums are answered by Context.
1402 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001403 switch (pname)
1404 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001405 case GL_ALIASED_LINE_WIDTH_RANGE:
1406 params[0] = mCaps.minAliasedLineWidth;
1407 params[1] = mCaps.maxAliasedLineWidth;
1408 break;
1409 case GL_ALIASED_POINT_SIZE_RANGE:
1410 params[0] = mCaps.minAliasedPointSize;
1411 params[1] = mCaps.maxAliasedPointSize;
1412 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001413 case GL_SMOOTH_POINT_SIZE_RANGE:
1414 params[0] = mCaps.minSmoothPointSize;
1415 params[1] = mCaps.maxSmoothPointSize;
1416 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001417 case GL_SMOOTH_LINE_WIDTH_RANGE:
1418 params[0] = mCaps.minSmoothLineWidth;
1419 params[1] = mCaps.maxSmoothLineWidth;
1420 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001421 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1422 ASSERT(mExtensions.textureFilterAnisotropic);
1423 *params = mExtensions.maxTextureAnisotropy;
1424 break;
1425 case GL_MAX_TEXTURE_LOD_BIAS:
1426 *params = mCaps.maxLODBias;
1427 break;
1428
1429 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1430 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1431 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001432 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1433 // GLES1 constants for modelview/projection matrix.
1434 if (getClientVersion() < Version(2, 0))
1435 {
1436 mGLState.getFloatv(pname, params);
1437 }
1438 else
1439 {
1440 ASSERT(mExtensions.pathRendering);
1441 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1442 memcpy(params, m, 16 * sizeof(GLfloat));
1443 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001444 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001445 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001446
Jamie Madill231c7f52017-04-26 13:45:37 -04001447 default:
1448 mGLState.getFloatv(pname, params);
1449 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001450 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001451}
1452
Jamie Madillc1d770e2017-04-13 17:31:24 -04001453void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001454{
Shannon Woods53a94a82014-06-24 15:20:36 -04001455 // Queries about context capabilities and maximums are answered by Context.
1456 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001457
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001458 switch (pname)
1459 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001460 case GL_MAX_VERTEX_ATTRIBS:
1461 *params = mCaps.maxVertexAttributes;
1462 break;
1463 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1464 *params = mCaps.maxVertexUniformVectors;
1465 break;
1466 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001467 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001468 break;
1469 case GL_MAX_VARYING_VECTORS:
1470 *params = mCaps.maxVaryingVectors;
1471 break;
1472 case GL_MAX_VARYING_COMPONENTS:
1473 *params = mCaps.maxVertexOutputComponents;
1474 break;
1475 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1476 *params = mCaps.maxCombinedTextureImageUnits;
1477 break;
1478 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001479 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001480 break;
1481 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001482 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001483 break;
1484 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1485 *params = mCaps.maxFragmentUniformVectors;
1486 break;
1487 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001488 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001489 break;
1490 case GL_MAX_RENDERBUFFER_SIZE:
1491 *params = mCaps.maxRenderbufferSize;
1492 break;
1493 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1494 *params = mCaps.maxColorAttachments;
1495 break;
1496 case GL_MAX_DRAW_BUFFERS_EXT:
1497 *params = mCaps.maxDrawBuffers;
1498 break;
1499 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1500 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1501 case GL_SUBPIXEL_BITS:
1502 *params = 4;
1503 break;
1504 case GL_MAX_TEXTURE_SIZE:
1505 *params = mCaps.max2DTextureSize;
1506 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001507 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1508 *params = mCaps.maxRectangleTextureSize;
1509 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001510 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1511 *params = mCaps.maxCubeMapTextureSize;
1512 break;
1513 case GL_MAX_3D_TEXTURE_SIZE:
1514 *params = mCaps.max3DTextureSize;
1515 break;
1516 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1517 *params = mCaps.maxArrayTextureLayers;
1518 break;
1519 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1520 *params = mCaps.uniformBufferOffsetAlignment;
1521 break;
1522 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1523 *params = mCaps.maxUniformBufferBindings;
1524 break;
1525 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001526 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001527 break;
1528 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001529 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001530 break;
1531 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1532 *params = mCaps.maxCombinedTextureImageUnits;
1533 break;
1534 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1535 *params = mCaps.maxVertexOutputComponents;
1536 break;
1537 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1538 *params = mCaps.maxFragmentInputComponents;
1539 break;
1540 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1541 *params = mCaps.minProgramTexelOffset;
1542 break;
1543 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1544 *params = mCaps.maxProgramTexelOffset;
1545 break;
1546 case GL_MAJOR_VERSION:
1547 *params = getClientVersion().major;
1548 break;
1549 case GL_MINOR_VERSION:
1550 *params = getClientVersion().minor;
1551 break;
1552 case GL_MAX_ELEMENTS_INDICES:
1553 *params = mCaps.maxElementsIndices;
1554 break;
1555 case GL_MAX_ELEMENTS_VERTICES:
1556 *params = mCaps.maxElementsVertices;
1557 break;
1558 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1559 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1560 break;
1561 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1562 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1563 break;
1564 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1565 *params = mCaps.maxTransformFeedbackSeparateComponents;
1566 break;
1567 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1568 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1569 break;
1570 case GL_MAX_SAMPLES_ANGLE:
1571 *params = mCaps.maxSamples;
1572 break;
1573 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001574 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001575 params[0] = mCaps.maxViewportWidth;
1576 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001577 }
1578 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001579 case GL_COMPRESSED_TEXTURE_FORMATS:
1580 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1581 params);
1582 break;
1583 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1584 *params = mResetStrategy;
1585 break;
1586 case GL_NUM_SHADER_BINARY_FORMATS:
1587 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1588 break;
1589 case GL_SHADER_BINARY_FORMATS:
1590 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1591 break;
1592 case GL_NUM_PROGRAM_BINARY_FORMATS:
1593 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1594 break;
1595 case GL_PROGRAM_BINARY_FORMATS:
1596 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1597 break;
1598 case GL_NUM_EXTENSIONS:
1599 *params = static_cast<GLint>(mExtensionStrings.size());
1600 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001601
Geoff Lang38f24ee2018-10-01 13:04:59 -04001602 // GL_ANGLE_request_extension
1603 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1604 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1605 break;
1606
Jamie Madill231c7f52017-04-26 13:45:37 -04001607 // GL_KHR_debug
1608 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1609 *params = mExtensions.maxDebugMessageLength;
1610 break;
1611 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1612 *params = mExtensions.maxDebugLoggedMessages;
1613 break;
1614 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1615 *params = mExtensions.maxDebugGroupStackDepth;
1616 break;
1617 case GL_MAX_LABEL_LENGTH:
1618 *params = mExtensions.maxLabelLength;
1619 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001620
Martin Radeve5285d22017-07-14 16:23:53 +03001621 // GL_ANGLE_multiview
1622 case GL_MAX_VIEWS_ANGLE:
1623 *params = mExtensions.maxViews;
1624 break;
1625
Jamie Madill231c7f52017-04-26 13:45:37 -04001626 // GL_EXT_disjoint_timer_query
1627 case GL_GPU_DISJOINT_EXT:
1628 *params = mImplementation->getGPUDisjoint();
1629 break;
1630 case GL_MAX_FRAMEBUFFER_WIDTH:
1631 *params = mCaps.maxFramebufferWidth;
1632 break;
1633 case GL_MAX_FRAMEBUFFER_HEIGHT:
1634 *params = mCaps.maxFramebufferHeight;
1635 break;
1636 case GL_MAX_FRAMEBUFFER_SAMPLES:
1637 *params = mCaps.maxFramebufferSamples;
1638 break;
1639 case GL_MAX_SAMPLE_MASK_WORDS:
1640 *params = mCaps.maxSampleMaskWords;
1641 break;
1642 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1643 *params = mCaps.maxColorTextureSamples;
1644 break;
1645 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1646 *params = mCaps.maxDepthTextureSamples;
1647 break;
1648 case GL_MAX_INTEGER_SAMPLES:
1649 *params = mCaps.maxIntegerSamples;
1650 break;
1651 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1652 *params = mCaps.maxVertexAttribRelativeOffset;
1653 break;
1654 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1655 *params = mCaps.maxVertexAttribBindings;
1656 break;
1657 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1658 *params = mCaps.maxVertexAttribStride;
1659 break;
1660 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001661 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001662 break;
1663 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001664 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001665 break;
1666 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001667 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001668 break;
1669 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001670 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001671 break;
1672 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001673 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001674 break;
1675 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001676 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001677 break;
1678 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001679 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001680 break;
1681 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001682 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001683 break;
1684 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1685 *params = mCaps.minProgramTextureGatherOffset;
1686 break;
1687 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1688 *params = mCaps.maxProgramTextureGatherOffset;
1689 break;
1690 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1691 *params = mCaps.maxComputeWorkGroupInvocations;
1692 break;
1693 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001694 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001695 break;
1696 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001697 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001698 break;
1699 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1700 *params = mCaps.maxComputeSharedMemorySize;
1701 break;
1702 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001703 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001704 break;
1705 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001706 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001707 break;
1708 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001709 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001710 break;
1711 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001712 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001713 break;
1714 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001715 *params =
1716 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001717 break;
1718 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001719 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001720 break;
1721 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1722 *params = mCaps.maxCombinedShaderOutputResources;
1723 break;
1724 case GL_MAX_UNIFORM_LOCATIONS:
1725 *params = mCaps.maxUniformLocations;
1726 break;
1727 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1728 *params = mCaps.maxAtomicCounterBufferBindings;
1729 break;
1730 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1731 *params = mCaps.maxAtomicCounterBufferSize;
1732 break;
1733 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1734 *params = mCaps.maxCombinedAtomicCounterBuffers;
1735 break;
1736 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1737 *params = mCaps.maxCombinedAtomicCounters;
1738 break;
1739 case GL_MAX_IMAGE_UNITS:
1740 *params = mCaps.maxImageUnits;
1741 break;
1742 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1743 *params = mCaps.maxCombinedImageUniforms;
1744 break;
1745 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1746 *params = mCaps.maxShaderStorageBufferBindings;
1747 break;
1748 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1749 *params = mCaps.maxCombinedShaderStorageBlocks;
1750 break;
1751 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1752 *params = mCaps.shaderStorageBufferOffsetAlignment;
1753 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001754
1755 // GL_EXT_geometry_shader
1756 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1757 *params = mCaps.maxFramebufferLayers;
1758 break;
1759 case GL_LAYER_PROVOKING_VERTEX_EXT:
1760 *params = mCaps.layerProvokingVertex;
1761 break;
1762 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001763 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001764 break;
1765 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001766 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001767 break;
1768 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001769 *params =
1770 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001771 break;
1772 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1773 *params = mCaps.maxGeometryInputComponents;
1774 break;
1775 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1776 *params = mCaps.maxGeometryOutputComponents;
1777 break;
1778 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1779 *params = mCaps.maxGeometryOutputVertices;
1780 break;
1781 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1782 *params = mCaps.maxGeometryTotalOutputComponents;
1783 break;
1784 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1785 *params = mCaps.maxGeometryShaderInvocations;
1786 break;
1787 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001788 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001789 break;
1790 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001791 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001792 break;
1793 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001794 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001795 break;
1796 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001797 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001798 break;
1799 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001800 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001801 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001802 // GLES1 emulation: Caps queries
1803 case GL_MAX_TEXTURE_UNITS:
1804 *params = mCaps.maxMultitextureUnits;
1805 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001806 case GL_MAX_MODELVIEW_STACK_DEPTH:
1807 *params = mCaps.maxModelviewMatrixStackDepth;
1808 break;
1809 case GL_MAX_PROJECTION_STACK_DEPTH:
1810 *params = mCaps.maxProjectionMatrixStackDepth;
1811 break;
1812 case GL_MAX_TEXTURE_STACK_DEPTH:
1813 *params = mCaps.maxTextureMatrixStackDepth;
1814 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001815 case GL_MAX_LIGHTS:
1816 *params = mCaps.maxLights;
1817 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001818 case GL_MAX_CLIP_PLANES:
1819 *params = mCaps.maxClipPlanes;
1820 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001821 // GLES1 emulation: Vertex attribute queries
1822 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1823 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1824 case GL_COLOR_ARRAY_BUFFER_BINDING:
1825 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1826 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1827 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1828 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1829 break;
1830 case GL_VERTEX_ARRAY_STRIDE:
1831 case GL_NORMAL_ARRAY_STRIDE:
1832 case GL_COLOR_ARRAY_STRIDE:
1833 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1834 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1835 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1836 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1837 break;
1838 case GL_VERTEX_ARRAY_SIZE:
1839 case GL_COLOR_ARRAY_SIZE:
1840 case GL_TEXTURE_COORD_ARRAY_SIZE:
1841 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1842 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1843 break;
1844 case GL_VERTEX_ARRAY_TYPE:
1845 case GL_COLOR_ARRAY_TYPE:
1846 case GL_NORMAL_ARRAY_TYPE:
1847 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1848 case GL_TEXTURE_COORD_ARRAY_TYPE:
1849 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1850 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1851 break;
1852
jchen1082af6202018-06-22 10:59:52 +08001853 // GL_KHR_parallel_shader_compile
1854 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1855 *params = mGLState.getMaxShaderCompilerThreads();
1856 break;
1857
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001858 // GL_EXT_blend_func_extended
1859 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1860 *params = mExtensions.maxDualSourceDrawBuffers;
1861 break;
1862
Jamie Madill231c7f52017-04-26 13:45:37 -04001863 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001864 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001865 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001866 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001867}
1868
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001869void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001870{
Shannon Woods53a94a82014-06-24 15:20:36 -04001871 // Queries about context capabilities and maximums are answered by Context.
1872 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001873 switch (pname)
1874 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001875 case GL_MAX_ELEMENT_INDEX:
1876 *params = mCaps.maxElementIndex;
1877 break;
1878 case GL_MAX_UNIFORM_BLOCK_SIZE:
1879 *params = mCaps.maxUniformBlockSize;
1880 break;
1881 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001882 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001883 break;
1884 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001885 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001886 break;
1887 case GL_MAX_SERVER_WAIT_TIMEOUT:
1888 *params = mCaps.maxServerWaitTimeout;
1889 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001890
Jamie Madill231c7f52017-04-26 13:45:37 -04001891 // GL_EXT_disjoint_timer_query
1892 case GL_TIMESTAMP_EXT:
1893 *params = mImplementation->getTimestamp();
1894 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001895
Jamie Madill231c7f52017-04-26 13:45:37 -04001896 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1897 *params = mCaps.maxShaderStorageBlockSize;
1898 break;
1899 default:
1900 UNREACHABLE();
1901 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001902 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001903}
1904
Geoff Lang70d0f492015-12-10 17:45:46 -05001905void Context::getPointerv(GLenum pname, void **params) const
1906{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001907 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001908}
1909
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001910void Context::getPointervRobustANGLERobust(GLenum pname,
1911 GLsizei bufSize,
1912 GLsizei *length,
1913 void **params)
1914{
1915 UNIMPLEMENTED();
1916}
1917
Martin Radev66fb8202016-07-28 11:45:20 +03001918void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001919{
Shannon Woods53a94a82014-06-24 15:20:36 -04001920 // Queries about context capabilities and maximums are answered by Context.
1921 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001922
1923 GLenum nativeType;
1924 unsigned int numParams;
1925 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1926 ASSERT(queryStatus);
1927
1928 if (nativeType == GL_INT)
1929 {
1930 switch (target)
1931 {
1932 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1933 ASSERT(index < 3u);
1934 *data = mCaps.maxComputeWorkGroupCount[index];
1935 break;
1936 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1937 ASSERT(index < 3u);
1938 *data = mCaps.maxComputeWorkGroupSize[index];
1939 break;
1940 default:
1941 mGLState.getIntegeri_v(target, index, data);
1942 }
1943 }
1944 else
1945 {
1946 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1947 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001948}
1949
Brandon Jones59770802018-04-02 13:18:42 -07001950void Context::getIntegeri_vRobust(GLenum target,
1951 GLuint index,
1952 GLsizei bufSize,
1953 GLsizei *length,
1954 GLint *data)
1955{
1956 getIntegeri_v(target, index, data);
1957}
1958
Martin Radev66fb8202016-07-28 11:45:20 +03001959void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001960{
Shannon Woods53a94a82014-06-24 15:20:36 -04001961 // Queries about context capabilities and maximums are answered by Context.
1962 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001963
1964 GLenum nativeType;
1965 unsigned int numParams;
1966 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1967 ASSERT(queryStatus);
1968
1969 if (nativeType == GL_INT_64_ANGLEX)
1970 {
1971 mGLState.getInteger64i_v(target, index, data);
1972 }
1973 else
1974 {
1975 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1976 }
1977}
1978
Brandon Jones59770802018-04-02 13:18:42 -07001979void Context::getInteger64i_vRobust(GLenum target,
1980 GLuint index,
1981 GLsizei bufSize,
1982 GLsizei *length,
1983 GLint64 *data)
1984{
1985 getInteger64i_v(target, index, data);
1986}
1987
Martin Radev66fb8202016-07-28 11:45:20 +03001988void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1989{
1990 // Queries about context capabilities and maximums are answered by Context.
1991 // Queries about current GL state values are answered by State.
1992
1993 GLenum nativeType;
1994 unsigned int numParams;
1995 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1996 ASSERT(queryStatus);
1997
1998 if (nativeType == GL_BOOL)
1999 {
2000 mGLState.getBooleani_v(target, index, data);
2001 }
2002 else
2003 {
2004 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2005 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002006}
2007
Brandon Jones59770802018-04-02 13:18:42 -07002008void Context::getBooleani_vRobust(GLenum target,
2009 GLuint index,
2010 GLsizei bufSize,
2011 GLsizei *length,
2012 GLboolean *data)
2013{
2014 getBooleani_v(target, index, data);
2015}
2016
Corentin Wallez336129f2017-10-17 15:55:40 -04002017void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002018{
2019 Buffer *buffer = mGLState.getTargetBuffer(target);
2020 QueryBufferParameteriv(buffer, pname, params);
2021}
2022
Brandon Jones59770802018-04-02 13:18:42 -07002023void Context::getBufferParameterivRobust(BufferBinding target,
2024 GLenum pname,
2025 GLsizei bufSize,
2026 GLsizei *length,
2027 GLint *params)
2028{
2029 getBufferParameteriv(target, pname, params);
2030}
2031
He Yunchao010e4db2017-03-03 14:22:06 +08002032void Context::getFramebufferAttachmentParameteriv(GLenum target,
2033 GLenum attachment,
2034 GLenum pname,
2035 GLint *params)
2036{
2037 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002038 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002039}
2040
Brandon Jones59770802018-04-02 13:18:42 -07002041void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2042 GLenum attachment,
2043 GLenum pname,
2044 GLsizei bufSize,
2045 GLsizei *length,
2046 GLint *params)
2047{
2048 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2049}
2050
He Yunchao010e4db2017-03-03 14:22:06 +08002051void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2052{
2053 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2054 QueryRenderbufferiv(this, renderbuffer, pname, params);
2055}
2056
Brandon Jones59770802018-04-02 13:18:42 -07002057void Context::getRenderbufferParameterivRobust(GLenum target,
2058 GLenum pname,
2059 GLsizei bufSize,
2060 GLsizei *length,
2061 GLint *params)
2062{
2063 getRenderbufferParameteriv(target, pname, params);
2064}
2065
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002066void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002067{
Till Rathmannb8543632018-10-02 19:46:14 +02002068 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002069 QueryTexParameterfv(texture, pname, params);
2070}
2071
Brandon Jones59770802018-04-02 13:18:42 -07002072void Context::getTexParameterfvRobust(TextureType target,
2073 GLenum pname,
2074 GLsizei bufSize,
2075 GLsizei *length,
2076 GLfloat *params)
2077{
2078 getTexParameterfv(target, pname, params);
2079}
2080
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002081void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002082{
Till Rathmannb8543632018-10-02 19:46:14 +02002083 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002084 QueryTexParameteriv(texture, pname, params);
2085}
Jiajia Qin5451d532017-11-16 17:16:34 +08002086
Till Rathmannb8543632018-10-02 19:46:14 +02002087void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2088{
2089 const Texture *const texture = getTargetTexture(target);
2090 QueryTexParameterIiv(texture, pname, params);
2091}
2092
2093void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2094{
2095 const Texture *const texture = getTargetTexture(target);
2096 QueryTexParameterIuiv(texture, pname, params);
2097}
2098
Brandon Jones59770802018-04-02 13:18:42 -07002099void Context::getTexParameterivRobust(TextureType target,
2100 GLenum pname,
2101 GLsizei bufSize,
2102 GLsizei *length,
2103 GLint *params)
2104{
2105 getTexParameteriv(target, pname, params);
2106}
2107
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002108void Context::getTexParameterIivRobust(TextureType target,
2109 GLenum pname,
2110 GLsizei bufSize,
2111 GLsizei *length,
2112 GLint *params)
2113{
2114 UNIMPLEMENTED();
2115}
2116
2117void Context::getTexParameterIuivRobust(TextureType target,
2118 GLenum pname,
2119 GLsizei bufSize,
2120 GLsizei *length,
2121 GLuint *params)
2122{
2123 UNIMPLEMENTED();
2124}
2125
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002126void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002127{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002128 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002129 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002130}
2131
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002132void Context::getTexLevelParameterivRobust(TextureTarget target,
2133 GLint level,
2134 GLenum pname,
2135 GLsizei bufSize,
2136 GLsizei *length,
2137 GLint *params)
2138{
2139 UNIMPLEMENTED();
2140}
2141
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002142void Context::getTexLevelParameterfv(TextureTarget target,
2143 GLint level,
2144 GLenum pname,
2145 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002146{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002147 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002148 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002149}
2150
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002151void Context::getTexLevelParameterfvRobust(TextureTarget target,
2152 GLint level,
2153 GLenum pname,
2154 GLsizei bufSize,
2155 GLsizei *length,
2156 GLfloat *params)
2157{
2158 UNIMPLEMENTED();
2159}
2160
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002161void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002162{
Till Rathmannb8543632018-10-02 19:46:14 +02002163 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002164 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002165 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002166}
2167
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002168void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002169{
Till Rathmannb8543632018-10-02 19:46:14 +02002170 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002171 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002172 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002173}
2174
Brandon Jones59770802018-04-02 13:18:42 -07002175void Context::texParameterfvRobust(TextureType target,
2176 GLenum pname,
2177 GLsizei bufSize,
2178 const GLfloat *params)
2179{
2180 texParameterfv(target, pname, params);
2181}
2182
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002183void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002184{
Till Rathmannb8543632018-10-02 19:46:14 +02002185 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002186 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002187 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002188}
2189
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002190void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002191{
Till Rathmannb8543632018-10-02 19:46:14 +02002192 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002193 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002194 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002195}
2196
Till Rathmannb8543632018-10-02 19:46:14 +02002197void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2198{
2199 Texture *const texture = getTargetTexture(target);
2200 SetTexParameterIiv(this, texture, pname, params);
2201 onTextureChange(texture);
2202}
2203
2204void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2205{
2206 Texture *const texture = getTargetTexture(target);
2207 SetTexParameterIuiv(this, texture, pname, params);
2208 onTextureChange(texture);
2209}
2210
Brandon Jones59770802018-04-02 13:18:42 -07002211void Context::texParameterivRobust(TextureType target,
2212 GLenum pname,
2213 GLsizei bufSize,
2214 const GLint *params)
2215{
2216 texParameteriv(target, pname, params);
2217}
2218
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002219void Context::texParameterIivRobust(TextureType target,
2220 GLenum pname,
2221 GLsizei bufSize,
2222 const GLint *params)
2223{
2224 UNIMPLEMENTED();
2225}
2226
2227void Context::texParameterIuivRobust(TextureType target,
2228 GLenum pname,
2229 GLsizei bufSize,
2230 const GLuint *params)
2231{
2232 UNIMPLEMENTED();
2233}
2234
Jamie Madill493f9572018-05-24 19:52:15 -04002235void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002236{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002237 // No-op if count draws no primitives for given mode
2238 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002239 {
2240 return;
2241 }
2242
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002243 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002244 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002245 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002246}
2247
Jamie Madill493f9572018-05-24 19:52:15 -04002248void Context::drawArraysInstanced(PrimitiveMode mode,
2249 GLint first,
2250 GLsizei count,
2251 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002252{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002253 // No-op if count draws no primitives for given mode
2254 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002255 {
2256 return;
2257 }
2258
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002259 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002260 ANGLE_CONTEXT_TRY(
2261 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002262 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2263 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002264}
2265
Jamie Madill493f9572018-05-24 19:52:15 -04002266void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002267{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002268 // No-op if count draws no primitives for given mode
2269 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002270 {
2271 return;
2272 }
2273
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002274 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002275 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002276}
2277
Jamie Madill493f9572018-05-24 19:52:15 -04002278void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002279 GLsizei count,
2280 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002281 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002282 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002283{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002284 // No-op if count draws no primitives for given mode
2285 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002286 {
2287 return;
2288 }
2289
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002290 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002291 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002292 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002293}
2294
Jamie Madill493f9572018-05-24 19:52:15 -04002295void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002296 GLuint start,
2297 GLuint end,
2298 GLsizei count,
2299 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002300 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002301{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002302 // No-op if count draws no primitives for given mode
2303 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002304 {
2305 return;
2306 }
2307
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002308 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002309 ANGLE_CONTEXT_TRY(
2310 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002311}
2312
Jamie Madill493f9572018-05-24 19:52:15 -04002313void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002314{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002315 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002316 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002317}
2318
Jamie Madill493f9572018-05-24 19:52:15 -04002319void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002320{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002321 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002322 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002323}
2324
Jamie Madill675fe712016-12-19 13:07:54 -05002325void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002326{
Jamie Madillafa02a22017-11-23 12:57:38 -05002327 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002328}
2329
Jamie Madill675fe712016-12-19 13:07:54 -05002330void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002331{
Jamie Madillafa02a22017-11-23 12:57:38 -05002332 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002333}
2334
Austin Kinross6ee1e782015-05-29 17:05:37 -07002335void Context::insertEventMarker(GLsizei length, const char *marker)
2336{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002337 ASSERT(mImplementation);
2338 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002339}
2340
2341void Context::pushGroupMarker(GLsizei length, const char *marker)
2342{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002343 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002344
2345 if (marker == nullptr)
2346 {
2347 // From the EXT_debug_marker spec,
2348 // "If <marker> is null then an empty string is pushed on the stack."
2349 mImplementation->pushGroupMarker(length, "");
2350 }
2351 else
2352 {
2353 mImplementation->pushGroupMarker(length, marker);
2354 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002355}
2356
2357void Context::popGroupMarker()
2358{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002359 ASSERT(mImplementation);
2360 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002361}
2362
Geoff Langd8605522016-04-13 10:19:12 -04002363void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2364{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002365 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002366 ASSERT(programObject);
2367
2368 programObject->bindUniformLocation(location, name);
2369}
2370
Brandon Jones59770802018-04-02 13:18:42 -07002371void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002372{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002373 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002374}
2375
Brandon Jones59770802018-04-02 13:18:42 -07002376void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002377{
2378 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2379}
2380
Brandon Jones59770802018-04-02 13:18:42 -07002381void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002382{
2383 GLfloat I[16];
2384 angle::Matrix<GLfloat>::setToIdentity(I);
2385
2386 mGLState.loadPathRenderingMatrix(matrixMode, I);
2387}
2388
2389void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2390{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002391 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002392 if (!pathObj)
2393 return;
2394
Geoff Lang9bf86f02018-07-26 11:46:34 -04002395 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002396
2397 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2398}
2399
2400void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2401{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002402 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002403 if (!pathObj)
2404 return;
2405
Geoff Lang9bf86f02018-07-26 11:46:34 -04002406 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002407
2408 mImplementation->stencilStrokePath(pathObj, reference, mask);
2409}
2410
2411void Context::coverFillPath(GLuint path, GLenum coverMode)
2412{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002413 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002414 if (!pathObj)
2415 return;
2416
Geoff Lang9bf86f02018-07-26 11:46:34 -04002417 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002418
2419 mImplementation->coverFillPath(pathObj, coverMode);
2420}
2421
2422void Context::coverStrokePath(GLuint path, GLenum coverMode)
2423{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002424 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002425 if (!pathObj)
2426 return;
2427
Geoff Lang9bf86f02018-07-26 11:46:34 -04002428 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002429
2430 mImplementation->coverStrokePath(pathObj, coverMode);
2431}
2432
2433void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2434{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002435 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002436 if (!pathObj)
2437 return;
2438
Geoff Lang9bf86f02018-07-26 11:46:34 -04002439 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002440
2441 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2442}
2443
2444void Context::stencilThenCoverStrokePath(GLuint path,
2445 GLint reference,
2446 GLuint mask,
2447 GLenum coverMode)
2448{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002449 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002450 if (!pathObj)
2451 return;
2452
Geoff Lang9bf86f02018-07-26 11:46:34 -04002453 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002454
2455 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2456}
2457
Sami Väisänend59ca052016-06-21 16:10:00 +03002458void Context::coverFillPathInstanced(GLsizei numPaths,
2459 GLenum pathNameType,
2460 const void *paths,
2461 GLuint pathBase,
2462 GLenum coverMode,
2463 GLenum transformType,
2464 const GLfloat *transformValues)
2465{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002466 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002467
Geoff Lang9bf86f02018-07-26 11:46:34 -04002468 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002469
2470 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2471}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002472
Sami Väisänend59ca052016-06-21 16:10:00 +03002473void Context::coverStrokePathInstanced(GLsizei numPaths,
2474 GLenum pathNameType,
2475 const void *paths,
2476 GLuint pathBase,
2477 GLenum coverMode,
2478 GLenum transformType,
2479 const GLfloat *transformValues)
2480{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002481 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002482
2483 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002484 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002485
2486 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2487 transformValues);
2488}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002489
Sami Väisänend59ca052016-06-21 16:10:00 +03002490void Context::stencilFillPathInstanced(GLsizei numPaths,
2491 GLenum pathNameType,
2492 const void *paths,
2493 GLuint pathBase,
2494 GLenum fillMode,
2495 GLuint mask,
2496 GLenum transformType,
2497 const GLfloat *transformValues)
2498{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002499 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002500
2501 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002502 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002503
2504 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2505 transformValues);
2506}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002507
Sami Väisänend59ca052016-06-21 16:10:00 +03002508void Context::stencilStrokePathInstanced(GLsizei numPaths,
2509 GLenum pathNameType,
2510 const void *paths,
2511 GLuint pathBase,
2512 GLint reference,
2513 GLuint mask,
2514 GLenum transformType,
2515 const GLfloat *transformValues)
2516{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002517 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002518
Geoff Lang9bf86f02018-07-26 11:46:34 -04002519 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002520
2521 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2522 transformValues);
2523}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002524
Sami Väisänend59ca052016-06-21 16:10:00 +03002525void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2526 GLenum pathNameType,
2527 const void *paths,
2528 GLuint pathBase,
2529 GLenum fillMode,
2530 GLuint mask,
2531 GLenum coverMode,
2532 GLenum transformType,
2533 const GLfloat *transformValues)
2534{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002535 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002536
Geoff Lang9bf86f02018-07-26 11:46:34 -04002537 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002538
2539 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2540 transformType, transformValues);
2541}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002542
Sami Väisänend59ca052016-06-21 16:10:00 +03002543void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2544 GLenum pathNameType,
2545 const void *paths,
2546 GLuint pathBase,
2547 GLint reference,
2548 GLuint mask,
2549 GLenum coverMode,
2550 GLenum transformType,
2551 const GLfloat *transformValues)
2552{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002553 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002554
Geoff Lang9bf86f02018-07-26 11:46:34 -04002555 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002556
2557 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2558 transformType, transformValues);
2559}
2560
Sami Väisänen46eaa942016-06-29 10:26:37 +03002561void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2562{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002563 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002564
2565 programObject->bindFragmentInputLocation(location, name);
2566}
2567
2568void Context::programPathFragmentInputGen(GLuint program,
2569 GLint location,
2570 GLenum genMode,
2571 GLint components,
2572 const GLfloat *coeffs)
2573{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002574 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002575
jchen103fd614d2018-08-13 12:21:58 +08002576 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002577}
2578
jchen1015015f72017-03-16 13:54:21 +08002579GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2580{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002581 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002582 return QueryProgramResourceIndex(programObject, programInterface, name);
2583}
2584
jchen10fd7c3b52017-03-21 15:36:03 +08002585void Context::getProgramResourceName(GLuint program,
2586 GLenum programInterface,
2587 GLuint index,
2588 GLsizei bufSize,
2589 GLsizei *length,
2590 GLchar *name)
2591{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002592 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002593 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2594}
2595
jchen10191381f2017-04-11 13:59:04 +08002596GLint Context::getProgramResourceLocation(GLuint program,
2597 GLenum programInterface,
2598 const GLchar *name)
2599{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002600 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002601 return QueryProgramResourceLocation(programObject, programInterface, name);
2602}
2603
jchen10880683b2017-04-12 16:21:55 +08002604void Context::getProgramResourceiv(GLuint program,
2605 GLenum programInterface,
2606 GLuint index,
2607 GLsizei propCount,
2608 const GLenum *props,
2609 GLsizei bufSize,
2610 GLsizei *length,
2611 GLint *params)
2612{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002613 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002614 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2615 length, params);
2616}
2617
jchen10d9cd7b72017-08-30 15:04:25 +08002618void Context::getProgramInterfaceiv(GLuint program,
2619 GLenum programInterface,
2620 GLenum pname,
2621 GLint *params)
2622{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002623 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002624 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2625}
2626
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002627void Context::getProgramInterfaceivRobust(GLuint program,
2628 GLenum programInterface,
2629 GLenum pname,
2630 GLsizei bufSize,
2631 GLsizei *length,
2632 GLint *params)
2633{
2634 UNIMPLEMENTED();
2635}
2636
Jamie Madill306b6c12018-07-27 08:12:49 -04002637void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002638{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002639 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002640}
2641
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002642void Context::handleError(GLenum errorCode,
2643 const char *message,
2644 const char *file,
2645 const char *function,
2646 unsigned int line)
2647{
2648 mErrors.handleError(errorCode, message, file, function, line);
2649}
2650
Jamie Madilla139f012018-10-10 16:13:03 -04002651void Context::validationError(GLenum errorCode, const char *message)
2652{
2653 mErrors.validationError(errorCode, message);
2654}
2655
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002656// Get one of the recorded errors and clear its flag, if any.
2657// [OpenGL ES 2.0.24] section 2.5 page 13.
2658GLenum Context::getError()
2659{
Geoff Langda5777c2014-07-11 09:52:58 -04002660 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002661 {
Geoff Langda5777c2014-07-11 09:52:58 -04002662 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002663 }
Geoff Langda5777c2014-07-11 09:52:58 -04002664 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002665 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002666 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002667 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002668}
2669
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002670// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002671void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002672{
2673 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002674 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002675 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002676 mContextLostForced = true;
2677 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002678 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002679}
2680
Jamie Madillfa920eb2018-01-04 11:45:50 -05002681GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002682{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002683 // Even if the application doesn't want to know about resets, we want to know
2684 // as it will allow us to skip all the calls.
2685 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002686 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002687 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002688 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002689 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002690 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002691
2692 // EXT_robustness, section 2.6: If the reset notification behavior is
2693 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2694 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2695 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002696 }
2697
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002698 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2699 // status should be returned at least once, and GL_NO_ERROR should be returned
2700 // once the device has finished resetting.
2701 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002702 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002703 ASSERT(mResetStatus == GL_NO_ERROR);
2704 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002705
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002706 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002707 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002708 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002709 }
2710 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002711 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002712 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002713 // If markContextLost was used to mark the context lost then
2714 // assume that is not recoverable, and continue to report the
2715 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002716 mResetStatus = mImplementation->getResetStatus();
2717 }
Jamie Madill893ab082014-05-16 16:56:10 -04002718
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002719 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002720}
2721
2722bool Context::isResetNotificationEnabled()
2723{
2724 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2725}
2726
Corentin Walleze3b10e82015-05-20 11:06:25 -04002727const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002728{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002729 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002730}
2731
2732EGLenum Context::getClientType() const
2733{
2734 return mClientType;
2735}
2736
2737EGLenum Context::getRenderBuffer() const
2738{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002739 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2740 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002741 {
2742 return EGL_NONE;
2743 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002744
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002745 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002746 ASSERT(backAttachment != nullptr);
2747 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002748}
2749
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002750VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002751{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002752 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002753 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2754 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002755 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002756 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2757 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002758
Jamie Madill96a483b2017-06-27 16:49:21 -04002759 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002760 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002761
2762 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002763}
2764
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002765TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002766{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002767 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002768 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2769 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002770 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002771 transformFeedback =
2772 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002773 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002774 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002775 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002776
2777 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002778}
2779
2780bool Context::isVertexArrayGenerated(GLuint vertexArray)
2781{
Jamie Madill96a483b2017-06-27 16:49:21 -04002782 ASSERT(mVertexArrayMap.contains(0));
2783 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002784}
2785
2786bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2787{
Jamie Madill96a483b2017-06-27 16:49:21 -04002788 ASSERT(mTransformFeedbackMap.contains(0));
2789 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002790}
2791
Shannon Woods53a94a82014-06-24 15:20:36 -04002792void Context::detachTexture(GLuint texture)
2793{
2794 // Simple pass-through to State's detachTexture method, as textures do not require
2795 // allocation map management either here or in the resource manager at detach time.
2796 // Zero textures are held by the Context, and we don't attempt to request them from
2797 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002798 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002799}
2800
James Darpinian4d9d4832018-03-13 12:43:28 -07002801void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002802{
Yuly Novikov5807a532015-12-03 13:01:22 -05002803 // Simple pass-through to State's detachBuffer method, since
2804 // only buffer attachments to container objects that are bound to the current context
2805 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002806
Yuly Novikov5807a532015-12-03 13:01:22 -05002807 // [OpenGL ES 3.2] section 5.1.2 page 45:
2808 // Attachments to unbound container objects, such as
2809 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2810 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002811 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002812}
2813
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002814void Context::detachFramebuffer(GLuint framebuffer)
2815{
Shannon Woods53a94a82014-06-24 15:20:36 -04002816 // Framebuffer detachment is handled by Context, because 0 is a valid
2817 // Framebuffer object, and a pointer to it must be passed from Context
2818 // to State at binding time.
2819
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002820 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002821 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2822 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2823 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002824
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002825 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002826 {
2827 bindReadFramebuffer(0);
2828 }
2829
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002830 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002831 {
2832 bindDrawFramebuffer(0);
2833 }
2834}
2835
2836void Context::detachRenderbuffer(GLuint renderbuffer)
2837{
Jamie Madilla02315b2017-02-23 14:14:47 -05002838 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002839}
2840
Jamie Madill57a89722013-07-02 11:57:03 -04002841void Context::detachVertexArray(GLuint vertexArray)
2842{
Jamie Madill77a72f62015-04-14 11:18:32 -04002843 // Vertex array detachment is handled by Context, because 0 is a valid
2844 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002845 // binding time.
2846
Jamie Madill57a89722013-07-02 11:57:03 -04002847 // [OpenGL ES 3.0.2] section 2.10 page 43:
2848 // If a vertex array object that is currently bound is deleted, the binding
2849 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002850 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002851 {
2852 bindVertexArray(0);
2853 }
2854}
2855
Geoff Langc8058452014-02-03 12:04:11 -05002856void Context::detachTransformFeedback(GLuint transformFeedback)
2857{
Corentin Walleza2257da2016-04-19 16:43:12 -04002858 // Transform feedback detachment is handled by Context, because 0 is a valid
2859 // transform feedback, and a pointer to it must be passed from Context to State at
2860 // binding time.
2861
2862 // The OpenGL specification doesn't mention what should happen when the currently bound
2863 // transform feedback object is deleted. Since it is a container object, we treat it like
2864 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002865 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002866 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002867 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002868 }
Geoff Langc8058452014-02-03 12:04:11 -05002869}
2870
Jamie Madilldc356042013-07-19 16:36:57 -04002871void Context::detachSampler(GLuint sampler)
2872{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002873 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002874}
2875
Yunchao Hea336b902017-08-02 16:05:21 +08002876void Context::detachProgramPipeline(GLuint pipeline)
2877{
2878 mGLState.detachProgramPipeline(this, pipeline);
2879}
2880
Jamie Madill3ef140a2017-08-26 23:11:21 -04002881void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002882{
Shaodde78e82017-05-22 14:13:27 +08002883 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002884 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002885}
2886
Jamie Madille29d1672013-07-19 16:36:57 -04002887void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2888{
Till Rathmannb8543632018-10-02 19:46:14 +02002889 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002890 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002891 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002892}
Jamie Madille29d1672013-07-19 16:36:57 -04002893
Geoff Langc1984ed2016-10-07 12:41:00 -04002894void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2895{
Till Rathmannb8543632018-10-02 19:46:14 +02002896 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002897 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002898 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002899}
2900
Till Rathmannb8543632018-10-02 19:46:14 +02002901void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2902{
2903 Sampler *const samplerObject =
2904 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2905 SetSamplerParameterIiv(this, samplerObject, pname, param);
2906}
2907
2908void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2909{
2910 Sampler *const samplerObject =
2911 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2912 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2913}
2914
Brandon Jones59770802018-04-02 13:18:42 -07002915void Context::samplerParameterivRobust(GLuint sampler,
2916 GLenum pname,
2917 GLsizei bufSize,
2918 const GLint *param)
2919{
2920 samplerParameteriv(sampler, pname, param);
2921}
2922
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002923void Context::samplerParameterIivRobust(GLuint sampler,
2924 GLenum pname,
2925 GLsizei bufSize,
2926 const GLint *param)
2927{
2928 UNIMPLEMENTED();
2929}
2930
2931void Context::samplerParameterIuivRobust(GLuint sampler,
2932 GLenum pname,
2933 GLsizei bufSize,
2934 const GLuint *param)
2935{
2936 UNIMPLEMENTED();
2937}
2938
Jamie Madille29d1672013-07-19 16:36:57 -04002939void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2940{
Till Rathmannb8543632018-10-02 19:46:14 +02002941 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002942 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002943 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002944}
2945
Geoff Langc1984ed2016-10-07 12:41:00 -04002946void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002947{
Till Rathmannb8543632018-10-02 19:46:14 +02002948 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002949 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002950 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002951}
2952
Brandon Jones59770802018-04-02 13:18:42 -07002953void Context::samplerParameterfvRobust(GLuint sampler,
2954 GLenum pname,
2955 GLsizei bufSize,
2956 const GLfloat *param)
2957{
2958 samplerParameterfv(sampler, pname, param);
2959}
2960
Geoff Langc1984ed2016-10-07 12:41:00 -04002961void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002962{
Till Rathmannb8543632018-10-02 19:46:14 +02002963 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002964 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002965 QuerySamplerParameteriv(samplerObject, pname, params);
2966}
Jamie Madill9675b802013-07-19 16:36:59 -04002967
Till Rathmannb8543632018-10-02 19:46:14 +02002968void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2969{
2970 const Sampler *const samplerObject =
2971 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2972 QuerySamplerParameterIiv(samplerObject, pname, params);
2973}
2974
2975void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2976{
2977 const Sampler *const samplerObject =
2978 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2979 QuerySamplerParameterIuiv(samplerObject, pname, params);
2980}
2981
Brandon Jones59770802018-04-02 13:18:42 -07002982void Context::getSamplerParameterivRobust(GLuint sampler,
2983 GLenum pname,
2984 GLsizei bufSize,
2985 GLsizei *length,
2986 GLint *params)
2987{
2988 getSamplerParameteriv(sampler, pname, params);
2989}
2990
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002991void Context::getSamplerParameterIivRobust(GLuint sampler,
2992 GLenum pname,
2993 GLsizei bufSize,
2994 GLsizei *length,
2995 GLint *params)
2996{
2997 UNIMPLEMENTED();
2998}
2999
3000void Context::getSamplerParameterIuivRobust(GLuint sampler,
3001 GLenum pname,
3002 GLsizei bufSize,
3003 GLsizei *length,
3004 GLuint *params)
3005{
3006 UNIMPLEMENTED();
3007}
3008
Geoff Langc1984ed2016-10-07 12:41:00 -04003009void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
3010{
Till Rathmannb8543632018-10-02 19:46:14 +02003011 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05003012 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04003013 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04003014}
3015
Brandon Jones59770802018-04-02 13:18:42 -07003016void Context::getSamplerParameterfvRobust(GLuint sampler,
3017 GLenum pname,
3018 GLsizei bufSize,
3019 GLsizei *length,
3020 GLfloat *params)
3021{
3022 getSamplerParameterfv(sampler, pname, params);
3023}
3024
Olli Etuahof0fee072016-03-30 15:11:58 +03003025void Context::programParameteri(GLuint program, GLenum pname, GLint value)
3026{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04003027 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08003028 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03003029}
3030
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003031void Context::initRendererString()
3032{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003033 std::ostringstream rendererString;
3034 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003035 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003036 rendererString << ")";
3037
Geoff Langcec35902014-04-16 10:52:36 -04003038 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003039}
3040
Geoff Langc339c4e2016-11-29 10:37:36 -05003041void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003042{
Geoff Langc339c4e2016-11-29 10:37:36 -05003043 const Version &clientVersion = getClientVersion();
3044
3045 std::ostringstream versionString;
3046 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3047 << ANGLE_VERSION_STRING << ")";
3048 mVersionString = MakeStaticString(versionString.str());
3049
3050 std::ostringstream shadingLanguageVersionString;
3051 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3052 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3053 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3054 << ")";
3055 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003056}
3057
Geoff Langcec35902014-04-16 10:52:36 -04003058void Context::initExtensionStrings()
3059{
Geoff Langc339c4e2016-11-29 10:37:36 -05003060 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3061 std::ostringstream combinedStringStream;
3062 std::copy(strings.begin(), strings.end(),
3063 std::ostream_iterator<const char *>(combinedStringStream, " "));
3064 return MakeStaticString(combinedStringStream.str());
3065 };
3066
3067 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003068 for (const auto &extensionString : mExtensions.getStrings())
3069 {
3070 mExtensionStrings.push_back(MakeStaticString(extensionString));
3071 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003072 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003073
Geoff Langc339c4e2016-11-29 10:37:36 -05003074 mRequestableExtensionStrings.clear();
3075 for (const auto &extensionInfo : GetExtensionInfoMap())
3076 {
3077 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003078 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003079 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003080 {
3081 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3082 }
3083 }
3084 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003085}
3086
Geoff Langc339c4e2016-11-29 10:37:36 -05003087const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003088{
Geoff Langc339c4e2016-11-29 10:37:36 -05003089 switch (name)
3090 {
3091 case GL_VENDOR:
3092 return reinterpret_cast<const GLubyte *>("Google Inc.");
3093
3094 case GL_RENDERER:
3095 return reinterpret_cast<const GLubyte *>(mRendererString);
3096
3097 case GL_VERSION:
3098 return reinterpret_cast<const GLubyte *>(mVersionString);
3099
3100 case GL_SHADING_LANGUAGE_VERSION:
3101 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3102
3103 case GL_EXTENSIONS:
3104 return reinterpret_cast<const GLubyte *>(mExtensionString);
3105
3106 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3107 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3108
3109 default:
3110 UNREACHABLE();
3111 return nullptr;
3112 }
Geoff Langcec35902014-04-16 10:52:36 -04003113}
3114
Geoff Langc339c4e2016-11-29 10:37:36 -05003115const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003116{
Geoff Langc339c4e2016-11-29 10:37:36 -05003117 switch (name)
3118 {
3119 case GL_EXTENSIONS:
3120 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3121
3122 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3123 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3124
3125 default:
3126 UNREACHABLE();
3127 return nullptr;
3128 }
Geoff Langcec35902014-04-16 10:52:36 -04003129}
3130
3131size_t Context::getExtensionStringCount() const
3132{
3133 return mExtensionStrings.size();
3134}
3135
Geoff Lang111a99e2017-10-17 10:58:41 -04003136bool Context::isExtensionRequestable(const char *name)
3137{
3138 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3139 auto extension = extensionInfos.find(name);
3140
Geoff Lang111a99e2017-10-17 10:58:41 -04003141 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003142 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003143}
3144
Geoff Langc339c4e2016-11-29 10:37:36 -05003145void Context::requestExtension(const char *name)
3146{
3147 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3148 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3149 const auto &extension = extensionInfos.at(name);
3150 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003151 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003152
3153 if (mExtensions.*(extension.ExtensionsMember))
3154 {
3155 // Extension already enabled
3156 return;
3157 }
3158
3159 mExtensions.*(extension.ExtensionsMember) = true;
3160 updateCaps();
3161 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003162
Jamie Madill2f348d22017-06-05 10:50:59 -04003163 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3164 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003165
Jamie Madill81c2e252017-09-09 23:32:46 -04003166 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3167 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003168 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003169 for (auto &zeroTexture : mZeroTextures)
3170 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003171 if (zeroTexture.get() != nullptr)
3172 {
3173 zeroTexture->signalDirty(this, InitState::Initialized);
3174 }
Geoff Lang9aded172017-04-05 11:07:56 -04003175 }
3176
Jamie Madillb983a4b2018-08-01 11:34:51 -04003177 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003178}
3179
3180size_t Context::getRequestableExtensionStringCount() const
3181{
3182 return mRequestableExtensionStrings.size();
3183}
3184
Jamie Madill493f9572018-05-24 19:52:15 -04003185void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003186{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003187 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003188 ASSERT(transformFeedback != nullptr);
3189 ASSERT(!transformFeedback->isPaused());
3190
Jamie Madill6c1f6712017-02-14 19:08:04 -05003191 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003192 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003193}
3194
3195bool Context::hasActiveTransformFeedback(GLuint program) const
3196{
3197 for (auto pair : mTransformFeedbackMap)
3198 {
3199 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3200 {
3201 return true;
3202 }
3203 }
3204 return false;
3205}
3206
Geoff Lang33f11fb2018-05-07 13:42:47 -04003207Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003208{
3209 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3210
jchen1082af6202018-06-22 10:59:52 +08003211 // Explicitly enable GL_KHR_parallel_shader_compile
3212 supportedExtensions.parallelShaderCompile = true;
3213
Geoff Langb0f917f2017-12-05 13:41:54 -05003214 if (getClientVersion() < ES_2_0)
3215 {
3216 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003217 supportedExtensions.pointSizeArray = true;
3218 supportedExtensions.textureCubeMap = true;
3219 supportedExtensions.pointSprite = true;
3220 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003221 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003222 }
3223
3224 if (getClientVersion() < ES_3_0)
3225 {
3226 // Disable ES3+ extensions
3227 supportedExtensions.colorBufferFloat = false;
3228 supportedExtensions.eglImageExternalEssl3 = false;
3229 supportedExtensions.textureNorm16 = false;
3230 supportedExtensions.multiview = false;
3231 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003232 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003233 supportedExtensions.textureMultisample = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003234 }
3235
3236 if (getClientVersion() < ES_3_1)
3237 {
3238 // Disable ES3.1+ extensions
3239 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003240
3241 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3242 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003243 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003244 }
3245
3246 if (getClientVersion() > ES_2_0)
3247 {
3248 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3249 // supportedExtensions.sRGB = false;
3250 }
3251
3252 // Some extensions are always available because they are implemented in the GL layer.
3253 supportedExtensions.bindUniformLocation = true;
3254 supportedExtensions.vertexArrayObject = true;
3255 supportedExtensions.bindGeneratesResource = true;
3256 supportedExtensions.clientArrays = true;
3257 supportedExtensions.requestExtension = true;
Austin Eng7cf9cd22018-10-09 15:27:32 -07003258 supportedExtensions.multiDraw = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003259
3260 // Enable the no error extension if the context was created with the flag.
3261 supportedExtensions.noError = mSkipValidation;
3262
3263 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003264 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003265
3266 // Explicitly enable GL_KHR_debug
3267 supportedExtensions.debug = true;
3268 supportedExtensions.maxDebugMessageLength = 1024;
3269 supportedExtensions.maxDebugLoggedMessages = 1024;
3270 supportedExtensions.maxDebugGroupStackDepth = 1024;
3271 supportedExtensions.maxLabelLength = 1024;
3272
3273 // Explicitly enable GL_ANGLE_robust_client_memory
3274 supportedExtensions.robustClientMemory = true;
3275
3276 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003277 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003278
3279 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3280 // supports it.
3281 supportedExtensions.robustBufferAccessBehavior =
3282 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3283
3284 // Enable the cache control query unconditionally.
3285 supportedExtensions.programCacheControl = true;
3286
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003287 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003288 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003289 {
3290 // GL_ANGLE_explicit_context_gles1
3291 supportedExtensions.explicitContextGles1 = true;
3292 // GL_ANGLE_explicit_context
3293 supportedExtensions.explicitContext = true;
3294 }
3295
Geoff Lang79b91402018-10-04 15:11:30 -04003296 supportedExtensions.memorySize = true;
3297
Geoff Langb0f917f2017-12-05 13:41:54 -05003298 return supportedExtensions;
3299}
3300
Geoff Lang33f11fb2018-05-07 13:42:47 -04003301void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003302{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003303 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003304
Geoff Lang33f11fb2018-05-07 13:42:47 -04003305 mSupportedExtensions = generateSupportedExtensions();
3306 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003307
3308 mLimitations = mImplementation->getNativeLimitations();
3309
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003310 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3311 if (getClientVersion() < Version(2, 0))
3312 {
3313 mCaps.maxMultitextureUnits = 4;
3314 mCaps.maxClipPlanes = 6;
3315 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003316 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3317 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3318 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003319 mCaps.minSmoothPointSize = 1.0f;
3320 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003321 mCaps.minSmoothLineWidth = 1.0f;
3322 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003323 }
3324
Luc Ferronad2ae932018-06-11 15:31:17 -04003325 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003326 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003327
Luc Ferronad2ae932018-06-11 15:31:17 -04003328 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3329
Jamie Madill0f80ed82017-09-19 00:24:56 -04003330 if (getClientVersion() < ES_3_1)
3331 {
3332 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3333 }
3334 else
3335 {
3336 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3337 }
Geoff Lang301d1612014-07-09 10:34:37 -04003338
Jiawei Shao54aafe52018-04-27 14:54:57 +08003339 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3340 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003341 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3342
Jamie Madill0f80ed82017-09-19 00:24:56 -04003343 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3344 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3345
3346 // Limit textures as well, so we can use fast bitsets with texture bindings.
3347 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003348 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3349 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3350 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3351 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003352
Jiawei Shaodb342272017-09-27 10:21:45 +08003353 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3354
Geoff Langc287ea62016-09-16 14:46:51 -04003355 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003356 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003357 for (const auto &extensionInfo : GetExtensionInfoMap())
3358 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003359 // If the user has requested that extensions start disabled and they are requestable,
3360 // disable them.
3361 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003362 {
3363 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3364 }
3365 }
3366
3367 // Generate texture caps
3368 updateCaps();
3369}
3370
3371void Context::updateCaps()
3372{
Geoff Lang900013c2014-07-07 11:32:19 -04003373 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003374 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003375
Jamie Madill7b62cf92017-11-02 15:20:49 -04003376 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003377 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003378 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003379 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003380
Geoff Lang0d8b7242015-09-09 14:56:53 -04003381 // Update the format caps based on the client version and extensions.
3382 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3383 // ES3.
3384 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003385 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003386 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003387 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003388 formatCaps.textureAttachment =
3389 formatCaps.textureAttachment &&
3390 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3391 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3392 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003393
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003394 // OpenGL ES does not support multisampling with non-rendererable formats
3395 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003396 if (!formatCaps.renderbuffer ||
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003397 (getClientVersion() < ES_3_1 && !mSupportedExtensions.textureMultisample &&
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003398 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003399 {
Geoff Langd87878e2014-09-19 15:42:59 -04003400 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003401 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003402 else
3403 {
3404 // We may have limited the max samples for some required renderbuffer formats due to
3405 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3406 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3407
3408 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3409 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3410 // exception of signed and unsigned integer formats."
3411 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3412 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3413 {
3414 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3415 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3416 }
3417
3418 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003419 if (getClientVersion() >= ES_3_1 || mSupportedExtensions.textureMultisample)
Olli Etuaho50c562d2017-06-06 14:43:30 +03003420 {
3421 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3422 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3423 // the exception that the signed and unsigned integer formats are required only to
3424 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3425 // multisamples, which must be at least one."
3426 if (formatInfo.componentType == GL_INT ||
3427 formatInfo.componentType == GL_UNSIGNED_INT)
3428 {
3429 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3430 }
3431
3432 // GLES 3.1 section 19.3.1.
3433 if (formatCaps.texturable)
3434 {
3435 if (formatInfo.depthBits > 0)
3436 {
3437 mCaps.maxDepthTextureSamples =
3438 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3439 }
3440 else if (formatInfo.redBits > 0)
3441 {
3442 mCaps.maxColorTextureSamples =
3443 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3444 }
3445 }
3446 }
3447 }
Geoff Langd87878e2014-09-19 15:42:59 -04003448
3449 if (formatCaps.texturable && formatInfo.compressed)
3450 {
Geoff Langca271392017-04-05 12:30:00 -04003451 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003452 }
3453
Geoff Langca271392017-04-05 12:30:00 -04003454 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003455 }
Jamie Madill32447362017-06-28 14:53:52 -04003456
3457 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003458 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003459 {
3460 mMemoryProgramCache = nullptr;
3461 }
Corentin Walleze4477002017-12-01 14:39:58 -05003462
3463 // Compute which buffer types are allowed
3464 mValidBufferBindings.reset();
3465 mValidBufferBindings.set(BufferBinding::ElementArray);
3466 mValidBufferBindings.set(BufferBinding::Array);
3467
3468 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3469 {
3470 mValidBufferBindings.set(BufferBinding::PixelPack);
3471 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3472 }
3473
3474 if (getClientVersion() >= ES_3_0)
3475 {
3476 mValidBufferBindings.set(BufferBinding::CopyRead);
3477 mValidBufferBindings.set(BufferBinding::CopyWrite);
3478 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3479 mValidBufferBindings.set(BufferBinding::Uniform);
3480 }
3481
3482 if (getClientVersion() >= ES_3_1)
3483 {
3484 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3485 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3486 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3487 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3488 }
jchen107ae70d82018-07-06 13:47:01 +08003489
3490 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003491
3492 // Reinitialize state cache after extension changes.
3493 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003494}
3495
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003496void Context::initWorkarounds()
3497{
Jamie Madill761b02c2017-06-23 16:27:06 -04003498 // Apply back-end workarounds.
3499 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3500
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003501 // Lose the context upon out of memory error if the application is
3502 // expecting to watch for those events.
3503 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003504
3505 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3506 {
3507 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3508 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3509 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3510 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003511}
3512
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003513// Return true if the draw is a no-op, else return false.
3514// A no-op draw occurs if the count of vertices is less than the minimum required to
3515// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3516bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3517{
3518 return count < kMinimumPrimitiveCounts[mode];
3519}
3520
3521bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3522{
3523 return (instanceCount == 0) || noopDraw(mode, count);
3524}
3525
Jamie Madilld9ee8bf2018-11-12 20:04:20 -05003526ANGLE_INLINE angle::Result Context::syncDirtyBits()
3527{
3528 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
3529 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
3530 mGLState.clearDirtyBits();
3531 return angle::Result::Continue();
3532}
3533
3534ANGLE_INLINE angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
3535{
3536 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
3537 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
3538 mGLState.clearDirtyBits(dirtyBits);
3539 return angle::Result::Continue();
3540}
3541
3542ANGLE_INLINE angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
3543{
3544 return mGLState.syncDirtyObjects(this, objectMask);
3545}
3546
Jamie Madill6f755b22018-10-09 12:48:54 -04003547angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003548{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003549 if (mGLES1Renderer)
3550 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003551 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003552 }
3553
Geoff Lang9bf86f02018-07-26 11:46:34 -04003554 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003555
3556 if (isRobustResourceInitEnabled())
3557 {
3558 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3559 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3560 }
3561
Jamie Madilld9ee8bf2018-11-12 20:04:20 -05003562 return syncDirtyBits();
Geoff Langd4fff502017-09-22 11:28:28 -04003563}
3564
3565Error Context::prepareForClear(GLbitfield mask)
3566{
Geoff Langa8cb2872018-03-09 16:09:40 -05003567 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003568 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003569 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003570 return NoError();
3571}
3572
3573Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3574{
Geoff Langa8cb2872018-03-09 16:09:40 -05003575 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003576 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3577 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003578 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003579 return NoError();
3580}
3581
Geoff Langa8cb2872018-03-09 16:09:40 -05003582Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003583{
Geoff Langa8cb2872018-03-09 16:09:40 -05003584 ANGLE_TRY(syncDirtyObjects(objectMask));
3585 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003586 return NoError();
3587}
3588
Jamie Madillc29968b2016-01-20 11:17:23 -05003589void Context::blitFramebuffer(GLint srcX0,
3590 GLint srcY0,
3591 GLint srcX1,
3592 GLint srcY1,
3593 GLint dstX0,
3594 GLint dstY0,
3595 GLint dstX1,
3596 GLint dstY1,
3597 GLbitfield mask,
3598 GLenum filter)
3599{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003600 if (mask == 0)
3601 {
3602 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3603 // buffers are copied.
3604 return;
3605 }
3606
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003607 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003608 ASSERT(drawFramebuffer);
3609
3610 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3611 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3612
Jamie Madillbc918e72018-03-08 09:47:21 -05003613 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003614
Jamie Madillc564c072017-06-01 12:45:42 -04003615 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003616}
Jamie Madillc29968b2016-01-20 11:17:23 -05003617
3618void Context::clear(GLbitfield mask)
3619{
Geoff Langd4fff502017-09-22 11:28:28 -04003620 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3621 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003622}
3623
3624void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3625{
Olli Etuaho78df3362018-10-05 16:43:27 +03003626 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3627 const FramebufferAttachment *attachment = nullptr;
3628 if (buffer == GL_DEPTH)
3629 {
3630 attachment = framebufferObject->getDepthbuffer();
3631 }
3632 if (buffer == GL_COLOR &&
3633 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3634 {
3635 attachment = framebufferObject->getColorbuffer(drawbuffer);
3636 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003637 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3638 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003639 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003640 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003641 return;
3642 }
Geoff Langd4fff502017-09-22 11:28:28 -04003643 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003644 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003645}
3646
3647void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3648{
Olli Etuaho78df3362018-10-05 16:43:27 +03003649 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3650 const FramebufferAttachment *attachment = nullptr;
3651 if (buffer == GL_COLOR &&
3652 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3653 {
3654 attachment = framebufferObject->getColorbuffer(drawbuffer);
3655 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003656 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3657 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003658 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003659 {
3660 return;
3661 }
Geoff Langd4fff502017-09-22 11:28:28 -04003662 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003663 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003664}
3665
3666void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3667{
Olli Etuaho78df3362018-10-05 16:43:27 +03003668 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3669 const FramebufferAttachment *attachment = nullptr;
3670 if (buffer == GL_STENCIL)
3671 {
3672 attachment = framebufferObject->getStencilbuffer();
3673 }
3674 if (buffer == GL_COLOR &&
3675 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3676 {
3677 attachment = framebufferObject->getColorbuffer(drawbuffer);
3678 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003679 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3680 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003681 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003682 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003683 return;
3684 }
Geoff Langd4fff502017-09-22 11:28:28 -04003685 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003686 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003687}
3688
3689void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3690{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003691 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003692 ASSERT(framebufferObject);
3693
3694 // If a buffer is not present, the clear has no effect
3695 if (framebufferObject->getDepthbuffer() == nullptr &&
3696 framebufferObject->getStencilbuffer() == nullptr)
3697 {
3698 return;
3699 }
3700
Geoff Langd4fff502017-09-22 11:28:28 -04003701 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3702 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003703}
3704
3705void Context::readPixels(GLint x,
3706 GLint y,
3707 GLsizei width,
3708 GLsizei height,
3709 GLenum format,
3710 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003711 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003712{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003713 if (width == 0 || height == 0)
3714 {
3715 return;
3716 }
3717
Jamie Madillbc918e72018-03-08 09:47:21 -05003718 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003719
Jamie Madillb6664922017-07-25 12:55:04 -04003720 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3721 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003722
3723 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003724 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003725}
3726
Brandon Jones59770802018-04-02 13:18:42 -07003727void Context::readPixelsRobust(GLint x,
3728 GLint y,
3729 GLsizei width,
3730 GLsizei height,
3731 GLenum format,
3732 GLenum type,
3733 GLsizei bufSize,
3734 GLsizei *length,
3735 GLsizei *columns,
3736 GLsizei *rows,
3737 void *pixels)
3738{
3739 readPixels(x, y, width, height, format, type, pixels);
3740}
3741
3742void Context::readnPixelsRobust(GLint x,
3743 GLint y,
3744 GLsizei width,
3745 GLsizei height,
3746 GLenum format,
3747 GLenum type,
3748 GLsizei bufSize,
3749 GLsizei *length,
3750 GLsizei *columns,
3751 GLsizei *rows,
3752 void *data)
3753{
3754 readPixels(x, y, width, height, format, type, data);
3755}
3756
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003757void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003758 GLint level,
3759 GLenum internalformat,
3760 GLint x,
3761 GLint y,
3762 GLsizei width,
3763 GLsizei height,
3764 GLint border)
3765{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003766 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003767 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003768
Jamie Madillc29968b2016-01-20 11:17:23 -05003769 Rectangle sourceArea(x, y, width, height);
3770
Jamie Madill05b35b22017-10-03 09:01:44 -04003771 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003772 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003773 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003774}
3775
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003776void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003777 GLint level,
3778 GLint xoffset,
3779 GLint yoffset,
3780 GLint x,
3781 GLint y,
3782 GLsizei width,
3783 GLsizei height)
3784{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003785 if (width == 0 || height == 0)
3786 {
3787 return;
3788 }
3789
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003790 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003791 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003792
Jamie Madillc29968b2016-01-20 11:17:23 -05003793 Offset destOffset(xoffset, yoffset, 0);
3794 Rectangle sourceArea(x, y, width, height);
3795
Jamie Madill05b35b22017-10-03 09:01:44 -04003796 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003797 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003798 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003799}
3800
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003801void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003802 GLint level,
3803 GLint xoffset,
3804 GLint yoffset,
3805 GLint zoffset,
3806 GLint x,
3807 GLint y,
3808 GLsizei width,
3809 GLsizei height)
3810{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003811 if (width == 0 || height == 0)
3812 {
3813 return;
3814 }
3815
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003816 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003817 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003818
Jamie Madillc29968b2016-01-20 11:17:23 -05003819 Offset destOffset(xoffset, yoffset, zoffset);
3820 Rectangle sourceArea(x, y, width, height);
3821
Jamie Madill05b35b22017-10-03 09:01:44 -04003822 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3823 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003824 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3825 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003826}
3827
3828void Context::framebufferTexture2D(GLenum target,
3829 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003830 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003831 GLuint texture,
3832 GLint level)
3833{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003834 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003835 ASSERT(framebuffer);
3836
3837 if (texture != 0)
3838 {
3839 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003840 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003841 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003842 }
3843 else
3844 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003845 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003846 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003847
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003848 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003849}
3850
3851void Context::framebufferRenderbuffer(GLenum target,
3852 GLenum attachment,
3853 GLenum renderbuffertarget,
3854 GLuint renderbuffer)
3855{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003856 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003857 ASSERT(framebuffer);
3858
3859 if (renderbuffer != 0)
3860 {
3861 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003862
Jamie Madillcc129372018-04-12 09:13:18 -04003863 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003864 renderbufferObject);
3865 }
3866 else
3867 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003868 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003869 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003870
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003871 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003872}
3873
3874void Context::framebufferTextureLayer(GLenum target,
3875 GLenum attachment,
3876 GLuint texture,
3877 GLint level,
3878 GLint layer)
3879{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003880 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003881 ASSERT(framebuffer);
3882
3883 if (texture != 0)
3884 {
3885 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003886 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003887 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003888 }
3889 else
3890 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003891 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003892 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003893
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003894 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003895}
3896
Brandon Jones59770802018-04-02 13:18:42 -07003897void Context::framebufferTextureMultiviewLayered(GLenum target,
3898 GLenum attachment,
3899 GLuint texture,
3900 GLint level,
3901 GLint baseViewIndex,
3902 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003903{
Martin Radev82ef7742017-08-08 17:44:58 +03003904 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3905 ASSERT(framebuffer);
3906
3907 if (texture != 0)
3908 {
3909 Texture *textureObj = getTexture(texture);
3910
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003911 ImageIndex index;
3912 if (textureObj->getType() == TextureType::_2DArray)
3913 {
3914 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3915 }
3916 else
3917 {
3918 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3919 ASSERT(level == 0);
3920 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3921 }
Martin Radev82ef7742017-08-08 17:44:58 +03003922 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3923 numViews, baseViewIndex);
3924 }
3925 else
3926 {
3927 framebuffer->resetAttachment(this, attachment);
3928 }
3929
3930 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003931}
3932
Brandon Jones59770802018-04-02 13:18:42 -07003933void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3934 GLenum attachment,
3935 GLuint texture,
3936 GLint level,
3937 GLsizei numViews,
3938 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003939{
Martin Radev5dae57b2017-07-14 16:15:55 +03003940 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3941 ASSERT(framebuffer);
3942
3943 if (texture != 0)
3944 {
3945 Texture *textureObj = getTexture(texture);
3946
3947 ImageIndex index = ImageIndex::Make2D(level);
3948 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3949 textureObj, numViews, viewportOffsets);
3950 }
3951 else
3952 {
3953 framebuffer->resetAttachment(this, attachment);
3954 }
3955
3956 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003957}
3958
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003959void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3960{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003961 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3962 ASSERT(framebuffer);
3963
3964 if (texture != 0)
3965 {
3966 Texture *textureObj = getTexture(texture);
3967
3968 ImageIndex index = ImageIndex::MakeFromType(
3969 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3970 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3971 }
3972 else
3973 {
3974 framebuffer->resetAttachment(this, attachment);
3975 }
3976
3977 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003978}
3979
Jamie Madillc29968b2016-01-20 11:17:23 -05003980void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3981{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003982 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003983 ASSERT(framebuffer);
3984 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003985 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003986 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003987}
3988
3989void Context::readBuffer(GLenum mode)
3990{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003991 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003992 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003993 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003994}
3995
3996void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3997{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003998 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003999 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004000
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004001 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004002 ASSERT(framebuffer);
4003
4004 // The specification isn't clear what should be done when the framebuffer isn't complete.
4005 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04004006 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004007}
4008
4009void Context::invalidateFramebuffer(GLenum target,
4010 GLsizei numAttachments,
4011 const GLenum *attachments)
4012{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004013 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004014 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004015
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004016 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004017 ASSERT(framebuffer);
4018
Jamie Madill427064d2018-04-13 16:20:34 -04004019 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004020 {
Jamie Madill437fa652016-05-03 15:13:24 -04004021 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004022 }
Jamie Madill437fa652016-05-03 15:13:24 -04004023
Jamie Madill4928b7c2017-06-20 12:57:39 -04004024 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004025}
4026
4027void Context::invalidateSubFramebuffer(GLenum target,
4028 GLsizei numAttachments,
4029 const GLenum *attachments,
4030 GLint x,
4031 GLint y,
4032 GLsizei width,
4033 GLsizei height)
4034{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004035 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004036 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004037
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004038 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004039 ASSERT(framebuffer);
4040
Jamie Madill427064d2018-04-13 16:20:34 -04004041 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004042 {
Jamie Madill437fa652016-05-03 15:13:24 -04004043 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004044 }
Jamie Madill437fa652016-05-03 15:13:24 -04004045
4046 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004047 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05004048}
4049
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004050void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004051 GLint level,
4052 GLint internalformat,
4053 GLsizei width,
4054 GLsizei height,
4055 GLint border,
4056 GLenum format,
4057 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004058 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004059{
Jamie Madillbc918e72018-03-08 09:47:21 -05004060 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004061
4062 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004063 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004064 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004065 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004066}
4067
Brandon Jones59770802018-04-02 13:18:42 -07004068void Context::texImage2DRobust(TextureTarget target,
4069 GLint level,
4070 GLint internalformat,
4071 GLsizei width,
4072 GLsizei height,
4073 GLint border,
4074 GLenum format,
4075 GLenum type,
4076 GLsizei bufSize,
4077 const void *pixels)
4078{
4079 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4080}
4081
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004082void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004083 GLint level,
4084 GLint internalformat,
4085 GLsizei width,
4086 GLsizei height,
4087 GLsizei depth,
4088 GLint border,
4089 GLenum format,
4090 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004091 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004092{
Jamie Madillbc918e72018-03-08 09:47:21 -05004093 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004094
4095 Extents size(width, height, depth);
4096 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004097 handleError(texture->setImage(this, mGLState.getUnpackState(),
4098 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004099 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004100}
4101
Brandon Jones59770802018-04-02 13:18:42 -07004102void Context::texImage3DRobust(TextureType target,
4103 GLint level,
4104 GLint internalformat,
4105 GLsizei width,
4106 GLsizei height,
4107 GLsizei depth,
4108 GLint border,
4109 GLenum format,
4110 GLenum type,
4111 GLsizei bufSize,
4112 const void *pixels)
4113{
4114 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4115}
4116
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004117void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004118 GLint level,
4119 GLint xoffset,
4120 GLint yoffset,
4121 GLsizei width,
4122 GLsizei height,
4123 GLenum format,
4124 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004125 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004126{
4127 // Zero sized uploads are valid but no-ops
4128 if (width == 0 || height == 0)
4129 {
4130 return;
4131 }
4132
Jamie Madillbc918e72018-03-08 09:47:21 -05004133 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004134
4135 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004136 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004137
4138 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4139
4140 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4141 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004142}
4143
Brandon Jones59770802018-04-02 13:18:42 -07004144void Context::texSubImage2DRobust(TextureTarget target,
4145 GLint level,
4146 GLint xoffset,
4147 GLint yoffset,
4148 GLsizei width,
4149 GLsizei height,
4150 GLenum format,
4151 GLenum type,
4152 GLsizei bufSize,
4153 const void *pixels)
4154{
4155 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4156}
4157
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004158void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004159 GLint level,
4160 GLint xoffset,
4161 GLint yoffset,
4162 GLint zoffset,
4163 GLsizei width,
4164 GLsizei height,
4165 GLsizei depth,
4166 GLenum format,
4167 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004168 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004169{
4170 // Zero sized uploads are valid but no-ops
4171 if (width == 0 || height == 0 || depth == 0)
4172 {
4173 return;
4174 }
4175
Jamie Madillbc918e72018-03-08 09:47:21 -05004176 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004177
4178 Box area(xoffset, yoffset, zoffset, width, height, depth);
4179 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004180
4181 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4182
4183 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004184 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004185 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004186}
4187
Brandon Jones59770802018-04-02 13:18:42 -07004188void Context::texSubImage3DRobust(TextureType target,
4189 GLint level,
4190 GLint xoffset,
4191 GLint yoffset,
4192 GLint zoffset,
4193 GLsizei width,
4194 GLsizei height,
4195 GLsizei depth,
4196 GLenum format,
4197 GLenum type,
4198 GLsizei bufSize,
4199 const void *pixels)
4200{
4201 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4202 pixels);
4203}
4204
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004205void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004206 GLint level,
4207 GLenum internalformat,
4208 GLsizei width,
4209 GLsizei height,
4210 GLint border,
4211 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004212 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004213{
Jamie Madillbc918e72018-03-08 09:47:21 -05004214 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004215
4216 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004217 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004218 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4219 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004220 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004221}
4222
Brandon Jones59770802018-04-02 13:18:42 -07004223void Context::compressedTexImage2DRobust(TextureTarget target,
4224 GLint level,
4225 GLenum internalformat,
4226 GLsizei width,
4227 GLsizei height,
4228 GLint border,
4229 GLsizei imageSize,
4230 GLsizei dataSize,
4231 const GLvoid *data)
4232{
4233 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4234}
4235
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004236void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004237 GLint level,
4238 GLenum internalformat,
4239 GLsizei width,
4240 GLsizei height,
4241 GLsizei depth,
4242 GLint border,
4243 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004244 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004245{
Jamie Madillbc918e72018-03-08 09:47:21 -05004246 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004247
4248 Extents size(width, height, depth);
4249 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004250 handleError(texture->setCompressedImage(
4251 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004252 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004253}
4254
Brandon Jones59770802018-04-02 13:18:42 -07004255void Context::compressedTexImage3DRobust(TextureType target,
4256 GLint level,
4257 GLenum internalformat,
4258 GLsizei width,
4259 GLsizei height,
4260 GLsizei depth,
4261 GLint border,
4262 GLsizei imageSize,
4263 GLsizei dataSize,
4264 const GLvoid *data)
4265{
4266 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4267 data);
4268}
4269
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004270void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004271 GLint level,
4272 GLint xoffset,
4273 GLint yoffset,
4274 GLsizei width,
4275 GLsizei height,
4276 GLenum format,
4277 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004278 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004279{
Jamie Madillbc918e72018-03-08 09:47:21 -05004280 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004281
4282 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004283 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004284 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4285 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004286 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004287}
4288
Brandon Jones59770802018-04-02 13:18:42 -07004289void Context::compressedTexSubImage2DRobust(TextureTarget target,
4290 GLint level,
4291 GLint xoffset,
4292 GLint yoffset,
4293 GLsizei width,
4294 GLsizei height,
4295 GLenum format,
4296 GLsizei imageSize,
4297 GLsizei dataSize,
4298 const GLvoid *data)
4299{
4300 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4301 data);
4302}
4303
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004304void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004305 GLint level,
4306 GLint xoffset,
4307 GLint yoffset,
4308 GLint zoffset,
4309 GLsizei width,
4310 GLsizei height,
4311 GLsizei depth,
4312 GLenum format,
4313 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004314 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004315{
4316 // Zero sized uploads are valid but no-ops
4317 if (width == 0 || height == 0)
4318 {
4319 return;
4320 }
4321
Jamie Madillbc918e72018-03-08 09:47:21 -05004322 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004323
4324 Box area(xoffset, yoffset, zoffset, width, height, depth);
4325 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004326 handleError(texture->setCompressedSubImage(
4327 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004328 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004329}
4330
Brandon Jones59770802018-04-02 13:18:42 -07004331void Context::compressedTexSubImage3DRobust(TextureType target,
4332 GLint level,
4333 GLint xoffset,
4334 GLint yoffset,
4335 GLint zoffset,
4336 GLsizei width,
4337 GLsizei height,
4338 GLsizei depth,
4339 GLenum format,
4340 GLsizei imageSize,
4341 GLsizei dataSize,
4342 const GLvoid *data)
4343{
4344 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4345 imageSize, data);
4346}
4347
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004348void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004349{
4350 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004351 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004352}
4353
Jamie Madill007530e2017-12-28 14:27:04 -05004354void Context::copyTexture(GLuint sourceId,
4355 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004356 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004357 GLuint destId,
4358 GLint destLevel,
4359 GLint internalFormat,
4360 GLenum destType,
4361 GLboolean unpackFlipY,
4362 GLboolean unpackPremultiplyAlpha,
4363 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004364{
Jamie Madillbc918e72018-03-08 09:47:21 -05004365 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004366
4367 gl::Texture *sourceTexture = getTexture(sourceId);
4368 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004369 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4370 sourceLevel, ConvertToBool(unpackFlipY),
4371 ConvertToBool(unpackPremultiplyAlpha),
4372 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004373}
4374
Jamie Madill007530e2017-12-28 14:27:04 -05004375void Context::copySubTexture(GLuint sourceId,
4376 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004377 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004378 GLuint destId,
4379 GLint destLevel,
4380 GLint xoffset,
4381 GLint yoffset,
4382 GLint x,
4383 GLint y,
4384 GLsizei width,
4385 GLsizei height,
4386 GLboolean unpackFlipY,
4387 GLboolean unpackPremultiplyAlpha,
4388 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004389{
4390 // Zero sized copies are valid but no-ops
4391 if (width == 0 || height == 0)
4392 {
4393 return;
4394 }
4395
Jamie Madillbc918e72018-03-08 09:47:21 -05004396 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004397
4398 gl::Texture *sourceTexture = getTexture(sourceId);
4399 gl::Texture *destTexture = getTexture(destId);
4400 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004401 Box box(x, y, 0, width, height, 1);
4402 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4403 ConvertToBool(unpackFlipY),
4404 ConvertToBool(unpackPremultiplyAlpha),
4405 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4406}
4407
4408void Context::copyTexture3D(GLuint sourceId,
4409 GLint sourceLevel,
4410 TextureTarget destTarget,
4411 GLuint destId,
4412 GLint destLevel,
4413 GLint internalFormat,
4414 GLenum destType,
4415 GLboolean unpackFlipY,
4416 GLboolean unpackPremultiplyAlpha,
4417 GLboolean unpackUnmultiplyAlpha)
4418{
4419 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4420
4421 Texture *sourceTexture = getTexture(sourceId);
4422 Texture *destTexture = getTexture(destId);
4423 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4424 sourceLevel, ConvertToBool(unpackFlipY),
4425 ConvertToBool(unpackPremultiplyAlpha),
4426 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4427}
4428
4429void Context::copySubTexture3D(GLuint sourceId,
4430 GLint sourceLevel,
4431 TextureTarget destTarget,
4432 GLuint destId,
4433 GLint destLevel,
4434 GLint xoffset,
4435 GLint yoffset,
4436 GLint zoffset,
4437 GLint x,
4438 GLint y,
4439 GLint z,
4440 GLsizei width,
4441 GLsizei height,
4442 GLsizei depth,
4443 GLboolean unpackFlipY,
4444 GLboolean unpackPremultiplyAlpha,
4445 GLboolean unpackUnmultiplyAlpha)
4446{
4447 // Zero sized copies are valid but no-ops
4448 if (width == 0 || height == 0 || depth == 0)
4449 {
4450 return;
4451 }
4452
4453 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4454
4455 Texture *sourceTexture = getTexture(sourceId);
4456 Texture *destTexture = getTexture(destId);
4457 Offset offset(xoffset, yoffset, zoffset);
4458 Box box(x, y, z, width, height, depth);
4459 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004460 ConvertToBool(unpackFlipY),
4461 ConvertToBool(unpackPremultiplyAlpha),
4462 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004463}
4464
Jamie Madill007530e2017-12-28 14:27:04 -05004465void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004466{
Jamie Madillbc918e72018-03-08 09:47:21 -05004467 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004468
4469 gl::Texture *sourceTexture = getTexture(sourceId);
4470 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004471 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004472}
4473
Corentin Wallez336129f2017-10-17 15:55:40 -04004474void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004475{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004476 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004477 ASSERT(buffer);
4478
Geoff Lang496c02d2016-10-20 11:38:11 -07004479 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004480}
4481
Brandon Jones59770802018-04-02 13:18:42 -07004482void Context::getBufferPointervRobust(BufferBinding target,
4483 GLenum pname,
4484 GLsizei bufSize,
4485 GLsizei *length,
4486 void **params)
4487{
4488 getBufferPointerv(target, pname, params);
4489}
4490
Corentin Wallez336129f2017-10-17 15:55:40 -04004491void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004492{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004493 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004494 ASSERT(buffer);
4495
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004496 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004497 if (error.isError())
4498 {
Jamie Madill437fa652016-05-03 15:13:24 -04004499 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004500 return nullptr;
4501 }
4502
4503 return buffer->getMapPointer();
4504}
4505
Corentin Wallez336129f2017-10-17 15:55:40 -04004506GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004507{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004508 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004509 ASSERT(buffer);
4510
4511 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004512 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004513 if (error.isError())
4514 {
Jamie Madill437fa652016-05-03 15:13:24 -04004515 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004516 return GL_FALSE;
4517 }
4518
4519 return result;
4520}
4521
Corentin Wallez336129f2017-10-17 15:55:40 -04004522void *Context::mapBufferRange(BufferBinding target,
4523 GLintptr offset,
4524 GLsizeiptr length,
4525 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004526{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004527 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004528 ASSERT(buffer);
4529
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004530 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004531 if (error.isError())
4532 {
Jamie Madill437fa652016-05-03 15:13:24 -04004533 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004534 return nullptr;
4535 }
4536
4537 return buffer->getMapPointer();
4538}
4539
Corentin Wallez336129f2017-10-17 15:55:40 -04004540void Context::flushMappedBufferRange(BufferBinding /*target*/,
4541 GLintptr /*offset*/,
4542 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004543{
4544 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4545}
4546
Jamie Madillbc918e72018-03-08 09:47:21 -05004547Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004548{
Geoff Langa8cb2872018-03-09 16:09:40 -05004549 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004550}
4551
Jamie Madillbc918e72018-03-08 09:47:21 -05004552Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004553{
Geoff Langa8cb2872018-03-09 16:09:40 -05004554 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004555}
4556
Jamie Madillbc918e72018-03-08 09:47:21 -05004557Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004558{
Geoff Langa8cb2872018-03-09 16:09:40 -05004559 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004560}
4561
Geoff Lang9bf86f02018-07-26 11:46:34 -04004562Error Context::syncStateForPathOperation()
4563{
4564 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4565
4566 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4567 ANGLE_TRY(syncDirtyBits());
4568
4569 return NoError();
4570}
4571
Jiajia Qin5451d532017-11-16 17:16:34 +08004572void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4573{
4574 UNIMPLEMENTED();
4575}
4576
Jamie Madillc20ab272016-06-09 07:20:46 -07004577void Context::activeTexture(GLenum texture)
4578{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004579 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004580}
4581
Jamie Madill876429b2017-04-20 15:46:24 -04004582void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004583{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004584 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004585}
4586
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004587void Context::blendEquation(GLenum mode)
4588{
4589 mGLState.setBlendEquation(mode, mode);
4590}
4591
Jamie Madillc20ab272016-06-09 07:20:46 -07004592void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4593{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004594 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004595}
4596
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004597void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4598{
4599 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4600}
4601
Jamie Madillc20ab272016-06-09 07:20:46 -07004602void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4603{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004604 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004605}
4606
Jamie Madill876429b2017-04-20 15:46:24 -04004607void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004608{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004609 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004610}
4611
Jamie Madill876429b2017-04-20 15:46:24 -04004612void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004613{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004614 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004615}
4616
4617void Context::clearStencil(GLint s)
4618{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004619 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004620}
4621
4622void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4623{
Geoff Lang92019432017-11-20 13:09:34 -05004624 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4625 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004626}
4627
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004628void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004629{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004630 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004631}
4632
4633void Context::depthFunc(GLenum func)
4634{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004635 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004636}
4637
4638void Context::depthMask(GLboolean flag)
4639{
Geoff Lang92019432017-11-20 13:09:34 -05004640 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004641}
4642
Jamie Madill876429b2017-04-20 15:46:24 -04004643void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004644{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004645 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004646}
4647
4648void Context::disable(GLenum cap)
4649{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004650 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004651 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004652}
4653
4654void Context::disableVertexAttribArray(GLuint index)
4655{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004656 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004657 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004658}
4659
4660void Context::enable(GLenum cap)
4661{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004662 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004663 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004664}
4665
4666void Context::enableVertexAttribArray(GLuint index)
4667{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004668 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004669 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004670}
4671
4672void Context::frontFace(GLenum mode)
4673{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004674 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004675}
4676
4677void Context::hint(GLenum target, GLenum mode)
4678{
4679 switch (target)
4680 {
4681 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004682 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004683 break;
4684
4685 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004686 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004687 break;
4688
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004689 case GL_PERSPECTIVE_CORRECTION_HINT:
4690 case GL_POINT_SMOOTH_HINT:
4691 case GL_LINE_SMOOTH_HINT:
4692 case GL_FOG_HINT:
4693 mGLState.gles1().setHint(target, mode);
4694 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004695 default:
4696 UNREACHABLE();
4697 return;
4698 }
4699}
4700
4701void Context::lineWidth(GLfloat width)
4702{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004703 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004704}
4705
4706void Context::pixelStorei(GLenum pname, GLint param)
4707{
4708 switch (pname)
4709 {
4710 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004711 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004712 break;
4713
4714 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004715 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004716 break;
4717
4718 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004719 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004720 break;
4721
4722 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004723 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004724 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004725 break;
4726
4727 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004728 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004729 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004730 break;
4731
4732 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004733 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004734 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004735 break;
4736
4737 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004738 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004739 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004740 break;
4741
4742 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004743 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004744 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004745 break;
4746
4747 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004748 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004749 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004750 break;
4751
4752 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004753 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004754 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004755 break;
4756
4757 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004758 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004759 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004760 break;
4761
4762 default:
4763 UNREACHABLE();
4764 return;
4765 }
4766}
4767
4768void Context::polygonOffset(GLfloat factor, GLfloat units)
4769{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004770 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004771}
4772
Jamie Madill876429b2017-04-20 15:46:24 -04004773void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004774{
Geoff Lang92019432017-11-20 13:09:34 -05004775 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004776}
4777
Jiawei Shaodb342272017-09-27 10:21:45 +08004778void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4779{
4780 mGLState.setSampleMaskParams(maskNumber, mask);
4781}
4782
Jamie Madillc20ab272016-06-09 07:20:46 -07004783void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4784{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004785 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004786}
4787
4788void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4789{
4790 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4791 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004792 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004793 }
4794
4795 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4796 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004797 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004798 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004799
4800 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004801}
4802
4803void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4804{
4805 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4806 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004807 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004808 }
4809
4810 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4811 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004812 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004813 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004814
4815 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004816}
4817
4818void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4819{
4820 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4821 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004822 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004823 }
4824
4825 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4826 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004827 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004828 }
4829}
4830
4831void Context::vertexAttrib1f(GLuint index, GLfloat x)
4832{
4833 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004834 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004835 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004836}
4837
4838void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4839{
4840 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004841 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004842 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004843}
4844
4845void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4846{
4847 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004848 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004849 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004850}
4851
4852void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4853{
4854 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004855 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004856 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004857}
4858
4859void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4860{
4861 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004862 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004863 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004864}
4865
4866void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4867{
4868 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004869 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004870 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004871}
4872
4873void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4874{
4875 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004876 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004877 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004878}
4879
4880void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4881{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004882 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004883 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004884}
4885
4886void Context::vertexAttribPointer(GLuint index,
4887 GLint size,
4888 GLenum type,
4889 GLboolean normalized,
4890 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004891 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004892{
Corentin Wallez336129f2017-10-17 15:55:40 -04004893 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004894 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004895 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004896}
4897
Shao80957d92017-02-20 21:25:59 +08004898void Context::vertexAttribFormat(GLuint attribIndex,
4899 GLint size,
4900 GLenum type,
4901 GLboolean normalized,
4902 GLuint relativeOffset)
4903{
Geoff Lang92019432017-11-20 13:09:34 -05004904 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004905 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004906 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004907}
4908
4909void Context::vertexAttribIFormat(GLuint attribIndex,
4910 GLint size,
4911 GLenum type,
4912 GLuint relativeOffset)
4913{
4914 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004915 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004916}
4917
4918void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4919{
Shaodde78e82017-05-22 14:13:27 +08004920 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004921 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004922}
4923
Jiajia Qin5451d532017-11-16 17:16:34 +08004924void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004925{
4926 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004927 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004928}
4929
Jamie Madillc20ab272016-06-09 07:20:46 -07004930void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4931{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004932 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004933}
4934
4935void Context::vertexAttribIPointer(GLuint index,
4936 GLint size,
4937 GLenum type,
4938 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004939 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004940{
Corentin Wallez336129f2017-10-17 15:55:40 -04004941 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4942 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004943 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004944}
4945
4946void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4947{
4948 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004949 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004950 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004951}
4952
4953void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4954{
4955 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004956 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004957 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004958}
4959
4960void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4961{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004962 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004963 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004964}
4965
4966void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4967{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004968 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004969 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004970}
4971
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004972void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4973{
4974 const VertexAttribCurrentValueData &currentValues =
4975 getGLState().getVertexAttribCurrentValue(index);
4976 const VertexArray *vao = getGLState().getVertexArray();
4977 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4978 currentValues, pname, params);
4979}
4980
Brandon Jones59770802018-04-02 13:18:42 -07004981void Context::getVertexAttribivRobust(GLuint index,
4982 GLenum pname,
4983 GLsizei bufSize,
4984 GLsizei *length,
4985 GLint *params)
4986{
4987 getVertexAttribiv(index, pname, params);
4988}
4989
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004990void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4991{
4992 const VertexAttribCurrentValueData &currentValues =
4993 getGLState().getVertexAttribCurrentValue(index);
4994 const VertexArray *vao = getGLState().getVertexArray();
4995 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4996 currentValues, pname, params);
4997}
4998
Brandon Jones59770802018-04-02 13:18:42 -07004999void Context::getVertexAttribfvRobust(GLuint index,
5000 GLenum pname,
5001 GLsizei bufSize,
5002 GLsizei *length,
5003 GLfloat *params)
5004{
5005 getVertexAttribfv(index, pname, params);
5006}
5007
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005008void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
5009{
5010 const VertexAttribCurrentValueData &currentValues =
5011 getGLState().getVertexAttribCurrentValue(index);
5012 const VertexArray *vao = getGLState().getVertexArray();
5013 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5014 currentValues, pname, params);
5015}
5016
Brandon Jones59770802018-04-02 13:18:42 -07005017void Context::getVertexAttribIivRobust(GLuint index,
5018 GLenum pname,
5019 GLsizei bufSize,
5020 GLsizei *length,
5021 GLint *params)
5022{
5023 getVertexAttribIiv(index, pname, params);
5024}
5025
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005026void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
5027{
5028 const VertexAttribCurrentValueData &currentValues =
5029 getGLState().getVertexAttribCurrentValue(index);
5030 const VertexArray *vao = getGLState().getVertexArray();
5031 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5032 currentValues, pname, params);
5033}
5034
Brandon Jones59770802018-04-02 13:18:42 -07005035void Context::getVertexAttribIuivRobust(GLuint index,
5036 GLenum pname,
5037 GLsizei bufSize,
5038 GLsizei *length,
5039 GLuint *params)
5040{
5041 getVertexAttribIuiv(index, pname, params);
5042}
5043
Jamie Madill876429b2017-04-20 15:46:24 -04005044void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005045{
5046 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
5047 QueryVertexAttribPointerv(attrib, pname, pointer);
5048}
5049
Brandon Jones59770802018-04-02 13:18:42 -07005050void Context::getVertexAttribPointervRobust(GLuint index,
5051 GLenum pname,
5052 GLsizei bufSize,
5053 GLsizei *length,
5054 void **pointer)
5055{
5056 getVertexAttribPointerv(index, pname, pointer);
5057}
5058
Jamie Madillc20ab272016-06-09 07:20:46 -07005059void Context::debugMessageControl(GLenum source,
5060 GLenum type,
5061 GLenum severity,
5062 GLsizei count,
5063 const GLuint *ids,
5064 GLboolean enabled)
5065{
5066 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005067 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005068 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005069}
5070
5071void Context::debugMessageInsert(GLenum source,
5072 GLenum type,
5073 GLuint id,
5074 GLenum severity,
5075 GLsizei length,
5076 const GLchar *buf)
5077{
5078 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005079 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005080}
5081
5082void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5083{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005084 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005085}
5086
5087GLuint Context::getDebugMessageLog(GLuint count,
5088 GLsizei bufSize,
5089 GLenum *sources,
5090 GLenum *types,
5091 GLuint *ids,
5092 GLenum *severities,
5093 GLsizei *lengths,
5094 GLchar *messageLog)
5095{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005096 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5097 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005098}
5099
5100void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5101{
5102 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005103 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005104 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005105}
5106
5107void Context::popDebugGroup()
5108{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005109 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005110 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005111}
5112
Corentin Wallez336129f2017-10-17 15:55:40 -04005113void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005114{
5115 Buffer *buffer = mGLState.getTargetBuffer(target);
5116 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005117 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005118}
5119
Corentin Wallez336129f2017-10-17 15:55:40 -04005120void Context::bufferSubData(BufferBinding target,
5121 GLintptr offset,
5122 GLsizeiptr size,
5123 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005124{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005125 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005126 {
5127 return;
5128 }
5129
5130 Buffer *buffer = mGLState.getTargetBuffer(target);
5131 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005132 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005133}
5134
Jamie Madillef300b12016-10-07 15:12:09 -04005135void Context::attachShader(GLuint program, GLuint shader)
5136{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005137 Program *programObject = mState.mShaderPrograms->getProgram(program);
5138 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005139 ASSERT(programObject && shaderObject);
5140 programObject->attachShader(shaderObject);
5141}
5142
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005143const Workarounds &Context::getWorkarounds() const
5144{
5145 return mWorkarounds;
5146}
5147
Corentin Wallez336129f2017-10-17 15:55:40 -04005148void Context::copyBufferSubData(BufferBinding readTarget,
5149 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005150 GLintptr readOffset,
5151 GLintptr writeOffset,
5152 GLsizeiptr size)
5153{
5154 // if size is zero, the copy is a successful no-op
5155 if (size == 0)
5156 {
5157 return;
5158 }
5159
5160 // TODO(jmadill): cache these.
5161 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5162 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5163
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005164 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005165}
5166
Jamie Madill01a80ee2016-11-07 12:06:18 -05005167void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5168{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005169 // Ideally we could share the program query with the validation layer if possible.
5170 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005171 ASSERT(programObject);
5172 programObject->bindAttributeLocation(index, name);
5173}
5174
Corentin Wallez336129f2017-10-17 15:55:40 -04005175void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005176{
Corentin Wallez336129f2017-10-17 15:55:40 -04005177 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5178 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005179 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005180}
5181
Corentin Wallez336129f2017-10-17 15:55:40 -04005182void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005183{
5184 bindBufferRange(target, index, buffer, 0, 0);
5185}
5186
Corentin Wallez336129f2017-10-17 15:55:40 -04005187void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005188 GLuint index,
5189 GLuint buffer,
5190 GLintptr offset,
5191 GLsizeiptr size)
5192{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005193 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5194 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5195 if (target == BufferBinding::Uniform)
5196 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005197 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005198 mStateCache.onUniformBufferStateChange(this);
5199 }
5200 else
5201 {
5202 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005203 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005204}
5205
Jamie Madill01a80ee2016-11-07 12:06:18 -05005206void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5207{
5208 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5209 {
5210 bindReadFramebuffer(framebuffer);
5211 }
5212
5213 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5214 {
5215 bindDrawFramebuffer(framebuffer);
5216 }
5217}
5218
5219void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5220{
5221 ASSERT(target == GL_RENDERBUFFER);
5222 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005223 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005224 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005225}
5226
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005227void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005228 GLsizei samples,
5229 GLenum internalformat,
5230 GLsizei width,
5231 GLsizei height,
5232 GLboolean fixedsamplelocations)
5233{
5234 Extents size(width, height, 1);
5235 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005236 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5237 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005238}
5239
Olli Etuaho89664842018-08-24 14:45:36 +03005240void Context::texStorage3DMultisample(TextureType target,
5241 GLsizei samples,
5242 GLenum internalformat,
5243 GLsizei width,
5244 GLsizei height,
5245 GLsizei depth,
5246 GLboolean fixedsamplelocations)
5247{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005248 Extents size(width, height, depth);
5249 Texture *texture = getTargetTexture(target);
5250 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5251 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005252}
5253
JiangYizhoubddc46b2016-12-09 09:50:51 +08005254void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5255{
JiangYizhou5b03f472017-01-09 10:22:53 +08005256 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5257 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005258 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005259 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005260
5261 switch (pname)
5262 {
5263 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005264 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005265 break;
5266 default:
5267 UNREACHABLE();
5268 }
5269}
5270
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005271void Context::getMultisamplefvRobust(GLenum pname,
5272 GLuint index,
5273 GLsizei bufSize,
5274 GLsizei *length,
5275 GLfloat *val)
5276{
5277 UNIMPLEMENTED();
5278}
5279
Jamie Madille8fb6402017-02-14 17:56:40 -05005280void Context::renderbufferStorage(GLenum target,
5281 GLenum internalformat,
5282 GLsizei width,
5283 GLsizei height)
5284{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005285 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5286 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5287
Jamie Madille8fb6402017-02-14 17:56:40 -05005288 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005289 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005290}
5291
5292void Context::renderbufferStorageMultisample(GLenum target,
5293 GLsizei samples,
5294 GLenum internalformat,
5295 GLsizei width,
5296 GLsizei height)
5297{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005298 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5299 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005300
5301 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005302 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005303 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005304}
5305
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005306void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5307{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005308 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005309 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005310}
5311
JiangYizhoue18e6392017-02-20 10:32:23 +08005312void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5313{
5314 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5315 QueryFramebufferParameteriv(framebuffer, pname, params);
5316}
5317
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005318void Context::getFramebufferParameterivRobust(GLenum target,
5319 GLenum pname,
5320 GLsizei bufSize,
5321 GLsizei *length,
5322 GLint *params)
5323{
5324 UNIMPLEMENTED();
5325}
5326
Jiajia Qin5451d532017-11-16 17:16:34 +08005327void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005328{
5329 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005330 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005331}
5332
Jamie Madilldec86232018-07-11 09:01:18 -04005333bool Context::getScratchBuffer(size_t requstedSizeBytes,
5334 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005335{
Jamie Madilldec86232018-07-11 09:01:18 -04005336 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005337}
5338
Jamie Madilldec86232018-07-11 09:01:18 -04005339bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5340 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005341{
Jamie Madilldec86232018-07-11 09:01:18 -04005342 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005343}
5344
Xinghua Cao10a4d432017-11-28 14:46:26 +08005345Error Context::prepareForDispatch()
5346{
Jamie Madill0cc11c62018-10-12 18:07:18 -04005347 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005348
5349 if (isRobustResourceInitEnabled())
5350 {
5351 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5352 }
5353
Jamie Madill0cc11c62018-10-12 18:07:18 -04005354 return syncDirtyBits(mComputeDirtyBits);
Xinghua Cao10a4d432017-11-28 14:46:26 +08005355}
5356
Xinghua Cao2b396592017-03-29 15:36:04 +08005357void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5358{
5359 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5360 {
5361 return;
5362 }
5363
Xinghua Cao10a4d432017-11-28 14:46:26 +08005364 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005365 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005366}
5367
Jiajia Qin5451d532017-11-16 17:16:34 +08005368void Context::dispatchComputeIndirect(GLintptr indirect)
5369{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005370 ANGLE_CONTEXT_TRY(prepareForDispatch());
5371 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005372}
5373
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005374void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005375 GLsizei levels,
5376 GLenum internalFormat,
5377 GLsizei width,
5378 GLsizei height)
5379{
5380 Extents size(width, height, 1);
5381 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005382 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005383}
5384
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005385void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005386 GLsizei levels,
5387 GLenum internalFormat,
5388 GLsizei width,
5389 GLsizei height,
5390 GLsizei depth)
5391{
5392 Extents size(width, height, depth);
5393 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005394 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005395}
5396
Jiajia Qin5451d532017-11-16 17:16:34 +08005397void Context::memoryBarrier(GLbitfield barriers)
5398{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005399 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005400}
5401
5402void Context::memoryBarrierByRegion(GLbitfield barriers)
5403{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005404 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005405}
5406
Austin Eng1bf18ce2018-10-19 15:34:02 -07005407void Context::multiDrawArrays(PrimitiveMode mode,
5408 const GLint *firsts,
5409 const GLsizei *counts,
5410 GLsizei drawcount)
5411{
5412 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5413 Program *programObject = mGLState.getLinkedProgram(this);
5414 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5415 if (hasDrawID)
5416 {
5417 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5418 {
5419 if (noopDraw(mode, counts[drawID]))
5420 {
5421 continue;
5422 }
5423 programObject->setDrawIDUniform(drawID);
5424 ANGLE_CONTEXT_TRY(
5425 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5426 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5427 counts[drawID], 1);
5428 }
5429 }
5430 else
5431 {
5432 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5433 {
5434 if (noopDraw(mode, counts[drawID]))
5435 {
5436 continue;
5437 }
5438 ANGLE_CONTEXT_TRY(
5439 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5440 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5441 counts[drawID], 1);
5442 }
5443 }
5444}
5445
5446void Context::multiDrawArraysInstanced(PrimitiveMode mode,
5447 const GLint *firsts,
5448 const GLsizei *counts,
5449 const GLsizei *instanceCounts,
5450 GLsizei drawcount)
5451{
5452 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5453 Program *programObject = mGLState.getLinkedProgram(this);
5454 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5455 if (hasDrawID)
5456 {
5457 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5458 {
5459 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5460 {
5461 continue;
5462 }
5463 programObject->setDrawIDUniform(drawID);
5464 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5465 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5466 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5467 counts[drawID], instanceCounts[drawID]);
5468 }
5469 }
5470 else
5471 {
5472 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5473 {
5474 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5475 {
5476 continue;
5477 }
5478 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5479 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5480 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5481 counts[drawID], instanceCounts[drawID]);
5482 }
5483 }
5484}
5485
5486void Context::multiDrawElements(PrimitiveMode mode,
5487 const GLsizei *counts,
5488 GLenum type,
5489 const GLsizei *offsets,
5490 GLsizei drawcount)
5491{
5492 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5493 Program *programObject = mGLState.getLinkedProgram(this);
5494 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5495 if (hasDrawID)
5496 {
5497 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5498 {
5499 if (noopDraw(mode, counts[drawID]))
5500 {
5501 continue;
5502 }
5503 programObject->setDrawIDUniform(drawID);
5504 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5505 ANGLE_CONTEXT_TRY(
5506 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5507 }
5508 }
5509 else
5510 {
5511 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5512 {
5513 if (noopDraw(mode, counts[drawID]))
5514 {
5515 continue;
5516 }
5517 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5518 ANGLE_CONTEXT_TRY(
5519 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5520 }
5521 }
5522}
5523
5524void Context::multiDrawElementsInstanced(PrimitiveMode mode,
5525 const GLsizei *counts,
5526 GLenum type,
5527 const GLsizei *offsets,
5528 const GLsizei *instanceCounts,
5529 GLsizei drawcount)
5530{
5531 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5532 Program *programObject = mGLState.getLinkedProgram(this);
5533 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5534 if (hasDrawID)
5535 {
5536 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5537 {
5538 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5539 {
5540 continue;
5541 }
5542 programObject->setDrawIDUniform(drawID);
5543 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5544 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5545 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5546 }
5547 }
5548 else
5549 {
5550 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5551 {
5552 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5553 {
5554 continue;
5555 }
5556 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5557 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5558 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5559 }
5560 }
5561}
5562
Jamie Madillc1d770e2017-04-13 17:31:24 -04005563GLenum Context::checkFramebufferStatus(GLenum target)
5564{
5565 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5566 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005567 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005568}
5569
5570void Context::compileShader(GLuint shader)
5571{
5572 Shader *shaderObject = GetValidShader(this, shader);
5573 if (!shaderObject)
5574 {
5575 return;
5576 }
5577 shaderObject->compile(this);
5578}
5579
5580void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5581{
5582 for (int i = 0; i < n; i++)
5583 {
5584 deleteBuffer(buffers[i]);
5585 }
5586}
5587
5588void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5589{
5590 for (int i = 0; i < n; i++)
5591 {
5592 if (framebuffers[i] != 0)
5593 {
5594 deleteFramebuffer(framebuffers[i]);
5595 }
5596 }
5597}
5598
5599void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5600{
5601 for (int i = 0; i < n; i++)
5602 {
5603 deleteRenderbuffer(renderbuffers[i]);
5604 }
5605}
5606
5607void Context::deleteTextures(GLsizei n, const GLuint *textures)
5608{
5609 for (int i = 0; i < n; i++)
5610 {
5611 if (textures[i] != 0)
5612 {
5613 deleteTexture(textures[i]);
5614 }
5615 }
5616}
5617
5618void Context::detachShader(GLuint program, GLuint shader)
5619{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005620 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005621 ASSERT(programObject);
5622
5623 Shader *shaderObject = getShader(shader);
5624 ASSERT(shaderObject);
5625
5626 programObject->detachShader(this, shaderObject);
5627}
5628
5629void Context::genBuffers(GLsizei n, GLuint *buffers)
5630{
5631 for (int i = 0; i < n; i++)
5632 {
5633 buffers[i] = createBuffer();
5634 }
5635}
5636
5637void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5638{
5639 for (int i = 0; i < n; i++)
5640 {
5641 framebuffers[i] = createFramebuffer();
5642 }
5643}
5644
5645void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5646{
5647 for (int i = 0; i < n; i++)
5648 {
5649 renderbuffers[i] = createRenderbuffer();
5650 }
5651}
5652
5653void Context::genTextures(GLsizei n, GLuint *textures)
5654{
5655 for (int i = 0; i < n; i++)
5656 {
5657 textures[i] = createTexture();
5658 }
5659}
5660
5661void Context::getActiveAttrib(GLuint program,
5662 GLuint index,
5663 GLsizei bufsize,
5664 GLsizei *length,
5665 GLint *size,
5666 GLenum *type,
5667 GLchar *name)
5668{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005669 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005670 ASSERT(programObject);
5671 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5672}
5673
5674void Context::getActiveUniform(GLuint program,
5675 GLuint index,
5676 GLsizei bufsize,
5677 GLsizei *length,
5678 GLint *size,
5679 GLenum *type,
5680 GLchar *name)
5681{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005682 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005683 ASSERT(programObject);
5684 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5685}
5686
5687void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5688{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005689 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005690 ASSERT(programObject);
5691 programObject->getAttachedShaders(maxcount, count, shaders);
5692}
5693
5694GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5695{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005696 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005697 ASSERT(programObject);
5698 return programObject->getAttributeLocation(name);
5699}
5700
5701void Context::getBooleanv(GLenum pname, GLboolean *params)
5702{
5703 GLenum nativeType;
5704 unsigned int numParams = 0;
5705 getQueryParameterInfo(pname, &nativeType, &numParams);
5706
5707 if (nativeType == GL_BOOL)
5708 {
5709 getBooleanvImpl(pname, params);
5710 }
5711 else
5712 {
5713 CastStateValues(this, nativeType, pname, numParams, params);
5714 }
5715}
5716
Brandon Jones59770802018-04-02 13:18:42 -07005717void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5718{
5719 getBooleanv(pname, params);
5720}
5721
Jamie Madillc1d770e2017-04-13 17:31:24 -04005722void Context::getFloatv(GLenum pname, GLfloat *params)
5723{
5724 GLenum nativeType;
5725 unsigned int numParams = 0;
5726 getQueryParameterInfo(pname, &nativeType, &numParams);
5727
5728 if (nativeType == GL_FLOAT)
5729 {
5730 getFloatvImpl(pname, params);
5731 }
5732 else
5733 {
5734 CastStateValues(this, nativeType, pname, numParams, params);
5735 }
5736}
5737
Brandon Jones59770802018-04-02 13:18:42 -07005738void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5739{
5740 getFloatv(pname, params);
5741}
5742
Jamie Madillc1d770e2017-04-13 17:31:24 -04005743void Context::getIntegerv(GLenum pname, GLint *params)
5744{
5745 GLenum nativeType;
5746 unsigned int numParams = 0;
5747 getQueryParameterInfo(pname, &nativeType, &numParams);
5748
5749 if (nativeType == GL_INT)
5750 {
5751 getIntegervImpl(pname, params);
5752 }
5753 else
5754 {
5755 CastStateValues(this, nativeType, pname, numParams, params);
5756 }
5757}
5758
Brandon Jones59770802018-04-02 13:18:42 -07005759void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5760{
5761 getIntegerv(pname, data);
5762}
5763
Jamie Madillc1d770e2017-04-13 17:31:24 -04005764void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5765{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005766 // Don't resolve link if checking the link completion status.
5767 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5768 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005769 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005770 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005771}
5772
Brandon Jones59770802018-04-02 13:18:42 -07005773void Context::getProgramivRobust(GLuint program,
5774 GLenum pname,
5775 GLsizei bufSize,
5776 GLsizei *length,
5777 GLint *params)
5778{
5779 getProgramiv(program, pname, params);
5780}
5781
Jiajia Qin5451d532017-11-16 17:16:34 +08005782void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5783{
5784 UNIMPLEMENTED();
5785}
5786
Jamie Madillbe849e42017-05-02 15:49:00 -04005787void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005788{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005789 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005790 ASSERT(programObject);
5791 programObject->getInfoLog(bufsize, length, infolog);
5792}
5793
Jiajia Qin5451d532017-11-16 17:16:34 +08005794void Context::getProgramPipelineInfoLog(GLuint pipeline,
5795 GLsizei bufSize,
5796 GLsizei *length,
5797 GLchar *infoLog)
5798{
5799 UNIMPLEMENTED();
5800}
5801
Jamie Madillc1d770e2017-04-13 17:31:24 -04005802void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5803{
5804 Shader *shaderObject = getShader(shader);
5805 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005806 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005807}
5808
Brandon Jones59770802018-04-02 13:18:42 -07005809void Context::getShaderivRobust(GLuint shader,
5810 GLenum pname,
5811 GLsizei bufSize,
5812 GLsizei *length,
5813 GLint *params)
5814{
5815 getShaderiv(shader, pname, params);
5816}
5817
Jamie Madillc1d770e2017-04-13 17:31:24 -04005818void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5819{
5820 Shader *shaderObject = getShader(shader);
5821 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005822 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005823}
5824
5825void Context::getShaderPrecisionFormat(GLenum shadertype,
5826 GLenum precisiontype,
5827 GLint *range,
5828 GLint *precision)
5829{
5830 // TODO(jmadill): Compute shaders.
5831
5832 switch (shadertype)
5833 {
5834 case GL_VERTEX_SHADER:
5835 switch (precisiontype)
5836 {
5837 case GL_LOW_FLOAT:
5838 mCaps.vertexLowpFloat.get(range, precision);
5839 break;
5840 case GL_MEDIUM_FLOAT:
5841 mCaps.vertexMediumpFloat.get(range, precision);
5842 break;
5843 case GL_HIGH_FLOAT:
5844 mCaps.vertexHighpFloat.get(range, precision);
5845 break;
5846
5847 case GL_LOW_INT:
5848 mCaps.vertexLowpInt.get(range, precision);
5849 break;
5850 case GL_MEDIUM_INT:
5851 mCaps.vertexMediumpInt.get(range, precision);
5852 break;
5853 case GL_HIGH_INT:
5854 mCaps.vertexHighpInt.get(range, precision);
5855 break;
5856
5857 default:
5858 UNREACHABLE();
5859 return;
5860 }
5861 break;
5862
5863 case GL_FRAGMENT_SHADER:
5864 switch (precisiontype)
5865 {
5866 case GL_LOW_FLOAT:
5867 mCaps.fragmentLowpFloat.get(range, precision);
5868 break;
5869 case GL_MEDIUM_FLOAT:
5870 mCaps.fragmentMediumpFloat.get(range, precision);
5871 break;
5872 case GL_HIGH_FLOAT:
5873 mCaps.fragmentHighpFloat.get(range, precision);
5874 break;
5875
5876 case GL_LOW_INT:
5877 mCaps.fragmentLowpInt.get(range, precision);
5878 break;
5879 case GL_MEDIUM_INT:
5880 mCaps.fragmentMediumpInt.get(range, precision);
5881 break;
5882 case GL_HIGH_INT:
5883 mCaps.fragmentHighpInt.get(range, precision);
5884 break;
5885
5886 default:
5887 UNREACHABLE();
5888 return;
5889 }
5890 break;
5891
5892 default:
5893 UNREACHABLE();
5894 return;
5895 }
5896}
5897
5898void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5899{
5900 Shader *shaderObject = getShader(shader);
5901 ASSERT(shaderObject);
5902 shaderObject->getSource(bufsize, length, source);
5903}
5904
5905void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5906{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005907 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005908 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005909 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005910}
5911
Brandon Jones59770802018-04-02 13:18:42 -07005912void Context::getUniformfvRobust(GLuint program,
5913 GLint location,
5914 GLsizei bufSize,
5915 GLsizei *length,
5916 GLfloat *params)
5917{
5918 getUniformfv(program, location, params);
5919}
5920
Jamie Madillc1d770e2017-04-13 17:31:24 -04005921void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5922{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005923 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005924 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005925 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005926}
5927
Brandon Jones59770802018-04-02 13:18:42 -07005928void Context::getUniformivRobust(GLuint program,
5929 GLint location,
5930 GLsizei bufSize,
5931 GLsizei *length,
5932 GLint *params)
5933{
5934 getUniformiv(program, location, params);
5935}
5936
Jamie Madillc1d770e2017-04-13 17:31:24 -04005937GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5938{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005939 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005940 ASSERT(programObject);
5941 return programObject->getUniformLocation(name);
5942}
5943
5944GLboolean Context::isBuffer(GLuint buffer)
5945{
5946 if (buffer == 0)
5947 {
5948 return GL_FALSE;
5949 }
5950
5951 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5952}
5953
5954GLboolean Context::isEnabled(GLenum cap)
5955{
5956 return mGLState.getEnableFeature(cap);
5957}
5958
5959GLboolean Context::isFramebuffer(GLuint framebuffer)
5960{
5961 if (framebuffer == 0)
5962 {
5963 return GL_FALSE;
5964 }
5965
5966 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5967}
5968
5969GLboolean Context::isProgram(GLuint program)
5970{
5971 if (program == 0)
5972 {
5973 return GL_FALSE;
5974 }
5975
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005976 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005977}
5978
5979GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5980{
5981 if (renderbuffer == 0)
5982 {
5983 return GL_FALSE;
5984 }
5985
5986 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5987}
5988
5989GLboolean Context::isShader(GLuint shader)
5990{
5991 if (shader == 0)
5992 {
5993 return GL_FALSE;
5994 }
5995
5996 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5997}
5998
5999GLboolean Context::isTexture(GLuint texture)
6000{
6001 if (texture == 0)
6002 {
6003 return GL_FALSE;
6004 }
6005
6006 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
6007}
6008
6009void Context::linkProgram(GLuint program)
6010{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006011 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006012 ASSERT(programObject);
6013 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08006014
6015 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
6016 // don't need to worry that:
6017 // 1. Draw calls after link use the new executable code or the old one depending on the link
6018 // result.
6019 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
6020 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
6021 // ProgramD3D.
6022 if (programObject->isInUse())
6023 {
Jamie Madill785e8a02018-10-04 17:42:00 -04006024 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04006025 if (programObject->isLinked())
6026 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006027 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006028 }
jchen107ae70d82018-07-06 13:47:01 +08006029 mStateCache.onProgramExecutableChange(this);
6030 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006031}
6032
6033void Context::releaseShaderCompiler()
6034{
Jamie Madill4928b7c2017-06-20 12:57:39 -04006035 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006036}
6037
6038void Context::shaderBinary(GLsizei n,
6039 const GLuint *shaders,
6040 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04006041 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04006042 GLsizei length)
6043{
6044 // No binary shader formats are supported.
6045 UNIMPLEMENTED();
6046}
6047
Olli Etuaho0ca09752018-09-24 11:00:50 +03006048void Context::bindFragDataLocationIndexed(GLuint program,
6049 GLuint colorNumber,
6050 GLuint index,
6051 const char *name)
6052{
6053 Program *programObject = getProgramNoResolveLink(program);
6054 programObject->bindFragmentOutputLocation(colorNumber, name);
6055 programObject->bindFragmentOutputIndex(index, name);
6056}
6057
6058void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
6059{
6060 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
6061}
6062
6063int Context::getFragDataIndex(GLuint program, const char *name)
6064{
6065 Program *programObject = getProgramResolveLink(program);
6066 return programObject->getFragDataIndex(name);
6067}
6068
6069int Context::getProgramResourceLocationIndex(GLuint program,
6070 GLenum programInterface,
6071 const char *name)
6072{
6073 Program *programObject = getProgramResolveLink(program);
6074 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
6075 return programObject->getFragDataIndex(name);
6076}
6077
Jamie Madillc1d770e2017-04-13 17:31:24 -04006078void Context::shaderSource(GLuint shader,
6079 GLsizei count,
6080 const GLchar *const *string,
6081 const GLint *length)
6082{
6083 Shader *shaderObject = getShader(shader);
6084 ASSERT(shaderObject);
6085 shaderObject->setSource(count, string, length);
6086}
6087
6088void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
6089{
6090 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
6091}
6092
6093void Context::stencilMask(GLuint mask)
6094{
6095 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
6096}
6097
6098void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
6099{
6100 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
6101}
6102
6103void Context::uniform1f(GLint location, GLfloat x)
6104{
6105 Program *program = mGLState.getProgram();
6106 program->setUniform1fv(location, 1, &x);
6107}
6108
6109void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
6110{
6111 Program *program = mGLState.getProgram();
6112 program->setUniform1fv(location, count, v);
6113}
6114
Jamie Madill7e4eff12018-08-08 15:49:26 -04006115void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006116{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006117 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04006118 {
6119 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006120 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04006121 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006122}
6123
Jamie Madill7e4eff12018-08-08 15:49:26 -04006124void Context::uniform1i(GLint location, GLint x)
6125{
6126 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
6127}
6128
Jamie Madillc1d770e2017-04-13 17:31:24 -04006129void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
6130{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006131 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006132}
6133
6134void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
6135{
6136 GLfloat xy[2] = {x, y};
6137 Program *program = mGLState.getProgram();
6138 program->setUniform2fv(location, 1, xy);
6139}
6140
6141void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
6142{
6143 Program *program = mGLState.getProgram();
6144 program->setUniform2fv(location, count, v);
6145}
6146
6147void Context::uniform2i(GLint location, GLint x, GLint y)
6148{
6149 GLint xy[2] = {x, y};
6150 Program *program = mGLState.getProgram();
6151 program->setUniform2iv(location, 1, xy);
6152}
6153
6154void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6155{
6156 Program *program = mGLState.getProgram();
6157 program->setUniform2iv(location, count, v);
6158}
6159
6160void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6161{
6162 GLfloat xyz[3] = {x, y, z};
6163 Program *program = mGLState.getProgram();
6164 program->setUniform3fv(location, 1, xyz);
6165}
6166
6167void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6168{
6169 Program *program = mGLState.getProgram();
6170 program->setUniform3fv(location, count, v);
6171}
6172
6173void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6174{
6175 GLint xyz[3] = {x, y, z};
6176 Program *program = mGLState.getProgram();
6177 program->setUniform3iv(location, 1, xyz);
6178}
6179
6180void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6181{
6182 Program *program = mGLState.getProgram();
6183 program->setUniform3iv(location, count, v);
6184}
6185
6186void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6187{
6188 GLfloat xyzw[4] = {x, y, z, w};
6189 Program *program = mGLState.getProgram();
6190 program->setUniform4fv(location, 1, xyzw);
6191}
6192
6193void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6194{
6195 Program *program = mGLState.getProgram();
6196 program->setUniform4fv(location, count, v);
6197}
6198
6199void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6200{
6201 GLint xyzw[4] = {x, y, z, w};
6202 Program *program = mGLState.getProgram();
6203 program->setUniform4iv(location, 1, xyzw);
6204}
6205
6206void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6207{
6208 Program *program = mGLState.getProgram();
6209 program->setUniform4iv(location, count, v);
6210}
6211
6212void Context::uniformMatrix2fv(GLint location,
6213 GLsizei count,
6214 GLboolean transpose,
6215 const GLfloat *value)
6216{
6217 Program *program = mGLState.getProgram();
6218 program->setUniformMatrix2fv(location, count, transpose, value);
6219}
6220
6221void Context::uniformMatrix3fv(GLint location,
6222 GLsizei count,
6223 GLboolean transpose,
6224 const GLfloat *value)
6225{
6226 Program *program = mGLState.getProgram();
6227 program->setUniformMatrix3fv(location, count, transpose, value);
6228}
6229
6230void Context::uniformMatrix4fv(GLint location,
6231 GLsizei count,
6232 GLboolean transpose,
6233 const GLfloat *value)
6234{
6235 Program *program = mGLState.getProgram();
6236 program->setUniformMatrix4fv(location, count, transpose, value);
6237}
6238
6239void Context::validateProgram(GLuint program)
6240{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006241 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006242 ASSERT(programObject);
6243 programObject->validate(mCaps);
6244}
6245
Jiajia Qin5451d532017-11-16 17:16:34 +08006246void Context::validateProgramPipeline(GLuint pipeline)
6247{
6248 UNIMPLEMENTED();
6249}
6250
Jamie Madilld04908b2017-06-09 14:15:35 -04006251void Context::getProgramBinary(GLuint program,
6252 GLsizei bufSize,
6253 GLsizei *length,
6254 GLenum *binaryFormat,
6255 void *binary)
6256{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006257 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006258 ASSERT(programObject != nullptr);
6259
6260 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6261}
6262
6263void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6264{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006265 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006266 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006267
Jamie Madilld04908b2017-06-09 14:15:35 -04006268 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006269 if (programObject->isInUse())
6270 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006271 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006272 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006273 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006274}
6275
Jamie Madillff325f12017-08-26 15:06:05 -04006276void Context::uniform1ui(GLint location, GLuint v0)
6277{
6278 Program *program = mGLState.getProgram();
6279 program->setUniform1uiv(location, 1, &v0);
6280}
6281
6282void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6283{
6284 Program *program = mGLState.getProgram();
6285 const GLuint xy[] = {v0, v1};
6286 program->setUniform2uiv(location, 1, xy);
6287}
6288
6289void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6290{
6291 Program *program = mGLState.getProgram();
6292 const GLuint xyz[] = {v0, v1, v2};
6293 program->setUniform3uiv(location, 1, xyz);
6294}
6295
6296void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6297{
6298 Program *program = mGLState.getProgram();
6299 const GLuint xyzw[] = {v0, v1, v2, v3};
6300 program->setUniform4uiv(location, 1, xyzw);
6301}
6302
6303void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6304{
6305 Program *program = mGLState.getProgram();
6306 program->setUniform1uiv(location, count, value);
6307}
6308void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6309{
6310 Program *program = mGLState.getProgram();
6311 program->setUniform2uiv(location, count, value);
6312}
6313
6314void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6315{
6316 Program *program = mGLState.getProgram();
6317 program->setUniform3uiv(location, count, value);
6318}
6319
6320void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6321{
6322 Program *program = mGLState.getProgram();
6323 program->setUniform4uiv(location, count, value);
6324}
6325
Jamie Madillf0e04492017-08-26 15:28:42 -04006326void Context::genQueries(GLsizei n, GLuint *ids)
6327{
6328 for (GLsizei i = 0; i < n; i++)
6329 {
6330 GLuint handle = mQueryHandleAllocator.allocate();
6331 mQueryMap.assign(handle, nullptr);
6332 ids[i] = handle;
6333 }
6334}
6335
6336void Context::deleteQueries(GLsizei n, const GLuint *ids)
6337{
6338 for (int i = 0; i < n; i++)
6339 {
6340 GLuint query = ids[i];
6341
6342 Query *queryObject = nullptr;
6343 if (mQueryMap.erase(query, &queryObject))
6344 {
6345 mQueryHandleAllocator.release(query);
6346 if (queryObject)
6347 {
6348 queryObject->release(this);
6349 }
6350 }
6351 }
6352}
6353
6354GLboolean Context::isQuery(GLuint id)
6355{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006356 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006357}
6358
Jamie Madillc8c95812017-08-26 18:40:09 -04006359void Context::uniformMatrix2x3fv(GLint location,
6360 GLsizei count,
6361 GLboolean transpose,
6362 const GLfloat *value)
6363{
6364 Program *program = mGLState.getProgram();
6365 program->setUniformMatrix2x3fv(location, count, transpose, value);
6366}
6367
6368void Context::uniformMatrix3x2fv(GLint location,
6369 GLsizei count,
6370 GLboolean transpose,
6371 const GLfloat *value)
6372{
6373 Program *program = mGLState.getProgram();
6374 program->setUniformMatrix3x2fv(location, count, transpose, value);
6375}
6376
6377void Context::uniformMatrix2x4fv(GLint location,
6378 GLsizei count,
6379 GLboolean transpose,
6380 const GLfloat *value)
6381{
6382 Program *program = mGLState.getProgram();
6383 program->setUniformMatrix2x4fv(location, count, transpose, value);
6384}
6385
6386void Context::uniformMatrix4x2fv(GLint location,
6387 GLsizei count,
6388 GLboolean transpose,
6389 const GLfloat *value)
6390{
6391 Program *program = mGLState.getProgram();
6392 program->setUniformMatrix4x2fv(location, count, transpose, value);
6393}
6394
6395void Context::uniformMatrix3x4fv(GLint location,
6396 GLsizei count,
6397 GLboolean transpose,
6398 const GLfloat *value)
6399{
6400 Program *program = mGLState.getProgram();
6401 program->setUniformMatrix3x4fv(location, count, transpose, value);
6402}
6403
6404void Context::uniformMatrix4x3fv(GLint location,
6405 GLsizei count,
6406 GLboolean transpose,
6407 const GLfloat *value)
6408{
6409 Program *program = mGLState.getProgram();
6410 program->setUniformMatrix4x3fv(location, count, transpose, value);
6411}
6412
Jamie Madilld7576732017-08-26 18:49:50 -04006413void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6414{
6415 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6416 {
6417 GLuint vertexArray = arrays[arrayIndex];
6418
6419 if (arrays[arrayIndex] != 0)
6420 {
6421 VertexArray *vertexArrayObject = nullptr;
6422 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6423 {
6424 if (vertexArrayObject != nullptr)
6425 {
6426 detachVertexArray(vertexArray);
6427 vertexArrayObject->onDestroy(this);
6428 }
6429
6430 mVertexArrayHandleAllocator.release(vertexArray);
6431 }
6432 }
6433 }
6434}
6435
6436void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6437{
6438 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6439 {
6440 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6441 mVertexArrayMap.assign(vertexArray, nullptr);
6442 arrays[arrayIndex] = vertexArray;
6443 }
6444}
6445
6446bool Context::isVertexArray(GLuint array)
6447{
6448 if (array == 0)
6449 {
6450 return GL_FALSE;
6451 }
6452
6453 VertexArray *vao = getVertexArray(array);
6454 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6455}
6456
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006457void Context::endTransformFeedback()
6458{
6459 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6460 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006461 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006462}
6463
6464void Context::transformFeedbackVaryings(GLuint program,
6465 GLsizei count,
6466 const GLchar *const *varyings,
6467 GLenum bufferMode)
6468{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006469 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006470 ASSERT(programObject);
6471 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6472}
6473
6474void Context::getTransformFeedbackVarying(GLuint program,
6475 GLuint index,
6476 GLsizei bufSize,
6477 GLsizei *length,
6478 GLsizei *size,
6479 GLenum *type,
6480 GLchar *name)
6481{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006482 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006483 ASSERT(programObject);
6484 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6485}
6486
6487void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6488{
6489 for (int i = 0; i < n; i++)
6490 {
6491 GLuint transformFeedback = ids[i];
6492 if (transformFeedback == 0)
6493 {
6494 continue;
6495 }
6496
6497 TransformFeedback *transformFeedbackObject = nullptr;
6498 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6499 {
6500 if (transformFeedbackObject != nullptr)
6501 {
6502 detachTransformFeedback(transformFeedback);
6503 transformFeedbackObject->release(this);
6504 }
6505
6506 mTransformFeedbackHandleAllocator.release(transformFeedback);
6507 }
6508 }
6509}
6510
6511void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6512{
6513 for (int i = 0; i < n; i++)
6514 {
6515 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6516 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6517 ids[i] = transformFeedback;
6518 }
6519}
6520
6521bool Context::isTransformFeedback(GLuint id)
6522{
6523 if (id == 0)
6524 {
6525 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6526 // returns FALSE
6527 return GL_FALSE;
6528 }
6529
6530 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6531 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6532}
6533
6534void Context::pauseTransformFeedback()
6535{
6536 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6537 transformFeedback->pause();
6538}
6539
6540void Context::resumeTransformFeedback()
6541{
6542 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6543 transformFeedback->resume();
6544}
6545
Jamie Madill12e957f2017-08-26 21:42:26 -04006546void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6547{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006548 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006549 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006550}
6551
Brandon Jones59770802018-04-02 13:18:42 -07006552void Context::getUniformuivRobust(GLuint program,
6553 GLint location,
6554 GLsizei bufSize,
6555 GLsizei *length,
6556 GLuint *params)
6557{
6558 getUniformuiv(program, location, params);
6559}
6560
Jamie Madill12e957f2017-08-26 21:42:26 -04006561GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6562{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006563 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006564 return programObject->getFragDataLocation(name);
6565}
6566
6567void Context::getUniformIndices(GLuint program,
6568 GLsizei uniformCount,
6569 const GLchar *const *uniformNames,
6570 GLuint *uniformIndices)
6571{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006572 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006573 if (!programObject->isLinked())
6574 {
6575 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6576 {
6577 uniformIndices[uniformId] = GL_INVALID_INDEX;
6578 }
6579 }
6580 else
6581 {
6582 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6583 {
6584 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6585 }
6586 }
6587}
6588
6589void Context::getActiveUniformsiv(GLuint program,
6590 GLsizei uniformCount,
6591 const GLuint *uniformIndices,
6592 GLenum pname,
6593 GLint *params)
6594{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006595 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006596 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6597 {
6598 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006599 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006600 }
6601}
6602
6603GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6604{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006605 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006606 return programObject->getUniformBlockIndex(uniformBlockName);
6607}
6608
6609void Context::getActiveUniformBlockiv(GLuint program,
6610 GLuint uniformBlockIndex,
6611 GLenum pname,
6612 GLint *params)
6613{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006614 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006615 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6616}
6617
Brandon Jones59770802018-04-02 13:18:42 -07006618void Context::getActiveUniformBlockivRobust(GLuint program,
6619 GLuint uniformBlockIndex,
6620 GLenum pname,
6621 GLsizei bufSize,
6622 GLsizei *length,
6623 GLint *params)
6624{
6625 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6626}
6627
Jamie Madill12e957f2017-08-26 21:42:26 -04006628void Context::getActiveUniformBlockName(GLuint program,
6629 GLuint uniformBlockIndex,
6630 GLsizei bufSize,
6631 GLsizei *length,
6632 GLchar *uniformBlockName)
6633{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006634 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006635 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6636}
6637
6638void Context::uniformBlockBinding(GLuint program,
6639 GLuint uniformBlockIndex,
6640 GLuint uniformBlockBinding)
6641{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006642 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006643 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006644
Jamie Madill956ab4d2018-10-10 16:13:03 -04006645 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006646 if (programObject->isInUse())
6647 {
6648 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006649 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006650 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006651}
6652
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006653GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6654{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006655 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6656 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006657
Jamie Madill70b5bb02017-08-28 13:32:37 -04006658 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006659 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006660 if (error.isError())
6661 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006662 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006663 handleError(error);
6664 return nullptr;
6665 }
6666
Jamie Madill70b5bb02017-08-28 13:32:37 -04006667 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006668}
6669
6670GLboolean Context::isSync(GLsync sync)
6671{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006672 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006673}
6674
6675GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6676{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006677 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006678
6679 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006680 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006681 return result;
6682}
6683
6684void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6685{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006686 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006687 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006688}
6689
6690void Context::getInteger64v(GLenum pname, GLint64 *params)
6691{
6692 GLenum nativeType = GL_NONE;
6693 unsigned int numParams = 0;
6694 getQueryParameterInfo(pname, &nativeType, &numParams);
6695
6696 if (nativeType == GL_INT_64_ANGLEX)
6697 {
6698 getInteger64vImpl(pname, params);
6699 }
6700 else
6701 {
6702 CastStateValues(this, nativeType, pname, numParams, params);
6703 }
6704}
6705
Brandon Jones59770802018-04-02 13:18:42 -07006706void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6707{
6708 getInteger64v(pname, data);
6709}
6710
Corentin Wallez336129f2017-10-17 15:55:40 -04006711void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006712{
6713 Buffer *buffer = mGLState.getTargetBuffer(target);
6714 QueryBufferParameteri64v(buffer, pname, params);
6715}
6716
Brandon Jones59770802018-04-02 13:18:42 -07006717void Context::getBufferParameteri64vRobust(BufferBinding target,
6718 GLenum pname,
6719 GLsizei bufSize,
6720 GLsizei *length,
6721 GLint64 *params)
6722{
6723 getBufferParameteri64v(target, pname, params);
6724}
6725
Jamie Madill3ef140a2017-08-26 23:11:21 -04006726void Context::genSamplers(GLsizei count, GLuint *samplers)
6727{
6728 for (int i = 0; i < count; i++)
6729 {
6730 samplers[i] = mState.mSamplers->createSampler();
6731 }
6732}
6733
6734void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6735{
6736 for (int i = 0; i < count; i++)
6737 {
6738 GLuint sampler = samplers[i];
6739
6740 if (mState.mSamplers->getSampler(sampler))
6741 {
6742 detachSampler(sampler);
6743 }
6744
6745 mState.mSamplers->deleteObject(this, sampler);
6746 }
6747}
6748
6749void Context::getInternalformativ(GLenum target,
6750 GLenum internalformat,
6751 GLenum pname,
6752 GLsizei bufSize,
6753 GLint *params)
6754{
6755 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6756 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6757}
6758
Brandon Jones59770802018-04-02 13:18:42 -07006759void Context::getInternalformativRobust(GLenum target,
6760 GLenum internalformat,
6761 GLenum pname,
6762 GLsizei bufSize,
6763 GLsizei *length,
6764 GLint *params)
6765{
6766 getInternalformativ(target, internalformat, pname, bufSize, params);
6767}
6768
Jiajia Qin5451d532017-11-16 17:16:34 +08006769void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6770{
6771 programUniform1iv(program, location, 1, &v0);
6772}
6773
6774void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6775{
6776 GLint xy[2] = {v0, v1};
6777 programUniform2iv(program, location, 1, xy);
6778}
6779
6780void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6781{
6782 GLint xyz[3] = {v0, v1, v2};
6783 programUniform3iv(program, location, 1, xyz);
6784}
6785
6786void Context::programUniform4i(GLuint program,
6787 GLint location,
6788 GLint v0,
6789 GLint v1,
6790 GLint v2,
6791 GLint v3)
6792{
6793 GLint xyzw[4] = {v0, v1, v2, v3};
6794 programUniform4iv(program, location, 1, xyzw);
6795}
6796
6797void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6798{
6799 programUniform1uiv(program, location, 1, &v0);
6800}
6801
6802void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6803{
6804 GLuint xy[2] = {v0, v1};
6805 programUniform2uiv(program, location, 1, xy);
6806}
6807
6808void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6809{
6810 GLuint xyz[3] = {v0, v1, v2};
6811 programUniform3uiv(program, location, 1, xyz);
6812}
6813
6814void Context::programUniform4ui(GLuint program,
6815 GLint location,
6816 GLuint v0,
6817 GLuint v1,
6818 GLuint v2,
6819 GLuint v3)
6820{
6821 GLuint xyzw[4] = {v0, v1, v2, v3};
6822 programUniform4uiv(program, location, 1, xyzw);
6823}
6824
6825void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6826{
6827 programUniform1fv(program, location, 1, &v0);
6828}
6829
6830void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6831{
6832 GLfloat xy[2] = {v0, v1};
6833 programUniform2fv(program, location, 1, xy);
6834}
6835
6836void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6837{
6838 GLfloat xyz[3] = {v0, v1, v2};
6839 programUniform3fv(program, location, 1, xyz);
6840}
6841
6842void Context::programUniform4f(GLuint program,
6843 GLint location,
6844 GLfloat v0,
6845 GLfloat v1,
6846 GLfloat v2,
6847 GLfloat v3)
6848{
6849 GLfloat xyzw[4] = {v0, v1, v2, v3};
6850 programUniform4fv(program, location, 1, xyzw);
6851}
6852
Jamie Madill81c2e252017-09-09 23:32:46 -04006853void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6854{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006855 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006856 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006857 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006858}
6859
Jiajia Qin5451d532017-11-16 17:16:34 +08006860void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6861{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006862 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006863 ASSERT(programObject);
6864 programObject->setUniform2iv(location, count, value);
6865}
6866
6867void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6868{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006869 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006870 ASSERT(programObject);
6871 programObject->setUniform3iv(location, count, value);
6872}
6873
6874void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6875{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006876 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006877 ASSERT(programObject);
6878 programObject->setUniform4iv(location, count, value);
6879}
6880
6881void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6882{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006883 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006884 ASSERT(programObject);
6885 programObject->setUniform1uiv(location, count, value);
6886}
6887
6888void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6889{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006890 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006891 ASSERT(programObject);
6892 programObject->setUniform2uiv(location, count, value);
6893}
6894
6895void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6896{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006897 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006898 ASSERT(programObject);
6899 programObject->setUniform3uiv(location, count, value);
6900}
6901
6902void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6903{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006904 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006905 ASSERT(programObject);
6906 programObject->setUniform4uiv(location, count, value);
6907}
6908
6909void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6910{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006911 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006912 ASSERT(programObject);
6913 programObject->setUniform1fv(location, count, value);
6914}
6915
6916void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6917{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006918 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006919 ASSERT(programObject);
6920 programObject->setUniform2fv(location, count, value);
6921}
6922
6923void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6924{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006925 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006926 ASSERT(programObject);
6927 programObject->setUniform3fv(location, count, value);
6928}
6929
6930void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6931{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006932 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006933 ASSERT(programObject);
6934 programObject->setUniform4fv(location, count, value);
6935}
6936
6937void Context::programUniformMatrix2fv(GLuint program,
6938 GLint location,
6939 GLsizei count,
6940 GLboolean transpose,
6941 const GLfloat *value)
6942{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006943 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006944 ASSERT(programObject);
6945 programObject->setUniformMatrix2fv(location, count, transpose, value);
6946}
6947
6948void Context::programUniformMatrix3fv(GLuint program,
6949 GLint location,
6950 GLsizei count,
6951 GLboolean transpose,
6952 const GLfloat *value)
6953{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006954 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006955 ASSERT(programObject);
6956 programObject->setUniformMatrix3fv(location, count, transpose, value);
6957}
6958
6959void Context::programUniformMatrix4fv(GLuint program,
6960 GLint location,
6961 GLsizei count,
6962 GLboolean transpose,
6963 const GLfloat *value)
6964{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006965 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006966 ASSERT(programObject);
6967 programObject->setUniformMatrix4fv(location, count, transpose, value);
6968}
6969
6970void Context::programUniformMatrix2x3fv(GLuint program,
6971 GLint location,
6972 GLsizei count,
6973 GLboolean transpose,
6974 const GLfloat *value)
6975{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006976 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006977 ASSERT(programObject);
6978 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6979}
6980
6981void Context::programUniformMatrix3x2fv(GLuint program,
6982 GLint location,
6983 GLsizei count,
6984 GLboolean transpose,
6985 const GLfloat *value)
6986{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006987 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006988 ASSERT(programObject);
6989 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6990}
6991
6992void Context::programUniformMatrix2x4fv(GLuint program,
6993 GLint location,
6994 GLsizei count,
6995 GLboolean transpose,
6996 const GLfloat *value)
6997{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006998 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006999 ASSERT(programObject);
7000 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
7001}
7002
7003void Context::programUniformMatrix4x2fv(GLuint program,
7004 GLint location,
7005 GLsizei count,
7006 GLboolean transpose,
7007 const GLfloat *value)
7008{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007009 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007010 ASSERT(programObject);
7011 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
7012}
7013
7014void Context::programUniformMatrix3x4fv(GLuint program,
7015 GLint location,
7016 GLsizei count,
7017 GLboolean transpose,
7018 const GLfloat *value)
7019{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007020 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007021 ASSERT(programObject);
7022 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
7023}
7024
7025void Context::programUniformMatrix4x3fv(GLuint program,
7026 GLint location,
7027 GLsizei count,
7028 GLboolean transpose,
7029 const GLfloat *value)
7030{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007031 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007032 ASSERT(programObject);
7033 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
7034}
7035
Jamie Madill81c2e252017-09-09 23:32:46 -04007036void Context::onTextureChange(const Texture *texture)
7037{
7038 // Conservatively assume all textures are dirty.
7039 // TODO(jmadill): More fine-grained update.
7040 mGLState.setObjectDirty(GL_TEXTURE);
7041}
7042
James Darpiniane8a93c62018-01-04 18:02:24 -08007043bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
7044{
7045 return mGLState.isCurrentTransformFeedback(tf);
7046}
James Darpiniane8a93c62018-01-04 18:02:24 -08007047
Yunchao Hea336b902017-08-02 16:05:21 +08007048void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
7049{
7050 for (int i = 0; i < count; i++)
7051 {
7052 pipelines[i] = createProgramPipeline();
7053 }
7054}
7055
7056void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
7057{
7058 for (int i = 0; i < count; i++)
7059 {
7060 if (pipelines[i] != 0)
7061 {
7062 deleteProgramPipeline(pipelines[i]);
7063 }
7064 }
7065}
7066
7067GLboolean Context::isProgramPipeline(GLuint pipeline)
7068{
7069 if (pipeline == 0)
7070 {
7071 return GL_FALSE;
7072 }
7073
7074 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
7075}
7076
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007077void Context::finishFenceNV(GLuint fence)
7078{
7079 FenceNV *fenceObject = getFenceNV(fence);
7080
7081 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04007082 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007083}
7084
7085void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
7086{
7087 FenceNV *fenceObject = getFenceNV(fence);
7088
7089 ASSERT(fenceObject && fenceObject->isSet());
7090
7091 switch (pname)
7092 {
7093 case GL_FENCE_STATUS_NV:
7094 {
7095 // GL_NV_fence spec:
7096 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
7097 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
7098 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
7099 GLboolean status = GL_TRUE;
7100 if (fenceObject->getStatus() != GL_TRUE)
7101 {
Jamie Madilla0691b72018-07-25 10:41:22 -04007102 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007103 }
7104 *params = status;
7105 break;
7106 }
7107
7108 case GL_FENCE_CONDITION_NV:
7109 {
7110 *params = static_cast<GLint>(fenceObject->getCondition());
7111 break;
7112 }
7113
7114 default:
7115 UNREACHABLE();
7116 }
7117}
7118
7119void Context::getTranslatedShaderSource(GLuint shader,
7120 GLsizei bufsize,
7121 GLsizei *length,
7122 GLchar *source)
7123{
7124 Shader *shaderObject = getShader(shader);
7125 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08007126 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007127}
7128
7129void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
7130{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007131 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007132 ASSERT(programObject);
7133
7134 programObject->getUniformfv(this, location, params);
7135}
7136
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007137void Context::getnUniformfvRobust(GLuint program,
7138 GLint location,
7139 GLsizei bufSize,
7140 GLsizei *length,
7141 GLfloat *params)
7142{
7143 UNIMPLEMENTED();
7144}
7145
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007146void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
7147{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007148 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007149 ASSERT(programObject);
7150
7151 programObject->getUniformiv(this, location, params);
7152}
7153
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007154void Context::getnUniformivRobust(GLuint program,
7155 GLint location,
7156 GLsizei bufSize,
7157 GLsizei *length,
7158 GLint *params)
7159{
7160 UNIMPLEMENTED();
7161}
7162
7163void Context::getnUniformuivRobust(GLuint program,
7164 GLint location,
7165 GLsizei bufSize,
7166 GLsizei *length,
7167 GLuint *params)
7168{
7169 UNIMPLEMENTED();
7170}
7171
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007172GLboolean Context::isFenceNV(GLuint fence)
7173{
7174 FenceNV *fenceObject = getFenceNV(fence);
7175
7176 if (fenceObject == nullptr)
7177 {
7178 return GL_FALSE;
7179 }
7180
7181 // GL_NV_fence spec:
7182 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7183 // existing fence.
7184 return fenceObject->isSet();
7185}
7186
7187void Context::readnPixels(GLint x,
7188 GLint y,
7189 GLsizei width,
7190 GLsizei height,
7191 GLenum format,
7192 GLenum type,
7193 GLsizei bufSize,
7194 void *data)
7195{
7196 return readPixels(x, y, width, height, format, type, data);
7197}
7198
Jamie Madill007530e2017-12-28 14:27:04 -05007199void Context::setFenceNV(GLuint fence, GLenum condition)
7200{
7201 ASSERT(condition == GL_ALL_COMPLETED_NV);
7202
7203 FenceNV *fenceObject = getFenceNV(fence);
7204 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04007205 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007206}
7207
7208GLboolean Context::testFenceNV(GLuint fence)
7209{
7210 FenceNV *fenceObject = getFenceNV(fence);
7211
7212 ASSERT(fenceObject != nullptr);
7213 ASSERT(fenceObject->isSet() == GL_TRUE);
7214
7215 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007216 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007217 if (error.isError())
7218 {
7219 handleError(error);
7220 return GL_TRUE;
7221 }
7222
7223 return result;
7224}
7225
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007226void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007227{
7228 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007229 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007230 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007231}
7232
Jamie Madillfa920eb2018-01-04 11:45:50 -05007233void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007234{
7235 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007236 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007237 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7238}
7239
Jamie Madillfa920eb2018-01-04 11:45:50 -05007240void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7241{
7242 UNIMPLEMENTED();
7243}
7244
Jamie Madill5b772312018-03-08 20:28:32 -05007245bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7246{
7247 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7248 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7249 // to the fact that it is stored internally as a float, and so would require conversion
7250 // if returned from Context::getIntegerv. Since this conversion is already implemented
7251 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7252 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7253 // application.
7254 switch (pname)
7255 {
7256 case GL_COMPRESSED_TEXTURE_FORMATS:
7257 {
7258 *type = GL_INT;
7259 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7260 return true;
7261 }
7262 case GL_SHADER_BINARY_FORMATS:
7263 {
7264 *type = GL_INT;
7265 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7266 return true;
7267 }
7268
7269 case GL_MAX_VERTEX_ATTRIBS:
7270 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7271 case GL_MAX_VARYING_VECTORS:
7272 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7273 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7274 case GL_MAX_TEXTURE_IMAGE_UNITS:
7275 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7276 case GL_MAX_RENDERBUFFER_SIZE:
7277 case GL_NUM_SHADER_BINARY_FORMATS:
7278 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7279 case GL_ARRAY_BUFFER_BINDING:
7280 case GL_FRAMEBUFFER_BINDING:
7281 case GL_RENDERBUFFER_BINDING:
7282 case GL_CURRENT_PROGRAM:
7283 case GL_PACK_ALIGNMENT:
7284 case GL_UNPACK_ALIGNMENT:
7285 case GL_GENERATE_MIPMAP_HINT:
7286 case GL_RED_BITS:
7287 case GL_GREEN_BITS:
7288 case GL_BLUE_BITS:
7289 case GL_ALPHA_BITS:
7290 case GL_DEPTH_BITS:
7291 case GL_STENCIL_BITS:
7292 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7293 case GL_CULL_FACE_MODE:
7294 case GL_FRONT_FACE:
7295 case GL_ACTIVE_TEXTURE:
7296 case GL_STENCIL_FUNC:
7297 case GL_STENCIL_VALUE_MASK:
7298 case GL_STENCIL_REF:
7299 case GL_STENCIL_FAIL:
7300 case GL_STENCIL_PASS_DEPTH_FAIL:
7301 case GL_STENCIL_PASS_DEPTH_PASS:
7302 case GL_STENCIL_BACK_FUNC:
7303 case GL_STENCIL_BACK_VALUE_MASK:
7304 case GL_STENCIL_BACK_REF:
7305 case GL_STENCIL_BACK_FAIL:
7306 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7307 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7308 case GL_DEPTH_FUNC:
7309 case GL_BLEND_SRC_RGB:
7310 case GL_BLEND_SRC_ALPHA:
7311 case GL_BLEND_DST_RGB:
7312 case GL_BLEND_DST_ALPHA:
7313 case GL_BLEND_EQUATION_RGB:
7314 case GL_BLEND_EQUATION_ALPHA:
7315 case GL_STENCIL_WRITEMASK:
7316 case GL_STENCIL_BACK_WRITEMASK:
7317 case GL_STENCIL_CLEAR_VALUE:
7318 case GL_SUBPIXEL_BITS:
7319 case GL_MAX_TEXTURE_SIZE:
7320 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7321 case GL_SAMPLE_BUFFERS:
7322 case GL_SAMPLES:
7323 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7324 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7325 case GL_TEXTURE_BINDING_2D:
7326 case GL_TEXTURE_BINDING_CUBE_MAP:
7327 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7328 {
7329 *type = GL_INT;
7330 *numParams = 1;
7331 return true;
7332 }
7333 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7334 {
7335 if (!getExtensions().packReverseRowOrder)
7336 {
7337 return false;
7338 }
7339 *type = GL_INT;
7340 *numParams = 1;
7341 return true;
7342 }
7343 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7344 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7345 {
7346 if (!getExtensions().textureRectangle)
7347 {
7348 return false;
7349 }
7350 *type = GL_INT;
7351 *numParams = 1;
7352 return true;
7353 }
7354 case GL_MAX_DRAW_BUFFERS_EXT:
7355 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7356 {
7357 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7358 {
7359 return false;
7360 }
7361 *type = GL_INT;
7362 *numParams = 1;
7363 return true;
7364 }
7365 case GL_MAX_VIEWPORT_DIMS:
7366 {
7367 *type = GL_INT;
7368 *numParams = 2;
7369 return true;
7370 }
7371 case GL_VIEWPORT:
7372 case GL_SCISSOR_BOX:
7373 {
7374 *type = GL_INT;
7375 *numParams = 4;
7376 return true;
7377 }
7378 case GL_SHADER_COMPILER:
7379 case GL_SAMPLE_COVERAGE_INVERT:
7380 case GL_DEPTH_WRITEMASK:
7381 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7382 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7383 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7384 // bool-natural
7385 case GL_SAMPLE_COVERAGE:
7386 case GL_SCISSOR_TEST:
7387 case GL_STENCIL_TEST:
7388 case GL_DEPTH_TEST:
7389 case GL_BLEND:
7390 case GL_DITHER:
7391 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7392 {
7393 *type = GL_BOOL;
7394 *numParams = 1;
7395 return true;
7396 }
7397 case GL_COLOR_WRITEMASK:
7398 {
7399 *type = GL_BOOL;
7400 *numParams = 4;
7401 return true;
7402 }
7403 case GL_POLYGON_OFFSET_FACTOR:
7404 case GL_POLYGON_OFFSET_UNITS:
7405 case GL_SAMPLE_COVERAGE_VALUE:
7406 case GL_DEPTH_CLEAR_VALUE:
7407 case GL_LINE_WIDTH:
7408 {
7409 *type = GL_FLOAT;
7410 *numParams = 1;
7411 return true;
7412 }
7413 case GL_ALIASED_LINE_WIDTH_RANGE:
7414 case GL_ALIASED_POINT_SIZE_RANGE:
7415 case GL_DEPTH_RANGE:
7416 {
7417 *type = GL_FLOAT;
7418 *numParams = 2;
7419 return true;
7420 }
7421 case GL_COLOR_CLEAR_VALUE:
7422 case GL_BLEND_COLOR:
7423 {
7424 *type = GL_FLOAT;
7425 *numParams = 4;
7426 return true;
7427 }
7428 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7429 if (!getExtensions().textureFilterAnisotropic)
7430 {
7431 return false;
7432 }
7433 *type = GL_FLOAT;
7434 *numParams = 1;
7435 return true;
7436 case GL_TIMESTAMP_EXT:
7437 if (!getExtensions().disjointTimerQuery)
7438 {
7439 return false;
7440 }
7441 *type = GL_INT_64_ANGLEX;
7442 *numParams = 1;
7443 return true;
7444 case GL_GPU_DISJOINT_EXT:
7445 if (!getExtensions().disjointTimerQuery)
7446 {
7447 return false;
7448 }
7449 *type = GL_INT;
7450 *numParams = 1;
7451 return true;
7452 case GL_COVERAGE_MODULATION_CHROMIUM:
7453 if (!getExtensions().framebufferMixedSamples)
7454 {
7455 return false;
7456 }
7457 *type = GL_INT;
7458 *numParams = 1;
7459 return true;
7460 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7461 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7462 {
7463 return false;
7464 }
7465 *type = GL_INT;
7466 *numParams = 1;
7467 return true;
7468 }
7469
7470 if (getExtensions().debug)
7471 {
7472 switch (pname)
7473 {
7474 case GL_DEBUG_LOGGED_MESSAGES:
7475 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7476 case GL_DEBUG_GROUP_STACK_DEPTH:
7477 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7478 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7479 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7480 case GL_MAX_LABEL_LENGTH:
7481 *type = GL_INT;
7482 *numParams = 1;
7483 return true;
7484
7485 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7486 case GL_DEBUG_OUTPUT:
7487 *type = GL_BOOL;
7488 *numParams = 1;
7489 return true;
7490 }
7491 }
7492
7493 if (getExtensions().multisampleCompatibility)
7494 {
7495 switch (pname)
7496 {
7497 case GL_MULTISAMPLE_EXT:
7498 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7499 *type = GL_BOOL;
7500 *numParams = 1;
7501 return true;
7502 }
7503 }
7504
7505 if (getExtensions().pathRendering)
7506 {
7507 switch (pname)
7508 {
7509 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7510 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7511 *type = GL_FLOAT;
7512 *numParams = 16;
7513 return true;
7514 }
7515 }
7516
7517 if (getExtensions().bindGeneratesResource)
7518 {
7519 switch (pname)
7520 {
7521 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7522 *type = GL_BOOL;
7523 *numParams = 1;
7524 return true;
7525 }
7526 }
7527
7528 if (getExtensions().clientArrays)
7529 {
7530 switch (pname)
7531 {
7532 case GL_CLIENT_ARRAYS_ANGLE:
7533 *type = GL_BOOL;
7534 *numParams = 1;
7535 return true;
7536 }
7537 }
7538
7539 if (getExtensions().sRGBWriteControl)
7540 {
7541 switch (pname)
7542 {
7543 case GL_FRAMEBUFFER_SRGB_EXT:
7544 *type = GL_BOOL;
7545 *numParams = 1;
7546 return true;
7547 }
7548 }
7549
7550 if (getExtensions().robustResourceInitialization &&
7551 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7552 {
7553 *type = GL_BOOL;
7554 *numParams = 1;
7555 return true;
7556 }
7557
7558 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7559 {
7560 *type = GL_BOOL;
7561 *numParams = 1;
7562 return true;
7563 }
7564
jchen1082af6202018-06-22 10:59:52 +08007565 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7566 {
7567 *type = GL_INT;
7568 *numParams = 1;
7569 return true;
7570 }
7571
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007572 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7573 {
7574 *type = GL_INT;
7575 *numParams = 1;
7576 return true;
7577 }
7578
Jamie Madill5b772312018-03-08 20:28:32 -05007579 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7580 switch (pname)
7581 {
7582 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7583 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7584 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7585 {
7586 return false;
7587 }
7588 *type = GL_INT;
7589 *numParams = 1;
7590 return true;
7591
7592 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7593 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7594 {
7595 return false;
7596 }
7597 *type = GL_INT;
7598 *numParams = 1;
7599 return true;
7600
7601 case GL_PROGRAM_BINARY_FORMATS_OES:
7602 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7603 {
7604 return false;
7605 }
7606 *type = GL_INT;
7607 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7608 return true;
7609
7610 case GL_PACK_ROW_LENGTH:
7611 case GL_PACK_SKIP_ROWS:
7612 case GL_PACK_SKIP_PIXELS:
7613 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7614 {
7615 return false;
7616 }
7617 *type = GL_INT;
7618 *numParams = 1;
7619 return true;
7620 case GL_UNPACK_ROW_LENGTH:
7621 case GL_UNPACK_SKIP_ROWS:
7622 case GL_UNPACK_SKIP_PIXELS:
7623 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7624 {
7625 return false;
7626 }
7627 *type = GL_INT;
7628 *numParams = 1;
7629 return true;
7630 case GL_VERTEX_ARRAY_BINDING:
7631 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7632 {
7633 return false;
7634 }
7635 *type = GL_INT;
7636 *numParams = 1;
7637 return true;
7638 case GL_PIXEL_PACK_BUFFER_BINDING:
7639 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7640 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7641 {
7642 return false;
7643 }
7644 *type = GL_INT;
7645 *numParams = 1;
7646 return true;
7647 case GL_MAX_SAMPLES:
7648 {
7649 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7650 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7651 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7652 {
7653 return false;
7654 }
7655 *type = GL_INT;
7656 *numParams = 1;
7657 return true;
7658
7659 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7660 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7661 {
7662 return false;
7663 }
7664 *type = GL_INT;
7665 *numParams = 1;
7666 return true;
7667 }
7668 }
7669
7670 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7671 {
7672 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7673 {
7674 return false;
7675 }
7676 *type = GL_INT;
7677 *numParams = 1;
7678 return true;
7679 }
7680
7681 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7682 {
7683 *type = GL_INT;
7684 *numParams = 1;
7685 return true;
7686 }
7687
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007688 if (getClientVersion() < Version(2, 0))
7689 {
7690 switch (pname)
7691 {
7692 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007693 case GL_CLIENT_ACTIVE_TEXTURE:
7694 case GL_MATRIX_MODE:
7695 case GL_MAX_TEXTURE_UNITS:
7696 case GL_MAX_MODELVIEW_STACK_DEPTH:
7697 case GL_MAX_PROJECTION_STACK_DEPTH:
7698 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007699 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007700 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007701 case GL_VERTEX_ARRAY_STRIDE:
7702 case GL_NORMAL_ARRAY_STRIDE:
7703 case GL_COLOR_ARRAY_STRIDE:
7704 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7705 case GL_VERTEX_ARRAY_SIZE:
7706 case GL_COLOR_ARRAY_SIZE:
7707 case GL_TEXTURE_COORD_ARRAY_SIZE:
7708 case GL_VERTEX_ARRAY_TYPE:
7709 case GL_NORMAL_ARRAY_TYPE:
7710 case GL_COLOR_ARRAY_TYPE:
7711 case GL_TEXTURE_COORD_ARRAY_TYPE:
7712 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7713 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7714 case GL_COLOR_ARRAY_BUFFER_BINDING:
7715 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7716 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7717 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7718 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007719 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007720 case GL_MODELVIEW_STACK_DEPTH:
7721 case GL_PROJECTION_STACK_DEPTH:
7722 case GL_TEXTURE_STACK_DEPTH:
7723 case GL_LOGIC_OP_MODE:
7724 case GL_BLEND_SRC:
7725 case GL_BLEND_DST:
7726 case GL_PERSPECTIVE_CORRECTION_HINT:
7727 case GL_POINT_SMOOTH_HINT:
7728 case GL_LINE_SMOOTH_HINT:
7729 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007730 *type = GL_INT;
7731 *numParams = 1;
7732 return true;
7733 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007734 case GL_FOG_DENSITY:
7735 case GL_FOG_START:
7736 case GL_FOG_END:
7737 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007738 case GL_POINT_SIZE:
7739 case GL_POINT_SIZE_MIN:
7740 case GL_POINT_SIZE_MAX:
7741 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007742 *type = GL_FLOAT;
7743 *numParams = 1;
7744 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007745 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007746 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007747 *type = GL_FLOAT;
7748 *numParams = 2;
7749 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007750 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007751 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007752 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007753 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007754 *type = GL_FLOAT;
7755 *numParams = 4;
7756 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007757 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007758 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007759 *type = GL_FLOAT;
7760 *numParams = 3;
7761 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007762 case GL_MODELVIEW_MATRIX:
7763 case GL_PROJECTION_MATRIX:
7764 case GL_TEXTURE_MATRIX:
7765 *type = GL_FLOAT;
7766 *numParams = 16;
7767 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007768 case GL_LIGHT_MODEL_TWO_SIDE:
7769 *type = GL_BOOL;
7770 *numParams = 1;
7771 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007772 }
7773 }
7774
Jamie Madill5b772312018-03-08 20:28:32 -05007775 if (getClientVersion() < Version(3, 0))
7776 {
7777 return false;
7778 }
7779
7780 // Check for ES3.0+ parameter names
7781 switch (pname)
7782 {
7783 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7784 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7785 case GL_UNIFORM_BUFFER_BINDING:
7786 case GL_TRANSFORM_FEEDBACK_BINDING:
7787 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7788 case GL_COPY_READ_BUFFER_BINDING:
7789 case GL_COPY_WRITE_BUFFER_BINDING:
7790 case GL_SAMPLER_BINDING:
7791 case GL_READ_BUFFER:
7792 case GL_TEXTURE_BINDING_3D:
7793 case GL_TEXTURE_BINDING_2D_ARRAY:
7794 case GL_MAX_3D_TEXTURE_SIZE:
7795 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7796 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7797 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7798 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7799 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7800 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7801 case GL_MAX_VARYING_COMPONENTS:
7802 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7803 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7804 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7805 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7806 case GL_NUM_EXTENSIONS:
7807 case GL_MAJOR_VERSION:
7808 case GL_MINOR_VERSION:
7809 case GL_MAX_ELEMENTS_INDICES:
7810 case GL_MAX_ELEMENTS_VERTICES:
7811 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7812 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7813 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7814 case GL_UNPACK_IMAGE_HEIGHT:
7815 case GL_UNPACK_SKIP_IMAGES:
7816 {
7817 *type = GL_INT;
7818 *numParams = 1;
7819 return true;
7820 }
7821
7822 case GL_MAX_ELEMENT_INDEX:
7823 case GL_MAX_UNIFORM_BLOCK_SIZE:
7824 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7825 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7826 case GL_MAX_SERVER_WAIT_TIMEOUT:
7827 {
7828 *type = GL_INT_64_ANGLEX;
7829 *numParams = 1;
7830 return true;
7831 }
7832
7833 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7834 case GL_TRANSFORM_FEEDBACK_PAUSED:
7835 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7836 case GL_RASTERIZER_DISCARD:
7837 {
7838 *type = GL_BOOL;
7839 *numParams = 1;
7840 return true;
7841 }
7842
7843 case GL_MAX_TEXTURE_LOD_BIAS:
7844 {
7845 *type = GL_FLOAT;
7846 *numParams = 1;
7847 return true;
7848 }
7849 }
7850
7851 if (getExtensions().requestExtension)
7852 {
7853 switch (pname)
7854 {
7855 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7856 *type = GL_INT;
7857 *numParams = 1;
7858 return true;
7859 }
7860 }
7861
Yizhou Jiang7818a852018-09-06 15:02:04 +08007862 if (getExtensions().textureMultisample)
7863 {
7864 switch (pname)
7865 {
7866 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7867 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7868 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7869 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
7870 *type = GL_INT;
7871 *numParams = 1;
7872 return true;
7873 }
7874 }
7875
Jamie Madill5b772312018-03-08 20:28:32 -05007876 if (getClientVersion() < Version(3, 1))
7877 {
7878 return false;
7879 }
7880
7881 switch (pname)
7882 {
7883 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7884 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7885 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7886 case GL_MAX_FRAMEBUFFER_WIDTH:
7887 case GL_MAX_FRAMEBUFFER_HEIGHT:
7888 case GL_MAX_FRAMEBUFFER_SAMPLES:
7889 case GL_MAX_SAMPLE_MASK_WORDS:
7890 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7891 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7892 case GL_MAX_INTEGER_SAMPLES:
7893 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7894 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7895 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7896 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7897 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7898 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7899 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7900 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7901 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7902 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7903 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7904 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7905 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7906 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7907 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7908 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7909 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7910 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7911 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7912 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7913 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7914 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7915 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7916 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7917 case GL_MAX_UNIFORM_LOCATIONS:
7918 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7919 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7920 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7921 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7922 case GL_MAX_IMAGE_UNITS:
7923 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7924 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7925 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7926 case GL_SHADER_STORAGE_BUFFER_BINDING:
7927 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7928 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007929 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007930 *type = GL_INT;
7931 *numParams = 1;
7932 return true;
7933 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7934 *type = GL_INT_64_ANGLEX;
7935 *numParams = 1;
7936 return true;
7937 case GL_SAMPLE_MASK:
7938 *type = GL_BOOL;
7939 *numParams = 1;
7940 return true;
7941 }
7942
7943 if (getExtensions().geometryShader)
7944 {
7945 switch (pname)
7946 {
7947 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7948 case GL_LAYER_PROVOKING_VERTEX_EXT:
7949 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7950 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7951 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7952 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7953 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7954 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7955 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7956 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7957 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7958 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7959 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7960 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7961 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7962 *type = GL_INT;
7963 *numParams = 1;
7964 return true;
7965 }
7966 }
7967
7968 return false;
7969}
7970
7971bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7972{
7973 if (getClientVersion() < Version(3, 0))
7974 {
7975 return false;
7976 }
7977
7978 switch (target)
7979 {
7980 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7981 case GL_UNIFORM_BUFFER_BINDING:
7982 {
7983 *type = GL_INT;
7984 *numParams = 1;
7985 return true;
7986 }
7987 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7988 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7989 case GL_UNIFORM_BUFFER_START:
7990 case GL_UNIFORM_BUFFER_SIZE:
7991 {
7992 *type = GL_INT_64_ANGLEX;
7993 *numParams = 1;
7994 return true;
7995 }
7996 }
7997
7998 if (getClientVersion() < Version(3, 1))
7999 {
8000 return false;
8001 }
8002
8003 switch (target)
8004 {
8005 case GL_IMAGE_BINDING_LAYERED:
8006 {
8007 *type = GL_BOOL;
8008 *numParams = 1;
8009 return true;
8010 }
8011 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
8012 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
8013 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
8014 case GL_SHADER_STORAGE_BUFFER_BINDING:
8015 case GL_VERTEX_BINDING_BUFFER:
8016 case GL_VERTEX_BINDING_DIVISOR:
8017 case GL_VERTEX_BINDING_OFFSET:
8018 case GL_VERTEX_BINDING_STRIDE:
8019 case GL_SAMPLE_MASK_VALUE:
8020 case GL_IMAGE_BINDING_NAME:
8021 case GL_IMAGE_BINDING_LEVEL:
8022 case GL_IMAGE_BINDING_LAYER:
8023 case GL_IMAGE_BINDING_ACCESS:
8024 case GL_IMAGE_BINDING_FORMAT:
8025 {
8026 *type = GL_INT;
8027 *numParams = 1;
8028 return true;
8029 }
8030 case GL_ATOMIC_COUNTER_BUFFER_START:
8031 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
8032 case GL_SHADER_STORAGE_BUFFER_START:
8033 case GL_SHADER_STORAGE_BUFFER_SIZE:
8034 {
8035 *type = GL_INT_64_ANGLEX;
8036 *numParams = 1;
8037 return true;
8038 }
8039 }
8040
8041 return false;
8042}
8043
Jamie Madill44a6fbf2018-10-02 13:38:56 -04008044Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05008045{
8046 return mState.mShaderPrograms->getProgram(handle);
8047}
8048
8049Shader *Context::getShader(GLuint handle) const
8050{
8051 return mState.mShaderPrograms->getShader(handle);
8052}
8053
Jamie Madill5b772312018-03-08 20:28:32 -05008054bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
8055{
8056 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
8057}
8058
8059bool Context::isFramebufferGenerated(GLuint framebuffer) const
8060{
8061 return mState.mFramebuffers->isHandleGenerated(framebuffer);
8062}
8063
8064bool Context::isProgramPipelineGenerated(GLuint pipeline) const
8065{
8066 return mState.mPipelines->isHandleGenerated(pipeline);
8067}
8068
8069bool Context::usingDisplayTextureShareGroup() const
8070{
8071 return mDisplayTextureShareGroup;
8072}
8073
8074GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
8075{
8076 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
8077 internalformat == GL_DEPTH_STENCIL
8078 ? GL_DEPTH24_STENCIL8
8079 : internalformat;
8080}
8081
jchen1082af6202018-06-22 10:59:52 +08008082void Context::maxShaderCompilerThreads(GLuint count)
8083{
jchen107ae70d82018-07-06 13:47:01 +08008084 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08008085 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08008086 // A count of zero specifies a request for no parallel compiling or linking.
8087 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
8088 {
8089 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
8090 }
8091 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08008092}
8093
Jamie Madill2eb65032018-07-30 10:25:57 -04008094bool Context::isGLES1() const
8095{
8096 return mState.getClientVersion() < Version(2, 0);
8097}
8098
Jamie Madilla11819d2018-07-30 10:26:01 -04008099void Context::onSubjectStateChange(const Context *context,
8100 angle::SubjectIndex index,
8101 angle::SubjectMessage message)
8102{
Jamie Madilla11819d2018-07-30 10:26:01 -04008103 switch (index)
8104 {
8105 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008106 switch (message)
8107 {
8108 case angle::SubjectMessage::CONTENTS_CHANGED:
8109 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
8110 mStateCache.onVertexArrayBufferContentsChange(this);
8111 break;
8112 case angle::SubjectMessage::RESOURCE_MAPPED:
8113 case angle::SubjectMessage::RESOURCE_UNMAPPED:
8114 case angle::SubjectMessage::BINDING_CHANGED:
8115 mStateCache.onVertexArrayBufferStateChange(this);
8116 break;
8117 default:
8118 break;
8119 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008120 break;
8121
8122 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008123 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8124 {
8125 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
8126 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008127 break;
8128
8129 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008130 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8131 {
8132 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
8133 }
8134 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04008135 break;
8136
8137 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04008138 if (index < kTextureMaxSubjectIndex)
8139 {
8140 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04008141 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008142 }
Jamie Madille25b8002018-09-20 13:39:49 -04008143 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04008144 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04008145 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04008146 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008147 }
Jamie Madille25b8002018-09-20 13:39:49 -04008148 else
8149 {
8150 ASSERT(index < kSamplerMaxSubjectIndex);
8151 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
8152 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008153 break;
8154 }
8155}
8156
Jamie Madill6b873dd2018-07-12 23:56:30 -04008157// ErrorSet implementation.
8158ErrorSet::ErrorSet(Context *context) : mContext(context)
8159{
8160}
8161
8162ErrorSet::~ErrorSet() = default;
8163
Jamie Madill306b6c12018-07-27 08:12:49 -04008164void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04008165{
8166 // This internal enum is used to filter internal errors that are already handled.
8167 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
8168 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
8169 {
8170 return;
8171 }
8172
8173 if (ANGLE_UNLIKELY(error.isError()))
8174 {
8175 GLenum code = error.getCode();
8176 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04008177
Jamie Madill6b873dd2018-07-12 23:56:30 -04008178 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8179 {
8180 mContext->markContextLost();
8181 }
8182
8183 ASSERT(!error.getMessage().empty());
8184 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8185 error.getID(), GL_DEBUG_SEVERITY_HIGH,
8186 error.getMessage());
8187 }
8188}
8189
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008190void ErrorSet::handleError(GLenum errorCode,
8191 const char *message,
8192 const char *file,
8193 const char *function,
8194 unsigned int line)
8195{
8196 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
8197 std::stringstream errorStream;
8198 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
8199 << function << ":" << line << ". " << message;
8200
8201 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
8202}
8203
Jamie Madilla139f012018-10-10 16:13:03 -04008204void ErrorSet::validationError(GLenum errorCode, const char *message)
8205{
8206 handleError(gl::Error(errorCode, message));
8207}
8208
Jamie Madill6b873dd2018-07-12 23:56:30 -04008209bool ErrorSet::empty() const
8210{
8211 return mErrors.empty();
8212}
8213
8214GLenum ErrorSet::popError()
8215{
8216 ASSERT(!empty());
8217 GLenum error = *mErrors.begin();
8218 mErrors.erase(mErrors.begin());
8219 return error;
8220}
Jamie Madilldc358af2018-07-31 11:22:13 -04008221
8222// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008223StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008224 : mCachedHasAnyEnabledClientAttrib(false),
8225 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008226 mCachedInstancedVertexElementLimit(0),
8227 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008228{
8229}
8230
8231StateCache::~StateCache() = default;
8232
Jamie Madillac66f982018-10-09 18:30:01 -04008233void StateCache::initialize(Context *context)
8234{
8235 updateValidDrawModes(context);
8236 updateValidBindTextureTypes(context);
8237}
8238
Jamie Madilldc358af2018-07-31 11:22:13 -04008239void StateCache::updateActiveAttribsMask(Context *context)
8240{
8241 bool isGLES1 = context->isGLES1();
8242 const State &glState = context->getGLState();
8243
8244 if (!isGLES1 && !glState.getProgram())
8245 {
8246 mCachedActiveBufferedAttribsMask = AttributesMask();
8247 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008248 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008249 return;
8250 }
8251
8252 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8253 : glState.getProgram()->getActiveAttribLocationsMask();
8254
8255 const VertexArray *vao = glState.getVertexArray();
8256 ASSERT(vao);
8257
8258 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8259 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008260 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008261
Jamie Madill0a17e482018-08-31 17:19:11 -04008262 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8263 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008264 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008265 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8266}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008267
8268void StateCache::updateVertexElementLimits(Context *context)
8269{
8270 const VertexArray *vao = context->getGLState().getVertexArray();
8271
8272 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8273 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8274
8275 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8276 // If there are no buffered attributes then we should not limit the draw call count.
8277 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8278 {
8279 return;
8280 }
8281
8282 const auto &vertexAttribs = vao->getVertexAttributes();
8283 const auto &vertexBindings = vao->getVertexBindings();
8284
8285 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8286 {
8287 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8288 ASSERT(attrib.enabled);
8289
8290 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8291 ASSERT(context->isGLES1() ||
8292 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8293
8294 GLint64 limit = attrib.getCachedElementLimit();
8295 if (binding.getDivisor() > 0)
8296 {
8297 mCachedInstancedVertexElementLimit =
8298 std::min(mCachedInstancedVertexElementLimit, limit);
8299 }
8300 else
8301 {
8302 mCachedNonInstancedVertexElementLimit =
8303 std::min(mCachedNonInstancedVertexElementLimit, limit);
8304 }
8305 }
8306}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008307
Jamie Madilld84b6732018-09-06 15:54:35 -04008308void StateCache::updateBasicDrawStatesError()
8309{
8310 mCachedBasicDrawStatesError = kInvalidPointer;
8311}
8312
8313intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8314{
8315 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8316 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8317 return mCachedBasicDrawStatesError;
8318}
8319
Jamie Madillc43cdad2018-08-08 15:49:25 -04008320void StateCache::onVertexArrayBindingChange(Context *context)
8321{
8322 updateActiveAttribsMask(context);
8323 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008324 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008325}
8326
8327void StateCache::onProgramExecutableChange(Context *context)
8328{
8329 updateActiveAttribsMask(context);
8330 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008331 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008332 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008333}
8334
Jamie Madilld84b6732018-09-06 15:54:35 -04008335void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008336{
8337 updateVertexElementLimits(context);
8338}
8339
Jamie Madilld84b6732018-09-06 15:54:35 -04008340void StateCache::onVertexArrayBufferContentsChange(Context *context)
8341{
8342 updateVertexElementLimits(context);
8343 updateBasicDrawStatesError();
8344}
8345
Jamie Madillc43cdad2018-08-08 15:49:25 -04008346void StateCache::onVertexArrayStateChange(Context *context)
8347{
8348 updateActiveAttribsMask(context);
8349 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008350 updateBasicDrawStatesError();
8351}
8352
8353void StateCache::onVertexArrayBufferStateChange(Context *context)
8354{
8355 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008356}
8357
8358void StateCache::onGLES1ClientStateChange(Context *context)
8359{
8360 updateActiveAttribsMask(context);
8361}
Jamie Madilld84b6732018-09-06 15:54:35 -04008362
8363void StateCache::onDrawFramebufferChange(Context *context)
8364{
8365 updateBasicDrawStatesError();
8366}
8367
8368void StateCache::onContextCapChange(Context *context)
8369{
8370 updateBasicDrawStatesError();
8371}
8372
8373void StateCache::onStencilStateChange(Context *context)
8374{
8375 updateBasicDrawStatesError();
8376}
8377
8378void StateCache::onDefaultVertexAttributeChange(Context *context)
8379{
8380 updateBasicDrawStatesError();
8381}
8382
8383void StateCache::onActiveTextureChange(Context *context)
8384{
8385 updateBasicDrawStatesError();
8386}
8387
8388void StateCache::onQueryChange(Context *context)
8389{
8390 updateBasicDrawStatesError();
8391}
8392
8393void StateCache::onTransformFeedbackChange(Context *context)
8394{
8395 updateBasicDrawStatesError();
8396}
8397
8398void StateCache::onUniformBufferStateChange(Context *context)
8399{
8400 updateBasicDrawStatesError();
8401}
8402
8403void StateCache::onBufferBindingChange(Context *context)
8404{
8405 updateBasicDrawStatesError();
8406}
Jamie Madill526a6f62018-09-12 11:03:05 -04008407
8408void StateCache::updateValidDrawModes(Context *context)
8409{
8410 Program *program = context->getGLState().getProgram();
8411 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8412 {
8413 mCachedValidDrawModes = {{
8414 true, /* Points */
8415 true, /* Lines */
8416 true, /* LineLoop */
8417 true, /* LineStrip */
8418 true, /* Triangles */
8419 true, /* TriangleStrip */
8420 true, /* TriangleFan */
8421 false, /* LinesAdjacency */
8422 false, /* LineStripAdjacency */
8423 false, /* TrianglesAdjacency */
8424 false, /* TriangleStripAdjacency */
8425 false, /* InvalidEnum */
8426 }};
8427 }
8428 else
8429 {
8430 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8431
8432 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8433
8434 mCachedValidDrawModes = {{
8435 gsMode == PrimitiveMode::Points, /* Points */
8436 gsMode == PrimitiveMode::Lines, /* Lines */
8437 gsMode == PrimitiveMode::Lines, /* LineLoop */
8438 gsMode == PrimitiveMode::Lines, /* LineStrip */
8439 gsMode == PrimitiveMode::Triangles, /* Triangles */
8440 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8441 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8442 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8443 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8444 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8445 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8446 false, /* InvalidEnum */
8447 }};
8448 }
8449}
Jamie Madillac66f982018-10-09 18:30:01 -04008450
8451void StateCache::updateValidBindTextureTypes(Context *context)
8452{
8453 const Extensions &exts = context->getExtensions();
8454 bool isGLES3 = context->getClientMajorVersion() >= 3;
8455 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8456
8457 mCachedValidBindTextureTypes = {{
8458 true, /* _2D */
8459 isGLES3, /* _2DArray */
Yizhou Jiang7818a852018-09-06 15:02:04 +08008460 isGLES31 || exts.textureMultisample, /* _2DMultisample */
Jamie Madillac66f982018-10-09 18:30:01 -04008461 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8462 isGLES3, /* _3D */
8463 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8464 exts.textureRectangle, /* Rectangle */
8465 true, /* CubeMap */
8466 false, /* InvalidEnum */
8467
8468 }};
8469}
Jamie Madillc29968b2016-01-20 11:17:23 -05008470} // namespace gl